You are on page 1of 295

CAP: 1. NOIUNI GENERALE DESPRE BAZE DE DATE 1.1 Baz de date.

Baze de date relaionale n sensul cel mai simplu o baz de date este o colecie de nregistrri i fiiere organizate pentru un scop anume [1]. Astfel o baz de date poate fi considerat: toate numerele de telefon ale diferitelor cunotine pstrate pe un calculator personal, totalitatea datelor personale despre studenii unei universiti pstrate pe calculatorul acesteia etc. Documentele procesate care sunt organizate n ordine alfabetic pot constitui de asemenea ntr-un sens mai restrns o baz de date. Un alt tip de baze de date pot fi considerate fiierele de tip foaie de calcul organizate dup tipul ntrebuinrii. Bazele de date relaionale se refer la o colecie de date, structurate sub forma mai multor tabele ce poart numele de relaii [2]. Termenul de relaional provine din faptul c fiecare nregistrare din baza de date conine informaii referitoare la un singur subiect i numai la unul. De asemenea datele cuprinse n categorii de informaii pot fi manipulate de o singur entitate, bazat pe valori de date asociate. n legtur cu bazele de date relaionale sunt folosii mai muli termeni. Astfel o relaie (relation) conine informaii despre un singur subiect, cum ar fi clienii, comenzile, studenii sau universitile [1]. De obicei o relaie este stocat ca un tabel dintr-un sistem de gestionare a bazelor de date relaionale. Termenul atribut desemneaz o informaie specific unui subiect [2]. Astfel un atributele poate fi considerate capetele de tabel. Rndurile vor purta numele de tuple. O legtur reprezint modul cum informaiile dintr-o tabel sunt legate cu cele din alt tabel. Diferenele dintre o relaie i un tabel sunt urmtoarele [2].: atributele i tuplele unei relaii nu sunt ordonate, n timp ce ntr-un tabel exist o ordonare att a coloanelor ct i a rndurilor dou tuple ale unei relaii nu pot avea valori identice, n timp ce ntrun tabel dou sau mai multe rnduri ce ocup poziii diferite n tabel pot conine valori identice Un domeniu reprezint mulimea valorilor pe care le pot lua atributele unei relaii [5]. Astfel fiecare atribut dintr-o baz de date relaional este definit pe un anumit domeniu, de unde acesta va lua valori. Mulime 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 numrul minim de atribute, astfel alese nct valorile acestor atribute s fie unice [2]. n consecin, fiecare tupl a relaiei este identificat n mod unic de valoarea cheii respective. Totui ntr-o relaie pot fi mai multe grupuri
Pag. 6

de atribute care identific n mod unic tuplele relaiei, deci acestea reprezint chei ale relaiei respective. n modelul relaional liniile unui tabel sunt unice. Unicitatea nregistrrilor poate fi asigurat prin stabilirea unei chei primare, care este o coloan sau un grup de coloane ale tabelei care va conine valori unice n tabel [3]. Aceste tabele care conin valori unice se numesc chei candidat. Una din cheile candidat este considerat cheie primar, iar cele rmase se numesc chei alternative. Valorile cheilor primare sunt utilizate pentru a face corelaii ntre tuplele mai multor relaii i pentru a reprezenta legturile dintre entitile bazei de date. Astfel o cheie secundar a unei relaii este format din unul sau mai multe atribute ale cror valori sunt utilizate ca i chei primare n alte relaii [2]. ntotdeauna valorile atributului cheie secundar trebuie s aparin aceluiai domeniu ce cel al atributului cheie primar din cealalt relaie. 1.1.2 Relaii O relaie exprim un raport sau o asociere ntre dou sau mai multe tabele. ntre dou sau mai multe entiti pot exista urmtoarele tipuri de relaii: relaii de tipul 1:1 (one-to-one) sunt acele tipuri de relaii n care fiecrei linii din prima tabel i corespunde cel mult o linie n cea de-a doua tabel. Acest tip de relaii sunt utile atunci cnd se dorete mprirea 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; relaii de tipul 1:m (one-to-many) sunt relaiile 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; relaii de tipul m:m (many-to-many) sunt acele tipuri de relaii 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 normalizrii Teoria normalizrii se ocup cu mbuntirea succesiv a schemei conceptuale, fiind satisfcute n acelai timp urmtoarele condiii [3]: conservarea datelor n schema conceptual final trebuie s existe toate datele din cadrul schemei iniiale; conservarea dependenelor dintre date trebuie s se pstreze tipurile de relaii dintre entiti;
Pag. 7

descompunerea minimal a relaiilor iniiale n schema conceptual final nici o relaie nu trebuie s fie coninut ntr-alta. Normalizarea [3] const astfel ntr-o serie de teste efectuate asupra datelor existente, n scopul de a elimina redundana i de a garanta c datele sunt asociate cu tabelele sau relaiile corespunztoare. 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 redundanele datorate relaiilor de tipul m:m; A cincea form normal: -este mai mult academic i apare foarte rar n practic; Forma normal Boyce-Codd: -o relaie este n forma Boyce-Codd dac fiecare determinant este o cheie candidat (Putem defini determinantul ca pe un atribut sau o mulime de atribute neredundante care constituie un identificator unic pentru un alt atribut sau o alt mulime de atribute ale unei relaii.

1.2 Sisteme de gestiune a bazelor de date n perioada actual caracterizat printr-un progres continuu n toate domeniile vieii sociale i economice un rol deosebit de important l deine informaia. O parte important a resurselor fiecrei entiti economice sau sociale este orientat astfel spre acumulare, prelucrarea i stocarea datelor. Acest proces se identific n mod normal cu crearea, ntreinerea i utilizarea unei baze de date pe sistemele de calcul moderne. O baz de date este format dintr-o colecie 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 ct posibil accesul la date. Un SGBD ndeplinete urmtoarele funcii importante [2]: stocarea, regsirea i actualizarea datelor (astfel se permite utilizatorilor s creeze i s manipuleze date fr a fi necesar s cunoasc structura intern a datelor);
Pag. 8

crearea i ntreinerea dicionarului de date; gestionarea facilitilor legate de accesarea simultan a unor nregistrri ale bazei de date de ctre mai muli utilizatori; pstrarea unei copii de siguran (back-up); probleme de securitate a datelor (parole de acces ale utilizatorilor, verificri etc.) Gestionarea informaiei sub forma unei baze de date prezint o serie de avantaje dintre care amintim [2]:

Independena datelor: ntr-o baz de date, datele sunt pstrate astfel nct schimbarea structurii acestora s nu afecteze nici unul dintre programele de aplicaie ce utilizeaz baza de date respectiv. Consistena datelor: Modificarea articolelor din baza de date este perceput de fiecare dintre utilizatorii sistemului de baze de date. Controlul redundanei: n sistemele de gestiune neorientate spre baza de date, aceiai informaie poate fi pstrat n mai multe fiiere diferite i n consecin crete nejustificat spaiul fizic ocupat pe disc, precum i timpul consumat cu actualizarea datelor redundante. Integritatea datelor: Un SGBD furnizeaz utilizatorilor posibilitatea specificrii anumitor restricii. Dac de exemplu se adaug un nou produs n baza de date impunem s fie adugat i preul acestuia, astfel nct acest cmp nu va putea niciodat fi omis. O mai mare securitate a datelor: Un SGBD va asigura faptul c doar utilizatorii autorizai vor avea acces la date. Un control centralizat al datelor prin intermediul unui administrator al bazei de date. O mai mare cantitate de informaii disponibil utilizatorilor: Cu un SGBD utilizatorii acceseaz informaia ce a fost pstrat 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 obin mult mai rapid i mai simplu informaiile dorite, dect 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 interogrile asupra relaiilor sunt exprimate prin intermediul unor operatori aplicai asupra lor. n aceast categorie intr limbajul SQL. b) Limbaje bazate pe calcul relaional, n care interogrile asupra relaiilor sunt exprimate prin intermediul unor condiii pe care tuplele relaiilor
Pag. 9

trebuie s le satisfac. Aceast categorie de limbaje se clasific la rndul ei n dou categorii n funcie de obiectul asupra cruia se aplic operaia i anume: b1) limbaje bazate pe calcul relaional orientat pe tuple, n care predicatele se implic asupra tuplelor relaiilor, reprezentativ fiind aici QUEL, limbajul de interogare Ingres; b2) limbaje bazate pe calcul relaional orientat pe domenii, n care predicatele domeniului din care ia valori atributul relaiei. 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 reea, n care elementele ce reprezint datele sunt legate ntre ele prin pointeri, formndu-se astfel o reea, i modelul relaional, acesta din urm impunndu-se net n faa celorlalte dou, fiind la ora actual la baza realizrii majoritii produselor. n esen o baz de date relaional poate fi gndit ca i o colecie de tabele bidimensionale ce se numesc relaii, coloanele (atributele relaiei) au nume distincte, iar rndurile (tuple) conin elemente ale datelor ce poart numele de entiti. Organizarea datelor sub forma mai multor tabele poart numele de schema reprezentrii datelor. O schem nu specific doar care sunt coloanele ce intr n componena fiecrui tabel, ci va stabili de asemenea legtura logic dintre entitile stocate n baza de date. Limbajul standard care a fost conceput ca un limbaj de descriere a datelor i acces la informaiile din bazele de date relaionale este SQL. El a fost iniial utilizat de ctre firma IBM pentru produsul DB2, devenind la mijlocul deceniului trecut un standard de facto n domeniu. De atunci i pn n prezent au fost dezvoltate un numr de apte versiuni ale standardului SQL, trei dintre acestea aparinnd Institutului American de Standarde (ANSI), celelalte fiind concepute de firme de prestigiu ca IBM, Microsoft i Borland, sau de ctre consoriile 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 activiti de promovare a standardelor n domeniul sistemelor deschise. 1.3 Modelul relaional 1.3.1. Scurt descriere a modelului relaional Modelul relaional a fost formulat i publicat pentru prima oar la nceputul anilor 70 de ctre dr. Edgar F. Codd, cercettor la laboratoarele IBM din San Jose (California), care a publicat ntre anii 1970-1974 lucrrile sale referitoare la modelul relaional pentru bazele de date. Acest model relaional, are avantajul c permite
Pag. 10

proiectantului bazei de date s studieze proprietile sistemului de gestiune a bazelor de date fr a fi necesar s-l implementeze. Una din caracteristicile de baz ale modelului relaional este simplitatea sa i rigurozitatea sa din punct de vedere matematic, fapt care l-a impus n faa celorlalte modele, fiind adoptat n ultimul deceniu de majoritatea cercettorilor i programatorilor din domeniu. Datele i relaiile sunt reprezentate sunt reprezentare explicit, utiliznd o structur logic ce poart numele de relaie. Pe de alt parte, modelul relaional a fost definit cu o deosebit rigoare matematic, furniznd un mijloc performant de studiu al proprietilor logice ale unui sistem de baze de date. Spre deosebire de modelul relaional, celelalte modele impuse anterior, modelul ierarhizat i modelul reea, nu au beneficiat de un fundament teoretic att de solid. O alt deosebire esenial ntre modelul relaional i celelalte dou modele este aceea c n timp ce primul este orientat spre mulimi, celelalte dou sunt orientate spre fiiere; aceasta rezid din faptul c, dac pentru modelul ierarhizat i modelul reea, programatorul trebuie s proiecteze programe procedurale, care s acceseze baza de date nregistrare cu nregistrare utiliznd legturi fizice pentru nregistrri, pentru modelul relaional, o singur instruciune de limbaj neprocedural (cum este SQL), determin de obicei prelucrarea mai multor nregistrri. O alt proprietate specific modelului relaional este aceea c nefiind orientat spre sistemul de calcul, se pot adresa doar proprietile logice ale sistemului de baze de date, nu i cele fizice. Drept urmare, modelul nu include regulile, structurile i operaiile referitoare la implementarea fizic a unui sistem de baze de date. De astfel unul din obiectivele modelului relaional a fost acela de a introduce o distincie clar ntre aspectele fizice i cele logice ale unei baze de date, obiectiv numit de E.F. Codd independena datelor. La nceputul fundamentrii teoretice a modelului relaional, au existat temeri serioase privind eficiena aplicrii modelului relaional pentru baze de date de dimensiuni mari. Dezvoltarea tehnologic fr precedent n domeniul electronicii i informaticii din ultimii ani, concretizat n creterea puterii de prelucrare a calculatoarelor a condus la eliminarea acestor temeri prin larga utilizare a sistemelor de baze de date relaionale inclusiv pe calculatoarele personale. 1.3.2 Reguli de fidelitate ale bazelor de date Pe la mijlocul anilor 80 matematicianul Edgar F. 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 relaional. Aceste reguli sunt denumite Cele 13 reguli de fidelitate ale lui Codd. Ulterior Codd a extins numrul acestora, de la 13 reguli publicate n anul 1986, la un numr de 100 n 1990. Totui nici un sistem de gestiune a bazelor de date pus n vnzare pe piaa comercial nu respect absolut toate regulile definite de Codd, ci doar un numr mai mic sau mai mare al lor. Spre exemplu, produsul IBM DB2 respect un numr de 7 reguli din cele 13.
Pag. 11

Astfel cele 13 reguli de fidelitate ale lui Codd sunt[2] urmtoarele: Regula 0: (Regula de baz) Pentru a fi relaional, un SGBD trebuie s fie capabil s gestioneze o baz de date prin intermediul caracteristicilor sale relaionale. Astfel un SGBD trebuie s cuprind trei pri: o parte de definire a datelor (DDL), o parte de manipulare a datelor (DML) i o alt parte de integritate i control a datelor (DCL) Regula 1: (Regula reprezentrii informaiei) ntr-o baz de date relaional, informaia este reprezentat la nivel logic ntr-un singur fel, i anume sub forma unor tabele. Datele sunt stocate sub forma unor structuri tabelare, formate din rnduri denumite tuple i coloane denumite atribute. Aceste structuri sub form de tabele, ofer o serie de avantaje i anume: claritate, generalitate (majoritatea tipurilor de date pot fi reprezentate sub aceast form) i flexibilitate (aceast structur poate fi modificat att pe rnduri ct i pe coloane).

Regula 2: (Regula accesului garantat la date) Fiecare dat dintr-o baz de date relaional trebuie s poat fi adresat n mod logic printr-o combinaie format din numele relaiei n care se afl, valoarea cheii primare i numele atributului. Se poate regsi orice valoarea aparinnd oricrui atribut al unei relaii, dac sunt specificate: numele relaiei, numele tuplei (prin utilizarea cheii primare) i numele atributului. Regula 3: (Regula reprezentrii informaiei necunoscute) Un SGBD n totalitate relaional trebuie s poat permite utilizatorului definirea unui tip de date denumit NULL pentru reprezentarea unei informaii necunoscute la momentul respectiv i aceasta ntr-un mod sistematic pentru orice tip de date. ntr-un SGBD relaional trebuie s se poat face diferenierea ntre o valoare fixat intenionat pe 0, un ir vid de caractere i o valoare necunoscut. Regula 4: (regula dicionarului de date)
Pag. 12

Asupra descrierii bazelor de date trebuie s se poat aplica aceleai operaii ca cele asupra datelor din baza de date. Toate informaiile referitoare la relaii, vizualizri, indexi etc. , trebuie s poat fi stocate sub forma unor relaii ce formeaz un catalog de sistem (dicionar), i prin urmare s poat fi accesate n acelai mod ca i datele propriu-zise prin intermediul acelorai comenzi. Regula 5: (Regula limbajului de interogare) Un SGBD relaional trebuie s poat permite utilizarea a cel puin unui limbaj, care s prezinte urmtoarele caracteristici: s permit definirea datelor, definirea vizualizrilor, manipularea datelor, restricii de autorizare, realizarea tranzaciilor (operaiile COMMIT i ROLLBACK). Aceast regul precizeaz c manipularea datelor dintr-o baz de date trebuie s se fac printr-un limbaj de nivel nalt (de exemplu SQL), limbaj care permite utilizatorilor s defineasc relaii i vizualizri, s regseasc informaia i s o poat actualiza. De asemenea limbajul mai permite verificarea i corectarea datelor de intrare, precum i restrngerea accesului la relaii i vizualizri prin intermediul parolelor de acces. El trebuie s pstreze integritatea bazelor de date prin gestiunea tranzaciilor1. Regula 6: (Regula de actualizare a vizualizrii) Un SGBD trebuie s poat determina dac o vizualizare poate fi actualizat i s stocheze rezultatul interogrii ntr-un dicionar de tipul unui catalog sistem. Unele vizualizri pot fi actualizate, altele nu, n funcie de variantele instruciunii SELECT utilizate, pe baza crora sunt construite. Prin urmare, un SGBD trebuie s determine acest lucru printr-un anumit mecanism. Regula 7: (Regula limbajului de nivel nalt) Regulile de manipulare asupra unei relaii luat ca ntreg, sunt valabile att pentru operaiile de regsire a datelor, ct i asupra operaiilor de inserare, actualizare i tergere a datelor. Operaiile de manipulare a datelor (selecia, actualizarea, inseria, tergerea) se aplic asupra oricrei pri dintr-o relaie, plecnd de la ntreaga relaie i sfrind cu o tupl sau nici una. Astfel un SGBD relaional, nu trebuie s oblige utilizatorul s caute ntr-o relaie tupl de tupl pentru a regsi informaia dorit. Regula 8: (Regula independenei fizice a datelor)

Tranzacie o comand sau un grup de comenzi ale limbajului respectiv Pag. 13

ntr-un SGBD relaional trebuie s se separeu aspectul fizic al datelor (metoda de stocare sau metoda de acces la date) de aspectul logic, i anume programele de aplicaie. Orice modificare n modul de stocare al datelor nu trebuie s afecteze n nici un fel programele de aplicaie, utilizatorilor fiindu-le transparente asemenea operaii. Regula 9: (Regula independenei logice a datelor) Programele de aplicaie trebuie s fie transparente la modificrile de orice tip efectuate asupra datelor. Orice modificare asupra unei relaii nu trebuie s afecteze operaiile de manipulare a datelor. Totui pot aprea modificri ale acestor operaii, dac se terg relaii, vizualizri sau atribute. Regula 10: (Regula independenei datelor din punct de vedere al integritii) Un SGBD relaional trebuie s permit att definirea unor restricii de integritate asupra bazelor de date prin intermediul limbajului, ct i stocarea lor n dicionare de tipul cataloagelor sistem. Un SGBD relaional trebuie s permit operaii de validare a datelor (restricii de integritate), utiliznd de exemplu limbajul SQL, gestiunea acestor operaii trebuie s poat fi fcut prin stocarea lor n dicionarul de date i nu prin scrierea de programe. Regula 11: (Regula independenei datelor din punct de vedere al distribuirii) Distribuirea datelor pe mai multe calculatoare dintr-o reea de comunicaii de date, nu trebuie s afecteze programele de aplicai. Aceast regul reprezint o extensie a regulii 8, deoarece n acelai mod cum utilizatorii trebuie s fie transpareni fa de unitatea de disc pe care se afl stocate relaiile, n acelai mod ei trebuie s fie transpareni i fa de calculatorul pe care se afl aceste relaii. Regula 12: (Regula versiunii procedurale a SGBD) Orice component procedural a unui SGBD trebuie s respecte aceleai restricii de integritate ca i componenta relaional. De exemplu, dac n partea de manipulare a datelor a limbajului relaional (DML), data dintr-o coloan este de tipul NOT NULL, orice alt metod procedural de accesare a acestei coloane nu trebuie s permit introducerea unei valori NULL n aceast coloan.

Pag. 14

Bibliografie 1. Eduard Koller, Monica Rocule - Programare n Acces 97, Editura TEORA, Bucureti 1999 2. Corina Pascu, Adrian Pascu 3. John L. Viescas -Totul despre SQL, Editura Tehnica, Bucuresti 1994 -Totul despre Microsoft Access. Editura Teora Bucuresti 1999

CAP:2. Baze de date, tabele i relaii nc de la varianta 95, Access v pune la dispoziie experi care pot crea pentru dumneavoastr toate tabelele, formularele i rapoartele unei baze de date pe care o vei specifica. De asemenea, Access v pune la dispoziie un numr de baze de date predefinite, din domenii variind de la administrarea unei biblioteci, fonoteci sau videoteci, pn la contacte de afaceri, informaii despre companii, servicii, etc. Dei aceti experi v pot uura considerabil munca, scopul nostru este s v artm cum s creai propria baz de date, pornind de la zero.
Pag. 15

2.1 Crearea unei baze de date La pornire, Access v prezint o cutie de dialog care v permite s optai ntre a deschide o baz de date existent i a crea una nou. Pentru a crea manual o baz de date, selectai Blank Database i apsai butonul OK. Altfel, dac dorii s creai o baz de date nou n timp ce lucrai cu Access, alegei comanda File/New Database sau apsai butonul New Database de pe bara cu instrumente i apoi alegei Blank Database din pagina General a cutiei de dialog New.

Fig. 2.1. Fereastra de deschidere din Access S creem mpreun baze de date Cursuri opionale. Specificai n cmpul File Name al cutiei de dialog File New Database numele Cursuri Opionale i alegei din lista Save In directorul n care dorii ca Access s salveze noul fiier (avei grij ca tipul fiierului s fie Microsoft Access Database (*.mdb)).

Pag. 16

Fig. 2.2. Tastai Cursuri optionale n loc de db1 pentru a denumi baza de date 2.2. Crearea tabelelor n acest moment, baza de date nu conine nici o tabel (dac ai fi folosit un expert pentru a crea baza de date, acesta ar fi creat i tabelele, i chiar ar fi stocat n ele informaie) Atelierul pe care Access vi-l pune la dispoziie este fereastra Database, care se deschide imediat dup ce ai creat o baz de date nou, sau ai deschis una deja existent. Aceasta conine pagini pentru diferitele tipuri de obiecte care pot alctui o baz de date Access: tabele, interogri, rapoarte, formulare i module. Pe parcursul acestui capitol ne vom concentra atenia asupra paginii Tables a ferestrei Database. Access v ofer mai multe posibiliti de a crea o tabel nou, dup cum se poate observa i din figura:

Fig. 2.3. Pagina Tables


Pag. 17

Datasheet View: v permite s creai o tabel pe baza datelor stocate n ea (pentru Acces 97); Design View: v ajut s definii structura tabelei, specificnd coloanele care o compun i proprietile acestora; Table Wizard: este un expert care creeaz pentru dumneavoastr o tabel pe baza unor structuri predefinite;

2.2.1 Crearea manual a tabelelor Pentru a crea manual o tabel, putei folosi fie modul Datasheet View, fie modul Design View. Modul Datasheet View v ajut s creai tabele simple, prin simpla introducere a datelor n tabel. Access determin apoi, pe baza cestor date, tipurile i formatele coloanelor. De asemenea, Access poate crea i o cheie primar. Cu toate acestea, Datasheet View nu v va permite s intrai n detalii cum ar fi stabilirea proprietilor tabelei sau ale coloanelor. Pentru acestea, folosii modul Design View, care v va oferi control asupra tuturor proprietilor disponibile ale tabelei i ale coloanelor care o compun, inclusiv reguli de validare i valori implicite. 2.2.2 Datasheet View: avantaje crearea tabelei umplerea ei cu date n ciuda acestor avantaje, trebuie s inem cont de faptul c n majoritatea cazurilor, bazele de date nu sunt create doar pentru a stoca informaiile existente, ci pentru a oferi un mecanism pentru introducerea ulterioar a datelor i pentru lucrul cu acestea. Dup cum putei observa din figur, folosirea modului Datasheet View se aseamn cu lucrul cu Microsoft Excel: fiecare linie reprezint o nregistrare n tabel Pentru a crea o tabel nou n modul Datasheet View (97), procedai n felul urmtor: 1. n fereastra Database, apsai butonul New. Va aprea fereastra New Table. 2. Din lista prezentat n fereastra New Table, alegei Datasheet View i apsai butonul OK. Acum, pe ecran a aprut o fereastr coninnd o tabel fr date, dar cu 20 de coloane i 30 de linii (dac dorii, putei aduga mai multe). n partea de sus a fiecrei coloane se afl un selector ce conine numele coloanei respective. Fcnd clic cu butonul din stnga al mouse-ului pe acest selector, putei selecta coloana. Iniial, aceste nume sunt Field1, Field2 etc. dar, ulterior, le vom schimba n aa fel nct s reflecte atributele entitii descrise de tabel. Pentru a redenumi o coloan, putei proceda n unul din urmtoarele trei moduri: 1. Facei dublu-clic pe selectorul coloanei, care se va schimba ntr-un cmp de editare. Introducei noul nume.
Pag. 18

2.

Selectai coloana, alegei comanda Format | Rename column i editai numele.

3.

facei clic dreapta pe selectorul coloanei. Din meniul context, selectai comanda Rename Column i editai numele. Not: dei Access v permite includerea de spaii n numele coloanelor, ncercai, pe ct posibil, s evitai acest lucru. Unele sisteme de baze de date (cum ar fi dBase) nu permit folosirea spaiilor n numele coloanelor. Deci, dac avei de gnd s legai o tabel dintr-un astfel de DBMS (Data Base Management System Sistem de gestionare a bazelor de date) la baza dumneavoastr de date, nu folosii spaii.

Fig. 2.4. Tabela Curs_Student Not: Access consider c un cmp gol, care nu conine date, are o valoare special, numit null. Astfel, regsirea ulterioar a nregistrrilor pentru care un cmp nu conine date va fi foarte uoar, comparnd valoarea lui cu null. 2.2.3 Design View: Spre deosebire de modul Datasheet View, modul Design View nu v permite introducerea de date n tabel. Cu toate acestea, el este indispensabil datorit posibilitilor pe care vi le ofer.

Pag. 19

Fig. 2.5. Modul Design View Pentru a crea o tabel n modul Table Design View, procedai n felul urmtor: 1. apsai butonul Tables. 2. Selectai din list opiunea Create table using Design View . Va aprea o fereastr ce nu conine informaie. Aici se pot defini coloanele (numite i cmpuri) ce compun tabela, precum i proprietile acestora. Dup cum se poate observa din figur, fereastra este mprit n dou pri. Partea de sus folosete la definirea coloanelor, iar partea de jos la stabilirea proprietilor fiecrei coloane n parte i coninutul ei se schimb n funcie de tipul pe care l-ai atribuit coloanei. 2.2.4 Definirea coloanelor Dup cum s-a observat, pentru a defini coloanele, se folosete partea de sus a ferestrei Table Design. Pentru a defini prima coloan, introducei numele acesteia n prima linie a coloanei Field Name. Trecei apoi n coloana Data Type pentru a alege tipul pe care dorii s-l atribuii noii coloand. Access v pune la dispoziie un numr de tipuri de date predefinite, despre care vom vorbi n cele ce urmeaz: Text: ir de caractere (maximum 255), pentru stocarea datelor alfanumerice. Folosit i pentru numerele ce nu vor fi folosite la calcule (de exemplu, numere de telefon). Memo: folosit pentru stocarea textelor lungi, de pn la 65.535 de caractere. Number: folosit pentru stocarea datelor numerice de tipul: ntreg, ntreg lung, n virgul mobil, cu precizie simpl sau dubl. Date/Time: folosit pentru stocarea datei i a orei. Currency: un tip numeric special, folosit pentru valori monetare, deoarece nu permite rotunjirile de calcul.
Pag. 20

Autonumber: un tip numeric special care poate fi folosit pentru cheile primare. Coloanele de acest tip sunt de tip read-only (doar

citire), Access introducnd automat ori valori consecutive, ori valori aleatoare la crearea unor nregistrri noi. Yes/No: folosit pt stocarea datelor booleene. OLE Object: folosit pentru a stoca text sau o combinaie de text i date numerice, folosite ca adres de hiperlegtur ce poate conine trei pri separate prin semnul #: textul afiat ntr-un control sau cmp, adresa (calea ctre un fiier (UNC) sau ctre o pagin (URL)) i o subadres (o locaie din cadrul fiierului sau paginii). Lookup Wizard: v d posibilitatea s definii un cmp n care utilizatorul s poat selecta o valoare din alt tabel sau dintr-o list predefinit. (vom reveni asupra acestei probleme) Dup ce s-a ales tipul coloanei care se dorete s o creai, putei introduce o scurt descriere a acesteia n coloana Description. Dei acest lucru este opional, este bine s profitai de el, pentru ca tabela s fie uor de ntreinut.

2.2.5 Stabilirea proprietilor cmpurilor n aceast seciune vom descrie diferitele proprieti pe care le poate acea un cmp (coloan) i care pot fi stabilite folosind partea de jos a ferestrei Table design. Setul de proprieti pe care l avei la dispoziie variaz n funcie de tipul de date ales pentru coloana respectiv. Multe dintre proprietile de baz sunt comune tuturor tipurior de date. n afar de proprietile booleene (Required, Allow Zero Length i Indexed), singurele proprieti pe care trebuie s le specificai sunt Field Size (pentru tipurile de date Text, Number i Autonumber) i New Values (pentru Autonumber). Toate celelalte proprieti sunt opionale. n continuare, vom vorbi mai pe larg despre proprieti.

Field Size: specific lungimea irului de caractere sau tipul numeric al datelor stocate n acest cmp. Format: specific formatul n care vor fi afiate datele. Putei alege un format predefinit sau putei crea dumneavoastr unul. Nu afecteaz modul de stocare a datelor. Decimal Places: Specific numrul de cifre de dup virgul. Valoarea Auto arat faptul c numrul de zecimale este dat de proprietatea Format. Input Mask: controleaz formatul n care trebuie introduse datele n cmp. Definii acest format apsnd butonul... Caption: specific denumirea sub care va aprea coloana n formulare i rapoarte. Dac nu o completai, Access va folosi numele coloanei.
Pag. 21

Default Value: valoarea atribuit din oficiu cmpului la inserarea unei noi nregistrri. Validation Rule: expresie (regul de validare) ce limiteaz valorile ce pot fi introduse n cmp. Validation Text: textul afiat dac datele introduse n cmp nu respect regula de validare. Required: arat dac un cmp poate conine valoarea null Allow Zero Length: arat dac n cmpurile de tip Text sau Memo pot fi introduse iruri de caractere de lincime zero. Aceast proprietate este independent de proprietatea Required. Dac ea are valoarea Yes, un ir de lungime zero este o valoare valid pentru un cmp, indiferent de valoarea proprietii Required. Indexed: arat dac un cmp este indexat sau nu. Valoarea Yes (No Duplicates) arat faptul c un cmp poate fi indexat, iar valorile stocate n el trebuie s fie unice. Valoarea Zes (Duplicates Allowed) nseamn faptul c un cmp este indexat, iar valorile sale trebuie s fie unice. Valoarea No arat faptul c un cmp nu este indexat. Despre indeci i coloane indexate vom vorbi mai pe larg n acest capitol. New Values: este o proprietate specific tipului de date Autonumber i indic modul n care Access genereaz numerele ce vor fi stocate n cmp: cresctor (Increment) sau aleator (Random).

Aceste proprieti le gsii n pagina General din partea de jos a ferestrei Table Design. Cea de-a doua pagin este Lookup i, pentru unele tipuri de date (Text, Number, Yes/No), ea v permite s alegei tipul de control folosit pentru introducerea datelor n cmp. Figura reprezint pagina Lookup pentru un cmp de tip text.

Pag. 22

Fig. 2.6. Pagina Lookup pentru un cmp de tip text

Prima proprietate din pagine Lookup este Display Control i ea specific modul n care vor fi afiate datele. n funcie de valoarea sa, sunt disponibile sau nu i alte proprieti. Dac la tipul coloanei ai ales Lookup Wizard, valoarea pentru Display Control va fi stabilit automat. Pentru coloane de tip Text sau Number, valorile disponibile pentru Display Control sunt Text Box, Combo Box sau List Box, iar pentru coloane de tip Yes/No, putei alege Text Box, Combo Box sau Check Box. Dac ai optat pentru Text Box, nu mai sunt alte proprieti de stabilit. Valorile Text Box sau Combo Box v dau posibilitatea s specificai liste din care utilizatorul s selecteze datele ce trebuie introduse n cmp. Aceste date pot proveni din liste predefinite sau din alte tabele. Asupra acestei probleme vom reveni ulterior n acest capitol. Cel mai simplu mod de a folosi proprietile din pagina Lookup este cu ajutorul expertului Lookup Wizard, despre care vom vorbi n seciunea urmtoare. 2.2.6 Lookup wizard Expertul Lookup Wizard este folosit pentru a defini modul n care pot fi regsite i afiate valorile ce pot fi introduse ntr-un cmp. Dup cum am mai spus, aceste valori pot proveni din alte tabele, dintr-o interogare sau dintr-o list specificat de dumneavoastr. Pentru a nelege mai bine mecanismul i utilitatea expertului Lookup Wizard, v propunem s crem mpreun, n modul Table Design View, tabela Curs_Student,
Pag. 23

despre care am mai vorbit. Pentru aceasta este necesar ca dumneavoastr s fi creat n prealabil tabelele Curs i Student. Pentru a putea fi stabilite ralaiile. Vom folosi Lookup Wizard pentru a regsi denumirile cursurilor opionale disponibile i a-i oferi utilizatorului posibilitatea de a alege un curs dintr-o list. Not: dac tabela Curs este deschis n modul Datasheet View sau Design View, nchidei-o, pentru ca Lookup Wizard s i poat finaliza aciunile. Dup ce ai creat coloanele NrMatricol i Nota (vezi figura 2.6) , urmai paii urmtori pentru a crea coloana IdCurs: 1. n cmpul Field Name: Introducei numele coloanei, IdCurs. 2. n cmpul Datatype: alegei Lookup Wizard. 3. n prima cutie de dialog a expertului alegei prima opiune, prin care specificai c dorii ca datele s fie luate dintr-o tabel sau interogare. Apsai butonul Next. 4. n cea de-a doua cutie de dialog, selectai din list tabela Curs i apsai Next 5. n cea de-a treia cutie de dialog specificai din care coloane ale tabelei Curs dorii s fie luate datele. Selectai coloana Denumire i apsai Next. 6. cea de-a patra cutie de dialog v permite s ajustai limea coloanelor selectate. De asemenea, n csua de validare Hyde key column, specificai dac dorii s apar i coloana care face legtura ntre cele dou tabele (IdCurs). Cum nu dorim acest lucru, lsai csua validat i apsai Next. 7. n ultima cutie de dialog introducei numele pe care dorii s-l aib noua coloan n modul Datasheet View sau n formulare (Curs). Apsai butonul Finish. 8. Lookup Wizard va salva tabela cu noile modificri i va stabili relaia ntre tabela Curs i Curs_Student (care este de tipul 1:m). 9. observai n fereastra Table Design noile valori ale proprietilor din pagina Lookup (vezi figura). Proprietatea Caption din pagina general are acum valoarea Curs.

Pag. 24

Fig. 2.7. Utilitarul Lookup Wizard Pentru a vedea rezultatele acestor aciuni, trecei n modul Table Datasheet View. Selectai coloana Curs i apsai butonul din parteadreapt a cmpului. Va aprea o list a tuturor cursurilor din tabela Curs (fig. 2.8). dac selectai un nume din list, acesta va fi afiat n cmp. Dei ceea ce vedei este denumirea cursului, n tabela Curs_Student este stocat doar IdCurs, astfel nct regulile de integritate referenial s poat fi pstrate. Astfel, n cazul n care denumirea unui curs n tabela Curs se modific, aceast modificare s se reflecte i n tabela Curs_Student, fr ca ea s trebuiasc s fie fcut manual.

Pag. 25

Fig. 2.8. Creearea tabelei Curs_Student n continuare, vom descrie procedeul prin care valorile stocate n cmpul Curs al tabelei Curs_Student s poat fi selectate dintr-o list definit de dumneavoastr. 1. n modul Table Design, alegei pentru coloana Curs: tipul Lookup Wizard, ca mai nainte. 2. n prima cutie de dialog a lui Lookup Wizard alegei cea de-a doua opiune, prin care specificai faptul c vei introduce dumneavoastr valorile dorite. Apsai butonul Next. 3. cea de-a doua cutie de dialog v permite s specificai numrul de coloane ce vor fi afiate i valorile lor. n cmpul Number of Columns, introducei cifra 2. n partea de jos a cutiei de dialog, vor aprea dou coloane, n care introducei, de exemplu, datele din tabelul urmtor. Apoi, apsai Next. Col. 1 1 2 3 4
4.

Col.2 Programare Englez Francez German

n cea de-a treia cutie de dialog, specificai care dintre cele dou coloane va avea datele stocate n tabela Curs_Student. Alegem Col1, datele din Col2 vor fi doar afiate, ajutnd utilizatorul la alegerea lor. Astfel, datele stocate n tabel vor ocupa mai puin spaiu. Apsai butonul Next. 5. dialogul final v cere s introducei denumirea coloanei. Aceasta este Curs. Apsai butonul Finish.

Pag. 26

Acum, n pagina Lookup a ferestrei Table Design, putei modifica unele proprieti, cum ar fi limea coloanelor (Column Widths) sau putei specifica dac utilizatorul poate introduce n cmpul Curs Numai valori din list sau i alte valori (prin proprietatea Limit to List). 2.2.7 Value List Putei beneficia de facilitile coloanelor de tip Lookup (de cutare) i fr a apela la Lookup Wizard (dei aceasta este cea mai comod cale). De exemplu, pentru a specifica o list de valori avei grij ca, n funcie de tipul valorilor ce vor fi stocate n tabel, s alegei n cmpul Data Type tipul Text, Number sau Yes/No. n cazul exemplului nostru, tipul este Number (dac ai fi dorit s stocai n tabel denumirile, ar fi trebuit s alegei tipul Text). Apoi, n pagina Lookup, pentru proprietatea Display Control stabilii valoarea Combo Box sau List Box, iar pentru proprietatea Row Source Type, alegei valoarea Value List. n cmpul proprietii Row Source introducei valorile din tabel, parcurse pe linii, sub form de list, separate prin punct i virgul, ca n figura. (datele de tip text este bine s le introducei ntre ghilimele).

Fig. 2.9. Alcatuirea unei liste derulante Dac dorii ca valorile pentru coloana de cutare s fie luat dintr-o tabel, va trebui s folosii Query Builder, un alt instrument util pus la dispoziie de Access, ce v va permite s specificai coloanele din care s fie luate datele prin intermediul unei interogri. Despre interogri i Query Builder vom vorbi n capitolele urmtoare.

Pag. 27

2.2.8 Definirea cheilor primare i a indecilor Un index reprezint o cale rapid de localizare i sortare a nregistrrilor dintro tabel prin gruparea tuturor nregistrrilor pentru un anumit atribut sau grup de atribute. Indexarea este utilizat n dou scopuri principale:accelerarea cutrilor n baza de date i asigurarea unicitii nregistrrilor. De exemplu, dac v intereseaz anumite nume de familie n tabela Student, putei crea un index pentru coloana NumeSt, pentru a regsi mai rapid studenii cu un anumit nume de familie. Cheia primar a unei tabele este indexat automat. Nu pot fi indexate coloanele de tipul Memo, Hyperlink sau OLE Object. Utilizarea unui index are sens doar dac se vor face interogri frecvente relativ la coloana indexat. Dei accelereaz procesul de regsire a datelor, indecii ngreuneaz serios actualizarea lor. Dup fiecare operaie de actualizare a datelor (inserare, modificare sau tergere) trebuie s verificai i s actualizai i indecii. De aceea, folosurea lor trebuie s fie bine ntemeiat, deoarece, altfel, ei pot mri timpul de rspuns al sistemului i ocup spaiu suplimentar pe disc. Pentru a crea cheia primar a unei tabele, trecei n modul Design View al acelei tabele. Selectai coloana sau grupul de coloane ce va servi drept cheie primar i apoi apsai butonul Primary Key de pe bara cu instrumente sau alegei comanda Edit | Primary Key. Not: Pentru a selecta un cmp n Table Design View, facei clic n coloana cea mai din stnga a ferestrei Table Design. Pentru a selecta mai multe cmpuri, inei apsat tasta Ctrl n timp ce efectuai operaia de mai sus pentru fiecare cmp. Cnd o coloan face parte din cheia primar a unei tabele, proprietatea Indexed are valoarea o coloan face parte din cheia primar a unei tabele, proprietatea Indexed are valoarea Yes (No Duplicates), adic Access indexeaz acea coloan i duplicatele nu sunt permise. Proprietatea Required primete valoarea Yes, deoarece cheia primar nu poate conine valoarea null. S presupunem c se fac frecvente cutri n tabela Student, dup numele complet (NumeSt+PrenumeSt). Pentru a crea un index pe aceste dou coloane, procedai astfel: deschidei tabela Student n Table Design View. apsai butonul Indexes de pe bara de instrumente sau alegei comanda View | Indexes. Va aprea fereastra Indexes pentru tabela Student (fig.). Observai c ea coninde deja o intrare pentru cheia primar a tabelei, NrMatricol, deci exist un index de pe coloana NrMatricol, numit Primary Key.

Pag. 28

Fig. 2.10. Stabilirea indecilor


1. deoarece sortarea studenilor se va face dup nume i prenume, vom crea i un index pe aceste coloane. Pentru aceasta, introducei n primul cmp liber al coloanei Index Name denumirea indexului: s-i spunem Nume. 2. facei clic n coloana Field Name a aceleiai linii i alegei din lista derulant coloana NumeSt. Cum de cele mai multe ori vom dori ca studenii s fie sortai n ordine alfabetic, lsai n coloana Sort Order valoarea Ascending. 3. lsai necompletat cmpul din linia urmtoare a coloanei Index Name (am precizat deja numele indexului) i alegei n cmpul Field Name coloana PrenumeSt. Ordinea sortrii va fi tot cresctoare. Astfel am creat indexul Nume pe coloanele NumeSt i PrenumeSt.

Proprietile fiecrui index le putei vedea n partea de jos a ferestrei Indexes dac facei clic n celula n care ai specificat numele indexului (nume i, respectiv, Primary Key). Proprietile pentru noul index creat le putei vedea n figur.

Pag. 29

Fig. 2.11. Crearea celui de-al doilea index 2.2.9 Crearea unei tabele folosind experii Access. Pn acum am discutat despre cel mai complicat mod de a crea o tabel. Acesta este i modul care v ofer cel mai mult control asupra tabelelor create i proprietilor lor. Access v pune la dispoziie i trei experi: Table Wizard, Import Table Wizard i Linking Table Wizard. Primul v ajut s creai o tabel pe baza unei tabele predefinite. Table Wizard v d posibilitatea s alegei tabela care s v serveasc drept model, s selectai coloanele dorite, s le redenumii, s spunei dac dorii ca Access s creeze o cheie primar, s stabilii relaii ntre noua tabel i alta existent. O dat tabela creat, putei folosi modul Table Design pentru a-i modifica proprietile sau Table Datasheet pentru a introduce datele. Table Wizard este util mai ales pentru aceia dintre dumneavoastrp care nu au mai lucrat cu Access. Cei cu experien vor gsi c este mai simplu s porneasc direct cu Table Design View. Expertul Import Table Wizard v permite s importai obiecte i date din surse externe, cum ar fi: tabele Excel, dBase, Fox Pro, fiiere text, documente HTML, orice surs ODBC disponibil n sistemul dumneavoastr sau din alte baze de date Access. Link table Wizard creeaz legturi ntre baza de date curent i tabele dintr-un fiier extern (oricare din cele specificate mai sus). Putei vizualiza i modifica datele dintr-o tabel legat de baza dumneavoastr de date, s le modificai anumite proprieti, s stabilii relaii. Dac tergei o tabel legat din baza de date curent, se terge doar legtura, nu i tabela din baza de date surs. 2.3 Stabilirea relaiilor ntre tabele Posibilitatea de a crea i de a folosi relaiile dintre tabelele unei baze de date este punctul forte al bazelor de date relaionale i al sistemelor de administrare a bazelor de date relaionale, cum este i Microsoft Access. Pentru a stabili relaii ntre tabele, bazele de date relaionale folosesc coloane cheie care sunt comune tabelelor pe care le leag. 2.3.1. Fereastra Relationships Relaiile pot fi definite fie n timpul crerii unei tabele noi, fie dup aceea. Pentru a defini o relaie, ambele tabele trebuie s existe n baz ade date. n primul caz, n care relaia este definit n timpul crerii unei tabele, vei folosi pentru definirea relaiei ori expertul Table Wizard, ori coloanele de cutare. Table Wizard v permite acest lucru ntr-una dintre cutiile sale de dialog. Cea de-a doua modalitate este s definii coloane de tip lookup (despre care am mai vorbit n cadrul acestui capitol). Prin crearea unei coloane de tip lookup (de cutare) care s-i ia datele din alt tabel, se stabilete i o relaie ntre cele dou tabele. Nu este necesar ca relaiile s fie create o dat cu tabelele. De fapt, cel mai simplu mod de a crea o relaie ntre dou tabele este folosirea ferestrei Relationships.
Pag. 30

Aceasta poate fi deschis fie prin comanda Tools | Relationships, fie apsnd butonul Relationships de pe bara cu instrumente. Not: nainte de a folosi fereastra Relationships pentru crearea sau modificarea unei relaii, este bine s nchidei orice fereastr Datasheet View pentru c nu pot fi impuse regulile de integritate referenial dac tabelele implicate sunt deschise ntr-unul din cele dou moduri amintite. Dac fereastra Relationships este deschis pentru prima dat pentru baza de date curent sau dac a mai fost folosit, dar relaiile nu au fost salvate, ea va aprea pe ecran goal, mpreun cu cutia de dialog Show table.

Fig. 2.12. Vizualizarea tabelelor pentru stabilirea de relaii Dac pentru baza de date curent exist relaii salvate, cutia de dialog Show table nu va apre ci, n fereastra, vor fi afiate tabelele i relaiile dintre acestea. Relaiile sunt prezentate sub forma unei linii continue ce leag cmpurile cheie ale tabelelor ce particip la o relaie. Pentru a aduga o tabel sau o interogare la fereastra Relationships, facei dublu clic pe numele ei n cutia de dialog Show Table. Astfel, ea va aprea n fereastra Relationships mpreun cu toate relaiile la care particip. Pentru a vedea toate relaiile care au fost definite pentru o anume tabel, adugai tabela la fereastra Relationships, nchidei cutia de dialog Show Table i alegei comanda Relationships | Show Direct. Access va aduga automat n fereastra Relationships toate tabelele care particip la relaii cu tabela aleas, precum i relaiile respective. Figura prezint relaiile la care particip tabela Curs_Student.

Pag. 31

Fig. 2.13. Relaiile petru tabela Curs_Student

Pentru a putea vedea relaiile stabilite ntre toate tabelele bazei de date curente, alegei comanda Relationships | Show All. Pentru a nltura o tabel din fereastra Relationships fr a terge vreuna din relaiile la care particip, selectai tabela fcnd clic pe oricare dintre cmpurile ei i apoi alegei comanda Relationships | Hide Table sau Edit | Delete. (avei grij s selectai o tabel i nu o relaie). Pentru a nltura toate tabelele din fereastra Relationships fr a terge relaiile dintre ele, folosii comanda Edit | Clear Layout. Din fereastra Relationships putei accesa modul Table Design View pentru o tabel. Pentru aceasta, facei clic pe unul dintre cmpurile tabelei i din meniul derulant alegei comanda Table Design. (Dup ce terminai lucrul n fereastra Table Design View, nchidei-o.) 2.3.2 Crearea relaiilor dintre tabele. Acum, dup ce ai aflat cum s adugai i s nlturai o tabel din fereastra Relationships, este timpul s nvai cum se poate stabili o relaie ntre dou tabele. Vom crea o relaie ntre tabelele Profesor i Titlu. Pentru aceasta, procedai astfel: 1. adugai ambele tabele la fereastra Relationships. 2. facei clic pe cmpul IdTitlu din tabela Titlu i, innd mouse-ul apsat, tragei cmpul peste cmpul IdTitlu din tabela Profesor.

Pag. 32

Fig. 2.14. Stabilirea relaiilor petru tabela Curs_Student


3.

va aprea cutia de dialog Relationships (fig.) apsai butonul Create pentru a accepta valorile propuse de Access. Acum, n fereastra Relationships relaia este figurat printr-o linie ce unete cmpurile IdTitlu din cele dou tabele.

Fig. 2.15. Stabilirea relaiilor ntre tabelele Profesor i Titlu De cele mai multe ori, pentru a crea o relaie 1:m ntre dou tabele va trebui s deplasai cheia primar (afiat ngroat) a uneia dintre tabele peste cmpul corespunztor (cheie strin) din cealalt tabel. Cele dou cmpuri trebuie s aib acelai tip de date. Cmpurile de tip Autonumber, pentru care valoarea New Value are valoarea Increment, pot fi puse n relaie cu coloane de tipul Number, pentru care Proprietatea Field Size este stabilit la Long Integer. Dac ambele cmpuri sunt de tipul Number, proprietatea Field Size trebuie s aib aceeai valoare.

Pag. 33

2.3.3 Proprietile relaiilor Cutia de dialog Relationships v permite s stabilii proprietile relaiilor. Aici putei aduga cmpuri pentru a defini o relaie, fcnd clic ntr-o celul goal a grilei i alegnd cmpul dorit din lista derulant. (Dac adugai un cmp, trebuie s alegei un cmp corespunztor din cealalt tabel.) Dac dorii s schimbai cmpul unei tabele care particip la relaie, facei clic n celula care l conine i alegei noul cmp ca mai nainte. Tot aici putei stabili tipul de asociere (join) pe care Access l va folosi cnd vei crea o interogare bazat pe cele dou tabele. Acest lucru l realizai apsnd butonul Join Type. Se va deschide cutia de dialog Join Properties (fig.2.16). despre tipurile de asociere vom vorbi n seciunea urmtoare.

Fig. 2.16 Cutia de dialog Join Type

De asemenea, putei decide dac Access va impune regulile de integritate referenial asupra tabelelor care particip la relaie, problem asupra creia vom reveni. 2.3.4. Tipuri de asociere Tipul de asociere (join) al unei relaii specific modul n care sunt regasite informaiile din dou tabele corelate i nu afecteaz relaia nsi. Cele trei tipuri principale sunt: inner join, outer join i self-join. Tipul outer join poate fi, la rndul su, left outer join i right outer join. Rezultatul unei interogri bazate pe dou tabele corelate poate fi interpretat ca o tabel n care fiecare linie este o combinaie a unei linii luate din prima tabel i a uneia din cea de-a doua tabel. O asociere de tipul inner join este aceea n care liniile celor dou tabele sunt concatenate i adugate la rezultatul unei interogri numai dac valorile cmpurilor de legtur sunt egale. Acest tip de asociere este util atunci cnd dorii numai
Pag. 34

nregistrrile care au valori n cmpurile corelate. Tipul inner join mai este cunoscut i sub numele de equi-join i este opiunea implicit propus de Access. Tipul outer join este opusul lui inner join. El permite adugarea unei linii la rezultatele unei interogri chiar dac nu exist o linie corespunztoare n tabela corelat. De exemplu, dac dorii s vedei numai cursurile pentru care a optat cel puin un student, folosii un inner join. Dac dorii s regsii cursurile indiferent dac au fost alese sau nu de cel puin un student, folosii un outer join. O asociere de tipul left outer join (sau left join) v d posibilitatea s includei n rezultatele interogrii toate nregistrrile din tabela din partea stng a operatorului LEFT JOIN, iar din tabela din partea dreapt, doar nregistrrile care au corespondent n tabela din stnga. Pentru a ilustra cele mai de sus, v prezentm interogarea ce regsete toate cursurile disponibile i numerele matricole ale studenilor care s-au nscris la cel puin un curs: SELECT Denumire, NrMatricol FROM Curs LEFT JOIN Curs_Student ON Curs.IdCurs = Curs_Student.IdCurs O asociere de tip right outer join (right join) va include n rezultatele interogrii toate nregistrrile din tabela din partea dreapt a operatorului TIGHT JOIN, iar din tabela din partea stng a operatorului doar nregistrrile care au un corespondent din tabela din dreapta. Observai c cei doi operatori, LEFT JOIN i RIGHT JOIN pot produce aceleai efecte dac sunt schimbai ntre ei i dac se modofic ordinea tabelelor. Astfel, interogarea urmtoare va avea acelai efect ca i cea de mai sus: SELECT Denumire, NrMatricol From Curs_Student RIGHT JOIN Curs On Curs.IdCurs = Curs_Student.IdCurs Not: nu exist nici o legtur ntre poziionarea tabelelor n fereastra Relationships (una la stnga celeilalte) i poziionarea lor n stnga sau n dreapta operatorului LEFT JOIN sau RIGHT JOIN. n cazul n care ntre dou tabele exist definit o relaie, la creareea interogrii Access va considera c tabela care conine cheia primar este tabela din stnga operatorului. Dup ce ai selectat o asociere de tipul outer join, Access o va reprezenta printr-o linie cu sgeat la unul din capete. Reinei c sensul n care este orientat sgeata este dinspre tabela din care se vor include toate nregistrrile ctre tabela din care se vor include doar nregistrrile ce au un corespondent. O asociere de tip self-join este ntre dou copii ale aceleiai tabele i o putei crea prin corelarea a dou cmpuri ale aceleiai tabele.
Pag. 35

Access v d posibilitatea de a opta doar pentru inner join, left outer join sau right outer join. Pentru relaia Profesor/Titlu, alegei n cutia de dialog Join Properties opiunea cu nunrul unu, inner join. 2.3.5 Asigurarea integritii refereniale Access va asigura n mod automat integritatea referenial pentru dou tabele corelate dac vei valida caseta de validare Enforce Referential Integrity din cutia de dialog Relationships. Astfel, dac n tabela Profesor exist o valoare pentru cmpul IdTitlu, va trebui ca acea valoare s existe i n tabela Titlu. De asemenea, nu vei putea terge o nregistrare din tabela Titlu dac tipul respectiv este atribuit unui profesor din tabela Profesor. Dac vei ncerca s introducei date sau s le modificai astfel nct s fie nclcat integritatea referenial, Access va afia o cutie de dialog n care v va spune c aciunea dorit nu se poate finaliza. De asemenea, v va spune i care dintre tabelele corelate cauzeaz violarea integritii refereniale. Access v d i posibilitatea de a specifica n ce mod dorii s fie rezolvate problemele legate de integritatea referenial. Astfel, putei alege ca modificrile sau tergerile dintr-o tabel s se reflecte i n tabela corelat, pentru ca integritatea referenial s nu fie afectat. Prima opiune v este oferit prin intermediul casetei de validare Cascade Update Related Fields. Aceast opiune v asigurc orice modificare a valorilor din cheia primar a unei tabele va duce automat la modificarea corespunztoare a valorilor din cheia strin a tabelei corelate. Astfel, dac modificai o valoare a coloanei IdTitlu din tabela Titlu, Access va modifica, n consecin, toate apariiile acelei valori n coloana IdTitlu a tabelei Profesor. 2.3.6. Modificarea relaiilor existente Pentru a modifica o relaie existent ntre dou tabele, adugai tabelele respective n fereastra Relationships. Apoi facei dublu clic pe linia ce reprezint relaia pe care dorii s o modificai. Va aprea cutia de dialog Relationships, n care putei efectua modificrile dorite. Pentru a terge o relaie, selectai-o fcnd clic pe linia care o reprezint i apoi apsai tasta Delete. 2.4.1 Importul datelor Pentru a importa un fiier n Access, selectai comanda File | Get External Data | Import sau facei clic dreapta n fereastra Database i alegei din meniul derulant comanda Import. Va aprea cutia de dialog Import (fig.2.17).

Pag. 36

Fig. 2.17. Importul datelor Aici putei alege fiierul pe care dorii s-l importai. n funcie de formatul de fiier ales, Access, va prezenta cutiile de dialog corespunztoare, n care vei putea specifica opiunile dumneavoastr. 2.4.2 Exportul datelor Access v d posibilitatea de a exporta toate tipurile de obiecte dintr-o baz de date. Totui, exist cteva reguli de care este bine s inei cont: putei exporta o tabel sau o interogare fie salvnd-o ntr-un fiier nou, fie ntr-o nou tabel sau interogare din baza de date curent. putei exporta un formular sau un raport n unul din formatele: Access, Excel, text i RTF (Rich Text Format). n toate cazurile n afar de formatul Access , vei exporta i datele ce creeaz formularul sau raportul. Putei exporta un modul numai n formatul Access sau text. Pentru a exporta un obiect din baza de date curent, selectai-l n fereastra Database i alegei comanda File | Save As | Export. Va aprea o cutie de dialog care v va ntreba dac dorii s salvai obiectul ntr-un fiier extern sau n baza de date curent. Dac selectai prima opiune, va aprea cutia de dialog prezentat n fig. .

Pag. 37

Fig. 2.17. Exportul datelor Aici putei alege tipul de fiier extern n care dorii s salvai obiectul i locaia acestuia. n funcie de formatul ales, Access va prezenta diferite interfee. 2.4.3. Formate standard Access v pune la dispoziie peste unsprezece formate pentru exportul datelor i peste nou formate pentru import. De asemenea, avei la ndemn i trei experi : Import Text Wizard, care v ajut s importai date din formatul text, Import Spreadsheet Wizard, pentru importul tabelelor Excel sau lotus i Export Text Wizard, pentru exportul datelor n format text.

Microsoft FoxPro (.DBF): putei importa sau exporta date n format FoxPro, versiunile de la 2.0 la 3.0. DBase (.DBF): putei importa sau exporta date n format dBase, versiunile III, IV i V. Paradox (.DB): putei importa sau exporta date n formatul Paradox, versiunile 3.x, 4.0 i 5.0. Baze de date ODBC: pentru a importa sau exporta date din sau n Microsoft SQL Server, Sybase SQL Server, Oracle Server sau alte formate, trebuie s avei instalat un driver ODBC. Microsoft Excel (.XLS): putei importa sau exporta date n format Excel, versiunile 3.0 7.0 i 97. Lotus: putei importa sau exporta date n format Lotus 1-2-3. Text: formatele text n care putei importa sau exporta date sunt: .TXT, .CSV, .TAB, .ASC. n plus, putei exporta n formatul .RTF (Rich Text Format). Access: formatele Access n care putei importa sau exporta date sunt: .MDB, .MDW, .MDA i .MDE. HTML: formatele disponibile pentru importul i exportul datelor sunt .HTML i .HTM. Putei ataa ieirea unui obiect la un mesaj e-mail.
Pag. 38

CAP:3. Interogri Interogrile sunt una dintre cele mai puternice componente din Access 97. Ele v permit s regsii anumite informaii stocate n baza de date. Abilitatea de a crea interogri este considerat a fi creierul unui sistem de baze de date relaional, deoarece nu conteaz doar faptul c putei stoca informaii, ci mai ales faptul c putei regsi exact informaia de care avei nevoie la un moment dat. n Access, interogrile dein un rol foarte important (ele pot fi sursa unui raport, formular sau a listei de valori posibile pentru o coloan de cutare). Exist dou modaliti de creare a interogrilor n Access: folosirea ferestrei QBE (Query by Example), numit i Query Design, sau introducerea direct de comenzi SQL.indiferent pe care dintre cele dou moduri le folosii, intern, interogarea va fi definit tot ca o instruciune SQL. Access SQL este dialect care difer substanial de standardul ANSI. 3.1. Folosirea ferestrei QBE Dup cum putei observa din fig.3.1, fereastra QBE este compus din dou pri. Partea de sus (pe care o vom numi i panou) prezint tabelele pe care se bazeaz interogarea i relaiile dintre ele. Partea de jos, numit i grila QBE, precizeaz cmpurile tabelelor i criteriile pe baza crora este definit interogarea. Dei are limitrile sale, folosirea ferestrei QBE este un mod simplu i intuitiv de a crea o interogare.

Fig. 3.1. Fereastra QBE (Query by Example)


Pag. 39

3.1.1. Specificarea surselor de date Putei specifica sursele de date pe care se bazeaz o interogare(tabele sau alte interogri) fie n timpul crerii interogrii, fie dup aceea prin intermediul cutiei de dialog Show Table. Aceasta va aprea automat la crearea unei noi interogri sau dac alegeti comanda Query | Show Table. Aici putei selecta tabelele sau interogrile ce se vor servi drept surs de date pentru interogarea curent. O alt cale prin care putei aduga tabele sau interogri la interogarea curent este de a le plasa din fereastra Database n panoul ferestrei QBE. Pentru a defini o interogare,trebuie s avei cel puin o tabel sau o interogare n panoul ferestrei QBE, i cel puin un cmp n grila ferestrei QBE. Dup cum spuneam, rezultatele unei interogri sunt prezentate sub forma unei tabele virtuale, ale crei cmpuri sunt cele specificate n grila QBE. Datele acestei tabele sunt selectate din cmpurile din grila QBE pe baza unor criterii. Dac dorii ca rezultatul interogrii s conin anumite cmpuri ale unei tabele sau interogrii din panoul ferestrei QBE, introducei-le n grila QBE n felul urmtor: selectai-le n tabela sau interogarea respectiv (fcnd clic pe ele) i deplasai-le peste grila QBE. Pentru a introduce n gril toate cmpurile unei tabele, sau interogri din panou, selectai asteriscul care apare imediat sub bara de titlu i deplasati-l peste gril. Chiar dac rezultatul interogrii va conine toate cmpurile din tabel (rezultatul l putei vedea n modul Datasheet View, n care trecei cu comanda View | Datasheet View), n grila QBE va aprea doar asteriscul. Dac dorii s stabilii anumite criterii pe baza crora datele unui cmp s fie incluse n rezultatul interogrii, cmpul trebuie s fie vizibil n gril, aa c va trebui s-l introduceti separat. O alt cale de a introduce n grila QBE un cmp este s facei clic n prima celul liber din linia Field a grilei i s apsai butonul don dreapta. Se va deschide o list cu toate cmpurile tavelelor i interogrilor din panoul QBE. O dat selectat un cmp, se va completa automat i celula corespunztoare din linia Table. 3.1.2. Proprietile interogrilor Cnd vorbim despre proprietile unei interogri ne referim de fapt la proprietile mai multor obiecte: ale interogrii ca obiect n sine, ale tabelelor, ale cmpurilor acestora i relaiilor. Dac selectai o interogare din pagina Queries a ferestrei Database i apoi apsai butonul Properties de pe bara cu instrumente, se va deschide cutia de dialog prezentat n figur:

Pag. 40

Fig. 3.2. Proprietile interogriilor Pentru fiecare obiect putei introduce o descriere de maximum 255 de caractere. Pe lng descriere, cutia de dialog Properties v arat cnd a fost creat obiectul, cnd a fost modificat ultima dat i cine este proprietarul lui. Dac validai caseta Hidden, obiectul nu va mai aprea n fereastra Database (aceasta este o msur de securitate). Cea de-a doua caset de validare v las s specificai dac obiectul este replicabil. Pentru a vedea i obiectele cu proprietatea Hidden (ascunse), alegei comanda Tool | Options i, n pagina View, validai caseta Hidden Objects. Pentru a vedea pagina de proprieti a ferestrei QBE, facei dublu-clic n panou. Aceasta este o pagin detaliat de proprieti a interogrii. n continuare, vom prezenta n detaliu aceste proprieti: Description: aici putei introduce o descriere de maximum 255 de caractere a interogrii. Output All Fields: valoare Yes va introduce n rezultatele interogrii toate cmpurile tabelelor/interogrilor din panoul QBE. Top Values: returneaz numai primele n sau n% nregistrri. Unique Values: dac valoarea sa este Yes, returneaz numai nregistrrile unice pentru cmpurile din grila QBE. De exemplu, dac n gril se afl numai cmpul IdCurs al tacelei Curs_Stud, vom vedea numai valorile unice a lui IdCurs. Unique Records: dac valoarea sa este Yes, returneaz numai nregistrrile unice n cadrul sursei de date (tabel sau interogare). Run Permissions: specific dac interogarea ruleaz cu drepturile proprietarului (owners) sau a utilizatorului (users). Astfel, putei da unui utilizator permisiunea de a efectua o aciune pe care, altfel, nu ar avea drept s o execute.
Pag. 41

Source Database: putei specifica o baz de date extern care conine tabelele i interogrile surs. Valoarea implicit este baza de date curent. Source Connect String: numele i versiunea aplicaiei n care a fost creat baza de date extern, urmate de punct i virgul (ex: dBase IV;). Record Locks: aceast proprietate este util pentru sistemele multiuser i specific modul n care sunt blocate datele n timpul execuiei interogrii. ODBC Timeout: timpul, n secunde, n care se ntrerupe execuia interogrii dac serverul ODBC nu rspunde. Filter: funcioneaz asemntor cu opiunea Criteria a grilei QBE. Este completat automat n timpul rulrii interogrii dac n modul Datasheet View vei folosi comentile Filter by Form, Filter by Selection sau Advanced Filter/Sort din meniul Records. V permite s selectai anumite nregistrri din rezultatul interogrii. Order By: funcioneaz asemntor cu seciunea Sort a grilai QBE. Este completat automat n timpul rulrii interogrii dac n modul Datasheet View selectei o coloan (sau dou) i apoi apsai butonul Sort Ascending sau ort Descending de pe bara cu instrumente.

Acestea au fost proprietile unei interogri privite ca ntreg. Pe lng acestea, putei stabili i unele proprieti ale obiectelor ce compun interogarea: tabele, alte interogri i cmpuri.Proprietile lor le putei vedea n modul Design View selectndu-le i, apoi, alegnd comanda View | Properties.

Cele dou proprieti disponibile pentru tabele sunt urmtoarele: Alias: V d posibilitatea s specificai un nume alternativ, temporar pentru o tabel. Este util n cazul n care interogarea se bazeaz pe o asociere self-join. Source: Este asemntoare cu proprittile Source Database sau Source Connect String ale unei interogri. Sac interogarea folosete tabele din mai multe baze de date externe, stabilii acest proprietate pentru fiecare tabel n parte.

Fiecare cmp din grila QBE are proprietaile sale. Cutia de dialog Properties pentru un cmp are dou pagini: General i Lookup. Iat care sunt aceste proprieti: Descriptions: Conine o descriere a cmpului, de maximum 255 de caractere. Format: V permite s specificai modul n care vor fi afiate i tiprite datele din cmpul respectiv. Imput Mask: Funcioneaz ca i proprietatea Format, cu diferena c aici putei preciza un format pentru introducerea datelor. Dac apsai butonul din dreapta cmpului Imput Mask, va porni un wizard care v va ajuta s specificai modul n care vrei s arate datele. Decimal Places: Pentru cmpurile numerice, precizeaz numrul de zecimale care vor fi afiate.
Pag. 42

Caption:Titlul sub care va aprea cmpul n modul Datasheet View sau pe un formular. Display Control: Tipurile de control folosite pentru afiarea datelor cmpului respectiv n modul Datasheet View sau pe un formular sunt: text box, list box sau combo box. Acestea sunt disponibile numai pentru cmpuri numerice, text i de tip yes/no. Dac celectai list box sau combo box, vor aprea atributele corespunztoare.

Not: pentru acelai cmp, putei stabili caliti diferite n interogri diferite. Dac un formular este bazat pe o tabel, atributele cmpurilor sunt cele specificate n tabel. Dac formularul se bazeaz pe o interogare, atributele cmpurilor sunt cele specificate n interogare.

3.2. Tipuri de interogri Exist interogri pentru regsirea datelor (cele de tip selectare) i pentru modificarea datelor (inserare, tergere i actualizare). Pn acum am vorbit numai despre interogri simple de tip selectare. Pentru a crea o astfel de interogare nu trebuie dect s folosii fereastra QBE pentru a specifica sursele datelor pe care dorii s le aflai i, eventual, tipul de asociere. Rezultatele interogrii le putei vedea intrnd n modul Datasheet pentru acea interogare. Pentru aceasta, alegei comanda Query | Run sau apsai butonul Run de pe bara cu instrumente. n afar de interogrile de tip selectare simple, Acces v mai ofer un tip de interogri pentru regsirea datelor: interogrile agregat. 3.2.1. Interogri agregat Interogrile agregat v dau posibilitatea de a analiza datele, calculnd sume, extreme, medii, dispersii etc. Ele v pot fi foarte utile la ntocmirea rapoartelor statistice sau a graficelor. Cele dou tipuri de interogri agregat pe care Access le pune la dispoziie sunt Totals i Crosstab. 3.2.2. Interogri de tip totals S presupunem c dorii s aflai numrul de studeni nscrii n fiecare curs opional. Interogarea care v va furniza aceste informaii este prezentat n fig. n modul Design View i n fig. 3.3 n modul Datasheet View (rezultatele).

Pag. 43

Fig. 3.3. Mod de realizare a interogrilor de tip Total Pentru a crea o interogare de tip totals, procedai astfel: 1. creai o nou interogare de tip select i adugai tabelele necesare la panoul ferestrei Qbe. 2. introducei n grila ferestrei QBE coloanele pentru care dorii s calculai totalul, media, extremele etc.

Fig. 3.4. Mod de realizare a interogrilor de tip Medie

Pag. 44

3.

schimbai tipul interogrii n Totals, alegnd comanda View | Totals sau apsnd butonul Totals de pe bara cu instrumente. Observai c n cmpul Total al grilei QBE va aprea n dreptul coloanelor selectate opiunea Group By.

4. selectai n grila QBE coloana n funcie de care dorii s aflai totalul, suma media etc. coloanelor cu opiunea Group By. n cmpul Total corespunztor acestei coloane alegei una dintre funciile agregat, care s efectueze operaia dorit. 5. stabilii eventuale criterii i rulai interogarea. n continuare, vom vorbi mai pe larg despre opiunile unei interogri de tip Totals. Fiecare coloan selectat n grila ferestrei QBE trebuie s aib specificat o opiune n cmpul Total. Iat care pot fi aceste opiuni:

Group By: folosit pentru a defini grupurile de nregistrri pentru care dorii s calculai totalurile. Dac n grila QBE selectai o singur coloan, cu opiunea Group By, interogarea va returna o linie pentru fiecare valoare unic a coloanei respective. Dac selectai mai multe cmpuri cu opiunea Group By, rezultatele interogrii vor conine cte o linie pentru fiecare combinaie unic de valori ale cmpurilor respective. Count: funcie agregat folosit pentru a numra nregistrrile dintr-un grup ale cror valori sunt diferite de null. Sum: funcie agregat folosit pentru a calcula suma valorilor unui cmp, pentru fiecare grup definit de opiunea Group By. Min: funcie agregat ce calculeaz valoarea minim a unui cmp pentru fiecare grup. Valorile null nu sunt luaten considerare. Max: funcie agregat ce calculeaz valoarea maxim a unui cmp pentru fiecare grup. Valorile null nu sunt luaten considerare. First: funcie agregat folosit pentru a afla prima valoare (ntr-o anumit ordine) a unui cmp pentru fiecare grup. Valorile null nu sunt luate n considerare. Last: funcie agregat folosit pentru a afla ultima valoare (ntr-o anumit ordine) a unui cmp pentru fiecare grup. Valorile null nu sunt luate n considerare. Avg: funcie agregat ce calculeaz media valorilor unui unui cmp pentru fiecare grup definit prin opiunea Group By. Valorile null nu sunt luate n considerare. StDev: funcie agregat ce calculeaz deviaia standard a valorilor unui unui cmp pentru fiecare grup. Deviaia standard este un estimator statistic al dispersiei distribuiei valorilor unui cmp. Valorile null nu sunt luate n considerare.
Pag. 45

Var: funcie agregat ce calculeaz dispersia valorilor unui unui cmp pentru fiecare grup. Dispersia este ptratul deviaiei standard. Valorile null nu sunt luate n considerare. Expression: folosit pentru a calcula alte totaluri dect cele oferite de funciile agregat, prin intermediul unei expresii introduse de dumneavoastr. O expresie poate fi orice combinaie de oparatori, contante, nume de coloane,

funcii agregat, etc., prin evaluarea creia obinem o singur valoare. O astfel de expresie este Count(*), ce calculeaz numrul total de nregistrri dintr-un grup, incluznd inregistrrile care conin valoarea null. Where: clauz folosit pentru specificarea unor criterii care s limiteze rezultatele interogrii. Cnd folosii aceast opiune, devalidai caseta din linia Show a grilei QBE corespunztoare coloanei asupra crei impunei limitrile. 3.2.2.1 Sortarea rezultatelor unei interogri de tip totals Access v d posibilitatea de a sorta cresctor sau descresctor rezultatele unei interogri, alegnd n cmpul Sort al grilei QBE opiunea Ascending sau Descending. Dac folosii mai multe coloane cu opiunea Group By, Access va sorta automat datele, nti n funcie de prima coloan din grila QBE, apoi n funcie de a doua, etc., de la stnga spre dreapta. n exemplul din figura., nregistrrile sunt sortate cresctor, nti n funcie de numele studentului i apoi de prenume. Dac am fi dorit ca interogrile s fie sortate nti n funcie de prenume i apoi n funcie de nume (ca n figura), nu ar fi trebuit dect s trecem n grila QBE coloana PrenumeSt n stnga coloanei NumeSt. Access urmeaz urmtoarele reguli pentru sortarea rezultatelor unei interogri de tip Totals: Dac n cmpul Sort al grilei QBE corespunztor coloanelor cu opiunea Group By alegei Not sorted, adic nu specificai modul n care s fie sortate datele, Access va sorta cresctor aceste coloane, precedena fiind de la stnga spre dreapta. Dac n cmpul Sort al grilei QBE corespunztor coloanelor cu opiunea Group By specificai opiunea Ascending sau Descending, Access va sorta cresctor respectiv descresctor aceste coloane, precedena fiind de la stnga spre dreapta. Dac specificai ordinea de sortare numai pentru anumite coloane (pentru unele dintre coloanele cu opiunea Group By, pentru coloanele agregat sau pentru o combinaie de coloane agregat i Group By), Access va sorta numai coloanele pentru care ai specificat ordinea respectnd precedena de la stnga spre dreapta.

Pag. 46

3.2.2.2 Stabilirea criteriilor S presupunem c dorii s aflai care sunt studenii al cror nume ncepe cu litera P i a cror medie este peste 7. Figura prezint interogarea care v furnizeaz aceste informaii n modul Design View.

Fig. 3.5.Exemplu de realizare a interogrilor Primul criteriu este deci aplicat unei coloane avnd opiunea Group By, NumeSt, iar cel de-al doilea criteriu este aplicat unei coloane agregat. Criteriile impuse asupra coloanelor avnd opiunea 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 funciile agregat. Dac dorii totui s impunei limitri i asupra datelor ce vor fi supuse operaiilor de agregare, putei face acest lucru prin intermediul opiunii Where. S presupunem c dorim s aflm media cursurilor la care studenii al cror nume ncepe cu P au luat peste nota 7. acest lucru l putei realiza dac tergei criteriul >7 impus coloanei agregat Media i l aplicai coloanei Nota avnd opiunea Where, ca n fig. 3.6.

Pag. 47

Fig. 3.6.Exemplu de realizare a interogrilor Not: criteriile asupra coloanelor agregat sau cu opiunea Group By sunt specificate n SQL cu ajutorul clauzei HAVING, iar criteriile asupra coloanelor cu opiunea Where sunt implicate n SQL n cadrul clauzei WHERE. 3.2.3. Interogri de tip Crosstab Interogrile de tip Crosstab se aseamn cu cele de tipul Totals prin faptul c v permit aplicarea operaiilor de agregare asupra datelor. Ceea ce le deosebete este modul de afiare a rezultatelor. Rezultatele unei interogri Crosstab sunt prezentate sub forma unei tabele n care att coloanele, ct i liniile, au titluri. S presupunem c dorim s aflm, pentru fiecare catedr, numrul de profesori din fiecare categorie (preparatori, asisteni, lectori, etc.).Ar fi convenabil ca datele s fie afiate ntr-un tabel avnd catedrele drept capete de linii i titlurile drept capete de coloane. Pentru aceasta, vei crea o interogare Crosstab (pe care o putei numi Total_Profesori_Crt), n felul urmtor: 1. Creai o nou interogare de tip select i adugai tabelele necesare. 2. Introducei n grila QBE cele dou cmpuri de valori care vor defini grupurile (de exemplu, Catedra i Titlu). 3. Schimbai tipul interogrii n Crosstab, alegnd comanda Query | Crosstab Query. n cmpul Total al grilei QBE corespunztor celor dou coloane va fi selectat opiunea Group By. 4. Alegei care dintre cele dou cmpuri va da numele liniilor i care pe cele ale coloanelor n cadrul tabelei cu rezultatele interogrii, selectnd opiunea Row Heading, respectiv Column Heading n celula corespunztoare din cmpul Crosstab al grilei QBE. 5. n funcie de datele pe care dorii s le aflai, introducei ntr-o nou coloan a grilei QBE opiunile dumneavoastr. Pentru exemplul nostru, introducei n cmpul Field expresia IdProf: Count(*), n cmpul Total selectai Expression, iar n cmpul Crosstab selectai opiunea Value.
Pag. 48

6. Stabilii eventuale criterii i rulai interogarea. Figura prezint interogarea n modul Design View. Cmpul care d numele coloanelor din tabela cu rezultatele interogrii poart numele de pivot. n cazul interogrii prezentate n figura cmpul pivot este Titlu iar n urmtoarea este prezentat rezultatul.

Fig. 3.7. Exemplu de realizare a interogrilor de tip Crosstab 3.2.3.1 Crearea totalurilor pe linii Putei crea o coloan care s arate totalul valorilor pe o linie, adugnd la grila QBE un duplicat al coloanei care are opiunea Value. Duplicatul trebuie s aib un alias(pe care l putei introduce in cmpul Field corespunztor, naintea expresiei i urmat de dou puncte) i s aib opiunea Row Heading n cmpul Crosstab.

Pag. 49

Fig. 3.8. Exemplu de realizare a totalurilor pe linie pentru interogrilor de tip Crosstab 3.2.3.2 Limitrile intergrilor Crosstab Dup cum ai observat, ntr-o interogare de tip Crosstab numele coloanelor sunt luate dintre valorile coloanei cu opiunea Column Heading. De aceea, ele ar putea s ncalce regulile impuse numelor de coloane. De exemplu, dac o coloan de tip text, coninnd, printre altele i unele valori precum ON, AS sau alte cuvinte rezervate, va da numele coloanelor ntr-o interogare crosstab, acea interogare nu va putea fi folosit ca surs de date pentru un raport, grafic sau alt interogare. De regul, putei rezolva aceast problem incluznd numele ilegale ntre paranteze drepte ([ON]). n al doilea rnd, n interogrile crosstab nu putei impune criterii asupra cmpurilor cu opiunea Value. De exemplu, dac vom dori ca interogarea Total_Profesori_Crt s ne dea catedrele care au mai mult de 2 profesori din fiecare categorie (titlu), nu vom putea specifica >=2 n cmpul Criteria al coloanei de tip Value. Putei nltura acest inconvenient cu ajutorul unei interogri de tip Totals, pe care o vom folosi n interogarea Crosstab. Creai deci o interogare de tip Totals, numit Total_Profesori, bazat pe tabelele Profesor i Titlu, n care cmpurile Catedra i Titlu s aib opiunea Group By, iar pentru agregare s se foloseasc expresia: Count (*) (ca n fig. ), pentru care putei impune i criteriul >=2. Dai cmpului agregat numele TotalPr.
Pag. 50

Apoi, creai interogarea Cross_Total_Profesori, de tip Crosstab i bazai-o pe Total_Profesori, n care catedra va fi Row Heading, Titlu va fi Column Heading i TotalPr va avea opiunea Value. Deoarece datele din coloana TotalPr a interogrii Total_Profesori_Crt au fost agregate o dat, alegei n cmpul Total al grilei QBE corespunztor lui TotalPr o funcie agregat care, aplicat unei singure valori, s de ca rezultat acea valoare (Sum, Min, Max, Avg, First, Last). Valori NULL n coloane Row Heading sau Column Heading S presupunem c n tabela Profesor exist i nregistrri pentru care cmpul IdTitlu are valoarea NULL. n acest caz, rezultatele interogrii Total_Profesor_Crt vor conine i o coloan al crui nume va fi <>. Aceast problem poate fi rectificat prin dou metode. Prima ar fi s nu lum n considerare nregistrrile care conin valoarea Null n cmpul IdTitlu. Acest lucru l putem realiza introducnd criteriul Is Not Null n cmpul Criteria corespunztor coloanei Titlu. n acest mod, rezultatele interogrii nu vor da nici un fel de informaii despre profesorii pentru care titlul nu a fost specificat. Dac totui, nu ne putem lipsi de aceste informaii, vom face n aa fel nct n locul semnului <>, pentru numele coloanei s apar un text dorit de noi n cazul n care valoarea este NULL. Pentru aceasta, vom introduce n cmpul Field al grilei QBE corespunztor coloanei cu opiunea Column Heading (care conine valorile null i d numele coloanelor tabelei cu rezultate), expresia: IIf (IsNull([Titlu]), Nespecificat, [Titlu]) Expresia de mai sus se traduce astfel: Dac valoarea cmpului Titlu este Null, atunci pentru titlul coloanei din tabela de rezultate se va afia Nespecificat; altfel, se va afia valoarea din cmpul Titlu. 3.2.4. Interogri pentru definirea i modificarea datelor Interogrile pentru definirea i modificarea datelor v dau posibilitatea de a actualiza eficient, printr-o singur operaie, mai multenregistrri. Cele 4 tipuri de interogri care pot efectua diferite aciuni asupra datelor sunt: interogri de tipul Make Table, Update, Append i Delete. 3.2.4.1. Interogri de tip Make Table Interogrile de tip Make Table v ajut s creai tabele noi furnizate cu tabele existente sau alte interogri. Ele v pot fi utile dac dorii s facei o copie de siguran a unei tabele sau s exportai date ctre alte baze de date Access sau ODBC. Pentru a crea o interogare de tipul Make Table, deschidei o nou interogare i introducei n panoul ferestrei QBE tabelele (sau interogrile) care vor furniza datele pentru noua tabel. Apoi selectai n grila QBE coloanele care vor compune noua tabel i, eventual, specificai criterii pentru limotarea datelor. Dac vei dori ca n noua tabel coloanele s aib alte nume, introducei aceste nume n cmpul Field al
Pag. 51

grilei QBE, naintea numelor coloanelor existente i urmate de dou puncte (de exemplu, Nume Profesor: Nume). Pe urm, alegei comanda Query | Make Table Query sau apsai butonul Query Type de pe bara cu instrumente i alegei Make Table Query. Va aprea cutia de dialog Make Table, n care va trebui s specificai numele tabelei pe care vrei s o creai i, n cazul ncare tabela va face parte dintr-o baz de date extern, numele acesteia cu calea complet. Dac baza de date extern nu este Access, introducei ntre ghilimele i urmat de punct i virgul numele aplicaiei n care a fost creat (de exemplu: c:\my documents\dbl Paradox;). Putei vedea noua tabel nainte ca ea s fie creat, trecnd n modul Datasheet View. Dac rezultatele sunt corecte, rulai interogarea i noua tabel va fi creat; dac nu, ntoarcei-v n modul Design View i efectuai modificrile necesare. Dac, ulterior, vei dori s actualizai datele din tabela creat astfel, pentru ca ele s reflecte modificrile din tabela de baz, nu va trebui dect s rulai din nou interogarea respectiv. 3.2.5. Interogri de tip Append Pentru aceasta, vom crea o nou interogare de tip Append (numit AppendProf), alegnd comanda Query | Append Query. Va aprea cutia de dialog Append, n care va trebui s specificai numele tabelei n care vor fi introduse datelei baza de date n care se afl aceast tabel (interogarea nu va putea fi executat dac tabela nu exist deja). Apoi, cu ajutorul ferestrei Qbe, vei preciza tabelele i cmpurile acestora din care vor proveni datele, precum i cmpurile tabelei destinaie. Dup cum putei observa n fig., grila QBE a unei interogri de tip Append conine i linia Append To, n care, pentru fiecare cmp-surs selectat n gril, putei alege cmpul destinaie (cu condiia ca cele 2 cmpuri s aib acelai tip de date). Not: n cazul ncare cmpurile surs i destinaie au acelai nume, Access va alege automat cmpul destinaie, n momentul selectrii cmpului surs n grila QBE.

Acum, tot ce v rmne de fcut este s rulai interogarea i s deschidei tabela ProfMate n modul Datasheet View pentru a vedea noile nregistrri. 3.2.6 Interogri de tip Update Interogrile de tip Update v sunt utile atunci cnd dorii s modificai mai multe nregistrri o dat. S presupunem c toate salariile mai mici de 1.000.000 lei se majoreaz cu 15%. Pentru a actualiza n consecin datele din tabela Titlu, vom crea tabela Majorare_Salariu, de tip Update. Pentru aceasta, creai o nou interogare, introducei tabela Titlu n panoul ferestrei QBE i schimbai tipul interogrii n Update, alegnd comanda Query | Update. n grila ferestrei QBE va aprea o nou linie, Update To, n care vei introduce regula pe baza creia se va face actualizarea
Pag. 52

(n acest caz, [Salariu] + [Salariu]*.15). n cmpul Criteria al grilei QBE vom limita nregistrrile ce vor fi actualizate la cele pentru care salariul este 1.000.000. Interogrile de tip Update au anumite limitri care fac s nu poat fi executate uneori. naceste situaii, Access va da un mesaj de eroare. Iat care sunt cele mai frecvente situaii n care o interogare de tip Update nu va putea fi executat: interogarea este bazat pe alt nterogare de tip Crosstab, Union sau care conine totaluri; interogarea este bazat pe 2 tabele ntre care exist o relaie de tipul 1:m (integritatea referenial ar putea fi violat); interogarea ncearc s scrie un text ntr-un cmp de tip Number; interogarea ncalc regulile de validare impuse asupra datelor unui cmp la nivel de tabel. 3.2.7 Interogri de tip Delete Folosind o interogare de tip Delete, putei terge dintr-o tabel mai multe nregistrri o dat. Not: nainte de a executa o interogare de tip Delete, este bine s creai pe aceleai criterii o interogare de tip Select care s regseasc datele pe care dorii s le tergei. Dac ele sunt corecte, putei rula interogarea Delete fr grij. 3.2.8 Interogri cu parametri Putei crea interogri care s permit utilizatorului specificarea unui criteriu n timpul rulrii interogrii. Pentru a crea o astfel de, interogare va trebui s : introducei n cmpul Criteria corespunztor coloanei asupra creia vor fi impuse limitrile un text prin care s cerei utilizatorului specificarea criteriului (textul va fi inclus ntre paranteze drepte, ca n figura ) folosii comanda Query / Parameters pentru a specifica tipul datelor ce vor fi introduse de utilizator n timpul rulrii interogrii (figura)

3.3. Expresii i funcii n interogri Expresiile sunt instrumente folosite de programatori pentru a spori performanele aplicaiilor. Ele sunt formate dintr-o combinaie de operatori, constante, variabile i funcii care au ca rezultat o numit valoare. Expresiiloe pot fi folosite n interogri, formulare, rapoarte, proprieti ale cmpurilor tabelelor sau ale controalelor din formulare i rapoarte, n funcii macro i module. Ele pot fi folosite pentru a stabili criterii, ca reguli de validare sau ca baz pentru coloanele calculate. De exemplu, dac ntr-o interogare introducei urmtoara expresie n cmpul Criteria corespunztor unei coloane de tip Date/Time (tip folosit pentru stocarea datelor i orelor), ea va returna numai nregistrrile mai vechi de 3 zile: <Now () + 3.

Pag. 53

3.3.1. Prile componente ale expresiilor Expresiile pot fi privite ca nite propoziii matematice, n componena crora pot intra: operatori: simboluri matematice; constante: valori numerice sau iruri de caractere ce nu i schimb valoarea; funcii: proceduri ce returneaz o valoare (de exemplu, funcia Now returneaz data curent); nume de cmpuri: de obicei sunt introduse ntre paranteze drepte

Operatori Operatorii joac un rol important n cadrul expresiilor. Exist mai multe tipuri de operatori pe care vi le prezentm n cele ce urmeaz. Operatori aritmetici Sunt folosii pentru a efectua calcule matematice cu 2 sau mai multe valori numerice. ^ ridic un numr la o putere (de exemplu 2^3=23) * nmulete 2 numere / mparte 2 numere i returneaz un numr real \ mparte 2 numere i returneaz un numr ntreg MOD returneaz restul mpririi a 2 numere + adun 2 numere scade 2 numere

Operatori de concatenare Sunt folosii pentru a lega 2 iruri de caractere. & concateneaz 2 iruri de caractere + adun valorile a 2 cmpuri numerice. Poate fi folosit i pentru a concatena iruri de caractere. Operatori de comparaie Sunt folosii pentru a compara valorile a 2 sau mai multe cmpuri i/sau expresii. = verific egalitatea a 2 valori <> verific dac 2 valori sunt diferite < verific dac o valoare este strict mai mic dect alta
Pag. 54

> <= >=

verific dac o valoare este strict mai mare dect 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 operaii logice. Not introduce o negaie (de exemplu, Not T* introdus ntr-o interogare n cmpul Criteria al coloanei Nume va regsi toi studenii ale cror nume nu ncep cu litera T) And efectueaz conjuncia a 2 valori Or efectueaz disjuncia a 2 valori Xor efectueaz disjuncia exclusiv a 2 valori Eqv verific echivalena a 2 valori Imp operatorul implic Precedena operatorilor De multe ori, a calcula valoarea unei expresii implic efectuarea mai multor operaii. Aceste operaii se efectueaz ntr-o anumit ordine predefinit, care este i ordinea n care au fost prezentai operatorii mai sus. Dac dorii o schimbare n aceast ordine (de exemplu s efectuai nti o operaie de adunare i apoi o ridicare la putere) folosii parantezele pentru a preciza care operator va fi aplicat primul. Constante Constantele sunt un fel de cuvinte rezervate, n sensul c valoarea lor nu se schimb pe parcursul rulrii aplicaiei. Ele se mpart n 3 grupe, pe care vi le prezentm n continuare. Constante predefinite Acestea sunt definite de programator, de obicei n module. Declaraia unei constante predefinite ncepe cu cuvntul cheie CONST. De exemplu: CONST Pi = 3.14 Dup ce au fost declarate, ele pot fi folosite oriunde.

Constante intrinsece Sunt constante furnizate de Visual Basic (cum ar fi VbString sau VarType) i nu trebuie s fie declarate separat. Programatorul nu poate defini o constant care s aib acelai nume ca o constant intrinsec. Constantele intrinseci se pot folosi numai n module.

Pag. 55

Constante sistem Yes, No, On, Off i Null sunt cele 5 componente sistem. Ele pot fi folosite n orice obiect din baza de date, mai puin n module. Funcii Funciile pot intra n componena expresiilor. Ele acioneaz ca i operatorii, dar nu sunt reprezentate prin simboluri. De exemplu, operatorul + i funcia Sum efectueaz aceeai operaie: cea de adunare. Diferena este aceea c funcia Sum poate fi aplicat mai multor valori o dat. Access v pune la dispoziiepeste 160 de funcii, dintre care cteva le putei vedea n cmpul Totals al grilei QBE a unei interogri de tip Totals. 3.4. Lucrul cu date i ore n Access, expresiile pot conine date sau ore. Acestea sunt stocate ca numere reale pe 64 de bii. Intervalul maxim pentru date este 1 Ian 100 i 31 Dec 9999, iar cel pentru ore, ntre 0:00:00 i 23:59:59. Dup ce o dat/or a fost introdus ntr-o expresie, Access parcurge expresia i recunoate formatul respectiv, incluznd data (ora) ntre 2 caractere diez (#). Access v pune la dispoziie aproximativ 22 de funcii pentru lucrul cu date i ore. De exemplu, n interogarea Vechime, prezentat n figura., am folosit funciile Yes i Now pentru a calcula ci ani au trecut de la angajarea unui profesor i pn n prezent. Funcia Year () returneaz numai anul dintr-o dat complet, iar funcia Now () returneazdata (i ora) curent. Exist cteva formate predefinite pentru afiarea datelor/orelor n formulare, rapoarte, n modul Datasheet View al unei tabele sau interogri etc. tabelul v prezint o list cu aceste formate, pe care o putei vedea i n cmpul proprietii Format a unei coloane de tip Date/Time a unei tabele (n modul Table Design). Format General Short date Medium date Long date Short time Medium time Long time Afiare (exemplu) 01/01/98 12:00:00 AM 01/01/98 1-Jan-98 Thursday, January, 1, 1998 00:00:00 12:00 AM 12:00:00 AM

Prin intermediul expresiilor putei s personalizai modul cum vor fi afiate datele/orele. n tabel sunt descrise diferite formate pe care le putei folosi n acest scop.
Pag. 56

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

Afiare (exemplu) Ziua din lun, ntre 1 i 31 Ziua din lun, ntre 01 i 31 Ziua sptmnii (primele 3 litere din ziua sptmnii; de exemplu, Monday pentru luni, Tuesday pentru mari etc) Ziua sptmnii din limba englez (ntreg cuvntul; de exemplu, Monday pentru luni, Tuesday pentru mari etc) Ziua sptmnii, ntre 1 i 7 Sptmna din an, ntre 1 i 52 Luna anului, ntre 1 i 12 Luna anului, ntre 01 i 12 Primele 3 litere din luna anului n englez (de exemplu, Jan pentru ianuarie, Feb pentru februarie, etc) Luna anului n limba englez (ntreg cuvntul; de exemplu, Jan pentru ianuarie, Feb pentru februarie, etc) Trimestrul anului, ntre 1 i 4 Ziua din an, ntre 1 i 365 Anul, ntre 00 i 99 Anul, ntre 0100 i 9999 Ora, ntre 1 i 23 Ora, ntre 01 i 23 Minutul, ntre 1 i 59 Minutul, ntre 01 i 59 Secunda, ntre 1 i 59 Secunda, ntre 01 i 59 AM pentru ore ntre miezul nopii i miezul zilei; PM pentru ore ntre miezul zilei i miezul nopii am pentru ore ntre miezul nopii i miezul zilei; pm pentru ore ntre miezul zilei i miezul nopii A pentru ore ntre miezul nopii i miezul zilei; P pentru ore ntre miezul zilei i miezul nopii

Semnul slash (/) este folosit, de obicei, ca separator pentru dat, iar dou puncte (:), ca separator pentru or. Folosind aceste formate, putei crea expresii care s returneze valori de genul: Luna angajrii este Feb Pentru aceasta, introducei n cmpul Field al grilei QBE expresia:

Luna: Luna angajrii este & Format ([Data Angajrii], mmm) , unde:

Pag. 57

Luna: este numele coloanei care va conine, n tabela de rezultate, valorile expresiei; Luna angajrii este este textul care va aprea naintea lunii angajrii; Format ([Data Angajrii], mmm) convertete valoarea stocat n cmpul Data Angajrii la formatul mmm. Funcia Now () returneaz data i ora curent n funcie de ceasul sistemului. O funcie asemntoare este Date (), care returneaz doar data curent. Not: dac observai c informaiile returnate sunt eronate, verificai data i ora sistemului (n Control Panel, la seciunea Date/Time), deoarece funciile Now () i Date () se bazeaz pe acestea. 3.5. Funcia IIF n expresii Sintaxa funciei IIF este urmtoarea: IIF (<Expresie>, valoare1, valoare2) Unde: este o expresie a crei valoare de adevr este evaluat pentru fiecare nregistrare n parte.; valoare1 este valoarea returnat dac <expresie> este adevrat; valoare2 este valoarea returnat dac <expresie> este fals. Astfel, s presupunem cmpul pentru fiecare student dorim s aflm dac a promovat sau nu oate cursuriile opionale la care s-a nscris (adic, dac nota minim obinut este sau nu mai mare sau egal cu 5). n tabela cu rezultatele interogrii vom avea o coloan, numit Situaia, care va avea valoarea promovat sau Nepromovat. Expresia care d valorile acestei coloanea este urmtoarea: Situaia: IIf (Min ( [ Nota ] )>= 5, promovat, nepromovat

3.6. Strategii de parcurgere a tabelelor de baz Access Jet Engine poate alege una dintre urmtoarele 3 strategii pentru parcurgerea datelor din tabelele de baz:
Pag. 58

Parcurgerea secvenial: este, de obicei, cea mai puin rapid metod, deoarece sunt citite toate nregistrrile din tabela de baz, i, pentru fiecare nregistrare sunt verificate restriciile. Aceast metod este aleas pentru tabele mici i neindexate. Parcurgerea pe indeci: Aceast metod este aleas atunci cnd exist restricii asupra unei coloane indexate dintr-o tabel de baz. Dup ce subnt selectate doar nregistrile pentru care sunt verificate aceste restricii, aceste nregistrri vor fi supuse i restului de restricii (dac exist). Aceast metod este eficient atunci cnd tabelele de baz sunt mari, astfel nct, dei se vor citi aceleai nregistrri de mai multe ori, timpul total este mai mic dect cel necesar pentru a citi ntraga tabel. Tehnica restricionrii Rushmore: este aplicat atunci cnd exist restricii asupra mai multor coloane indexate. Prin folosirea mai multor indeci, motorul Jet reduce considerabil numrul de nregistrri ce trebuie citite. n funcie de tipul restriciei, Jet engine va efectua una dintre urmtoarele 3 operaii: intersecia indecilor: pentru restricii de forma: unde col1 i col2 sunt coloane indexate. Pentru fiecare restricie este creat cte o mulime de rezultate, care apoi sunt intersectate pentru a gsi nregistrrile ce verific ambele restricii. reuniunea indecilor: pentru restricii de forma: col1 = <exp> OR col2 = <exp> unde col1 i col2 sunt coloane indexate. Pentru fiecare restricie este creat cte o mulime de rezultate, care apoi sunt reunite pentru a gsi nregistrrile ce verific ce verific cel puin una dintre cele 2 restricii. numrarea indecilor: pentru interogri ce returneaz numrul nregistrprilor ce verific o anumit mulime de restricii: SELECT Count (*) FROM Tabela WHERE col1 = <exp> AND col2 = <exp> Pentru astfel de interogri, Jet Engine nu trebuie dect s citeasc paginile cu indeci.

3.7. Greeli frecvente n continuare, v prezentm cteva dintre greelile cel mai des ntlnite la crearea interogrilor i care pot duce la mrirea semnificativ a timpului de execuie. Expresii n coloanele rezultat: motorul Jet Engine nu poate optimiza interogrile care conin expresii de tip IIF pentru coloanele rezultat.
Pag. 59

Folosii expresiile la nivelul controalelor din rapoartele sau formularele care vor folosi rezultatele interogrii. Prea multe coloane cu clauza GROUP BY: cnd creai o interogare de tip Totals, impunei clauza Group By asupra ct mai puinor coloane. Astfel, timpul de execuie va fi mai redus. Indexarea coloanei de asociere pentru o singur tabel: cnd folosii o asociere ntre 2 tabele, indexai c-mpurile de asociere din ambele tabele. Folosirea insuficient a indecilor: dac nu se efectueaz modificri frecvente asupra datelor, este bine s folosii indeci pentru coloanele de asociere sau pentru coloanele asupra crora se impun restricii. Altfel, indecii pot ngreuna sensibil operaiile de actualizare a datelor. 3.8. Importana compactrii Compactarea unei baze de date este o operaie asemntoare defragmentrii discurilor fizice. Pe msur ce tergei obiecte sau nregistrri din baza de date, vor rmne spaii nefolosite care mresc dimensiunile fiierului i scad performanele aciunilor. Singurul mod n care pot fi eliminate aceste spaii este comanda Database Utilities | Compact Database. Astfel, vor fi renoite statisticile asupra tabelelor, vor fi reordonate nregistrrile din tabele, iar spaiul liber va putea fi folosit. n consecin, vor crete i performanele interogrilor, despre care am mai spus c sunt cel mai important instrument pus la dispoziia programatorilor i fr de care bazele de date nu i-ar mai afla utilitatea.

Pag. 60

CAP: 4. Crearea i lucrul cu formularele Formularele ofer unei baze de date o interfa prietenoas i elegant, prin care programatorul poate controla aciunile utilizatorului. Un formular are peste 70 de proprieti, la care se adaug cele ale controalelor, ntre 38 i 58 pentru fiecare. Principalul rol al formularelor este introducerea datelor, dar ele pot folosi i la regsirea datelor sau afiarea meniurilor, a ecranelor de tip splash etc. Sursele de nregistrri ale formularelor indic de unde provin sau unde vor fi stocate datele i sunt specificate printre proprietile formularelor. Pentru a vedea pagina de proprieti a unui formular deschis n modul Design View, facei clic pe butonul selector care se afl n colul din stnga-sus al formularului i apoi selectai comanda View Properties sau apsai butonul Properties pe bara cu instrumente. Not: Pentru a vedea pagina de proprieti a unui control al formularului, facei clic pe el pentru a-l aduce n prim plan i apoi alegei comanda View Properties sau apsai butonul Properties de pe bara cu instrumente. 4.1 Sursele de nregistrri ale formularelor Sursa de nregistrri a unui formular poate fi o tabel, o interogare sau o instruciune SQL, specificat n proprietatea Record Source a formularului respectiv.

Figura 4.1. n figura 4.1 observai c n dreapta cmpului proprietii Record Source se afl dou mici butoane. Dac facei clic pe primul (cel reprezentat de o sgeat), se va deschide o list cu toate tabelele i interogrile din baza de date curent, dintre
Pag. 61

care vei selecta sursa de nregistrri. Pentru a modifica sursa de date a unui formular apsai cel de al doilea buton din dreptul proprietii Record Source (cel reprezentat prin trei puncte) care va deschide fereastra SQL Ouery Builder (figura 4.2). Aceasta se aseamn cu fereastra QBE att ca aspect, ct i ca funcionare.

Figura IV.2. Dac formularul se bazeaz pe o interogare, modificrile aduse acesteia n fereastra SQL Builder se vor reflecta i n interogarea propriu-zis. Dup cum am artat n capitolele precedente, exist dou tipuri de interogri: pentru regsirea datelor i pentru definirea i modificarea datelor. Dintre acestea, numai interogrile pentru regsirea datelor (de tip SELECT) pot servi drept surs de nregistrri pentru un formular. Dac v ntrebai ce s alegei ca surs de date pentru un formular dintre o interogare salvat i o instruciune SQL, rspunsul este urmtorul: dac interogarea este complex, salvai-o i apoi alegei-o n cmpul proprietii Record Source; dac este simpl, introducei instruciunea SQL corespunztoare direct n cmpul proprietii Record Source a formularului. Formularele bazate pe interogri salvate sunt mai rapide, dar aceste interogri sporesc numrul de obiecte din baza de date, fcnd-o s ocupe mai mult spaiu. 4.2. Crearea unui formular simplu Access v pune la dispoziie dou componente pentru crearea formularelor simple: AutoForm Wizard, pentru crearea automat a formularelor i Form Wizard, ce i d programatourlui mai mult libertate de decizie. Pe lng acestea, putei crea formulare i singuri, pornind de la zero, n modul Design View. Formularele create automat cu ajutorul vrjitorului AutoForm wizard, conin cte un control (cmp) pentru fiecare coloan a tabelei sau a interogrii pe care
Pag. 62

sunt bazate. n partea dreapt a fiecrui cmp exist o denumire (etichet) care este dat de valoarea prorietii Label a coloanei respective. Controlul corespunztor unei coloane este cel specificat n proprietatea Display Control a coloanei respective i poate fi Text Box, Combo Box, List Box sau Check Box, n funci de tipul de date. Figura 4.3. prezint formularul DetaliiProfesor, creat automat i care se bazeaz pe interogarea DetaliiProf din figura 4.2.

Figura IV.3. Putei alge tiparul, adic fundalul implicit i fontul i culoarea implicit a etichetelor folosite de AutoForm Wizard la crearea automat a formularelor. Pentru aceasta, deschidei formularul n modul Design View, efectuai modificrile dorite i alegei comanda AutoFormat. Spre deosebire de vrjitorii pentru crearea automat a formularelor (AutoForm Columnar Wizard, AutoForm Tabular Wizard i AutoForm Datasheet Wizard, care difer prin modul n care sunt prezentate datele n formular), vrjitorii de tip Form Wizard (Form Wizard, Chart Wizard i Pivot Table Wizard) i dau programatorului posibilitatea de a specifica tabelel sau interogrile pe care se va baza formularul, cmpurile acestora care vor aprea pe formular, ordinea de sortare a datelor, fundalul etc. Not: Dac folosii mai multe tabele i interogri ca surs de nregistrri pentru un formular, ntre acestea trebuie s fie stabilite relaii. Apsnd butonul Create form by using wizard din pagina Forms a ferestrei Database Container, se va deschide fereastra de dialog (figura 4.4), n care vei alege vrjitorul care vrei s v ajute la crearea unui nou formular.

Pag. 63

Figura 4.4. Dup ce ai ales opiunea Form Wizard, acest vrjitor v va prezenta succesiv patru cutii de dialog, n care vei putea alege cmpurile dorite din una sau mai multe tabele sau interogri din baza de date (ntre care trebuie s existe relaii), modul cum vor fi prezentate datele (pe o singur coloan (Columnar), sub form de tabel (Tabular), ca n modul Datasheet View (Datasheet) sau aliniate att la stnga ct i la dreapta formularului (Justified)), fundalul i, n final, numele formularului. Dac dorii s creaiun formular pornind de la zero, fr nici un ajutor, n cutia de dialog New Form alegei opiunea Create Form in Design View. Astfel, se va deschide un formular fr nici un control, urmnd ca dumneavoastr s adugai controalele dorite, folosind cutia de instrumente (Toolbox). 4.3. Seciunile unui formular Un formular Access poate avea ntre una i cinci seciuni. Iat care sunt acestea (prezentate i n figura 4.5):

Pag. 64

Figura IV.5

Detail Aceast seciune conine datele din fiecare nregistrare a sursei de date. Pentru a trece de la o nregistrare la alta vei folosi butoanele de navigare ale formularului. Form Header Aceast seciune apare ntotdeauna n partea de sus a formularului. Aici putei include informaii care nu se schimb n funcie de fiecare nregistrare, cum ar fi un antet sau un control ce nu are legtur cu nregistrarea curent, precum i o caset combinat folosit pentru filtrarea nregistrrilor. Form Footer - Aceast seciune apare n partea de jos a unui formular. Aici putei include informaii despre data i ora la care a fost creat formularul sau totalurile coloanelor unui formular tabelar. Page Header Aceast seciune apare ntre Form Header i Detail. Formularele care conin un numr mare de controale pot fi mprite cu ajutorul unui control de tip Page Break n dou sau mai multe pagini, pentru a fi afiate pe rnd. Seciunile Page Header i Page Footer vor rmne nemodificate cnd se trece de la o pagin la alta a formularului. Page Footer Aceast seciune apare ntre Detail i Form Footer i se aseamn cu seciunea Page Header.

Pag. 65

4.4. Lucrul cu formularele Un formular o dat creat poate fi deschis n mai multe feluri: din pagina Forms a ferestrei Database Container, din alt formular (cu ajutorul unui buton), dintr-un macro sau cu ajutorul limbajului VBA. Principalul rol al formularelor este acela de a mpiedeca utilizatorul s interacioneze direct cu tabelele sau cu tabelele de rezultate ale interogrilor din baza de date. De aceea, pentru a reduce ct mai mult contactul utilizatorului cu fereastra Database Container i cu obiectele sale, cel mai elegant mod de a deschide un formular este prin intermediul unui buton din alt formular. Astfel, un exemplu clasic de formular folosit pentru a lansa alte formulare este acela al unui meniu ce conine mai multe butoane, prin intermediul crora utilizatorul putea deschide diferite alte formulare. Indiferent de cum a fost deschis un formular, vei putea face trecerea la oricare dintre cele trei moduri n care poate fi vzut formularul: Design View (pentru a lucra cu controalele formularului), 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), alegnd una dintre aceste comenzi din meniul View. ntr-un formular putei naviga att ntre controale, ct i ntre nregistrri. Cu ajutorul tastei Tab putei trece de la un control la altul. Pentru a stabili ordinea n care se face aceast trecere, alegei comanda View Tab Order. Pentru a trece la nregistrarea urmtoare, trecei la ultimul control de pe formular i apoi apsai tasta Enter. Un alt mod de a trece de la o nregistrare la lata este prin folosirea tastelor Page Up i Page Down. Mult mai simplu este ns s folosii butoanele pentru navigarea printre nregistrri. Aceste butoane apar n colul din stnga jos al unui formular, dac n pagina de proprieti a acestuia proprietatea Navigation Buttons are valoarea Yes. Tot n pagina de proprieti a unui formular vei gsi ase proprieti ce v permit s controlai aciunile utilizatorului asupra datelor pe care se bazeaz formularul: Allows Edits: Dac are valoarea Yes, utilizatorul va putea modifica nregistrrile; dac are valoarea No, aceasta nu va putea schimba n nici un fel datela afiate n formular. Allow Deletions: Dac are valoarea Yes, utilizatorul va putea terge nregistrri, cu condiia ca integritatea referenial s nu fie violat. Allow Additions: Dac are valoarea Yes, utilizatorul va putea introduce noi nregistrri prin intermediul formularului. Data Entry: dac are valoarea Yes, formularul deschide automat o negistrare nou, fr date. Utilizatorul nu are acces la nregistrrile existente. Dac proprietatea Alow Additions are valoare No, iar Data Entry are valoarea Yes, va rezulta o eroare.
Pag. 66

Recordset Type: Poate fi Dynaset, Dynaset (Inconsistent Updates) sau Snapshot. Se refer la formularele ce au mai multe tabele ca surs de date. Dac valoarea este Dynaset, datele din controalele asociate cmpurilor vor putea fi editate de ctre utilizator, ceea ce nu este valabil n cazul valorii Snapshot. Record Locks: Se refer la aplicaii multiuser. Dac are valoarea No Locks, mai muli utilizatori vor putea modifica aceleai nregistrri n acelai timp, fiind luate n considerare numai modificrile care au fost salvate primele. Opiunea Edited Records mpiedic ceilali utilizatori de a opera schimbri asupra unei nregistrri care este deja n curs de modificare. Opiunea All Records blocheaz toate nregistrrile din formular i din tabelele de baz atta timp ct un utilizator editeaz orice nregistrare din tabel. O dat ce au fost fcute modificri asupra unei nregistrri dintr-un formular, acestea vor fi salvate fie cnd se trece la nregistrarea urmtoare, fie cnd se nchide formularul. Proprietile din pagina Format a ferestrei de proprieti a formularului controleaz aspectul acestuia. Printre ele se numr: Caption: Pstreaz textul ce va fi afiat n bara de titlu a formularului. Default View: Stabilete dac formularul va fi afiat n modul Single Form (cel mai des folosit), Continuos Form sau Datasheet. Views Allowed: Stabilete dac utilizatorul poate trece din modul Form View n modul Datsheet View. ScrollBars: Stabilete dac formularul are bare de derulare verticale i/sau orizontale. RecordSelectors: Dac valoarea sa este Yes, pe latura din stnga a seciunii Detail va aprea un selector pentru nregistrri. NavigationButtons: Dac valoarea este Yes, formularul va fi dotat cu butoane pentru parcurgerea nregistrrilor.

RecordDividers: Dac valoarea este Yes, n modul Continuos va aprea o linie de separare ntre nregistrri. AutoResize: Dac valoarea este Yes, fereatra formularului va fi dimensionat corespunztor la fiecare deschidere a acestuia. AutoCenter: Dac valoarea este Yes, la deschidere formularul va aprea centrat pe ecran. ControlBox: Dac valoarea este Yes, caseta de control va aprea n partea din stnga a barei de titlu. MaxMinButtons: Precizeaz dac butoanele Minimize i Maximize vor fi incluse n bara de titlu. n acest caz, valoarea proprietii WhatsThisButton trebuie s fie No. CloseButton: Dac valoarea este Yes, butonul (X) pentru nchiderea formularului va fi inclus n partea dreapt a barei de titlu.
Pag. 67

WhatsThisButton: Dac valoarea este Yes, butonul (?) va aprea n partea din dreapta a barei de titlu n cazul n care i CloseButton are valoarea Yes. Pe lng acestea, ar fi mai interesant s menionm dou dintre cele mai importante proprieti din pagina Other a ferestrei Properties: Pop Up: Dac valoarea sa este Yes, formularul va fi afiat deasupra altor ferestre, putnd fi mutat i n afara ferestrei Access. Modal: Dac valoarea sa este Yes, alte ferestre deschise nu pot primi controlul pn cnd formularul nu este nchis.

4.5. Despre controale Fiecare element de pe un formular este un control de un anumit tip. Putei aduga controale la un formular deschis n modul Design View folosind cutia de instrumente Toolbox, pe care o putei vedea alegnd comanda View Toolbox sau apsnd butonul Toolbox de pe bara de instrumente. Majoritatea butoanelor din Toolbox reprezint un tip de control ce poate fi plasat pe un formular. Figura V.6 prezint cutia de instrumente Toolbox i descrie componentele sale. Pentru a plasa un control din Toolbox pe un formular, facei clic pe butonul corespunztor tipului de control dorit, dup care facei clic pe formular. O dat adugat, controlul poate fi redimensionat n funcie de necesiti. Putei selecta un control sau un grup de controale cu ajutorul sgeii din cutia cu scule. Alegei sgeata i apoi trasai un dreptunghi n jurul controalelor pe care dorii s le selectai. O alt metod ar fi s inei tasta Shift apsat n timp ce facei clic pe controalele respective. Pentru a stabili proprietile i comportamentul unui control, Access v pune la dispoziie vrjitorul control Wizard, care va fi activat atunci cnd controlul este plasat pe formular, dac butonul Control Wizard din cutia de scule este apsat (ca n figura 4.6).

Pag. 68

Figura IV.6 4.5.1. Tipuri de controale Exist trei tipuri de controale ce pot fi plasate pe un formular: ataate, neataate i calculate. Controale neataate Un control este folosit pentru a furniza sau primi de la utilizator informaii ce nu sunt sau nu vor fi stocate n baza de date. Iat cteva exemple de astfel de controale: O etichet ce descrie alt control; Un buton prin care se deschide un alt formular; Un bitmap ce face formularul mai atractiv etc. Controale ataate Controalele ataate sunt folosite pentru a afia sau edita informaii din baza de date i lor le corespunde cte un cmp dintr-o tabel sau un cmp returnat de o interogare sau instruciune SQL. Orice control poate fi ataat, cu excepia dreptelor, dreptunghiurilor, sfritului de pagin, etichetelor i cadrelor pentru imagini. Un control ataat va moteni multe dintre proprietile cmpului corespunztor (cum ar fi Caption, Description, Input Mask, Format), dar aceste proprieti pot fi modificate prin intermediul paginii de proprieti a controlului. Pentru a plasa un control ataat pe un formular procedai astfel: 1. Alegei comanda View Field List pentru a afia cmpurile sursei de date pe care se bazeaz formularul. 2. Selectai un cmp sau un grup de cmpuri din aceast list. 3. Facei drag & drop cu selecia pe formular. Astfel, pentru fiecare cmp selectat va aprea pe formular un control i o etichet ce va afia textul din proprietatea Caption a cmpului corespunztor. Putei transforma un control neataat ntr-unul ataat folosind proprietatea Control Source a controlului respectiv, n care s specificai cmpul corespunztor.
Pag. 69

Controale calculate Controalele calculate folosesc expresii pentru a-i obine datele. Dei casetele text sunt cel mai frecvent ntlnite controale de acest tip, orice alt fel de control ce are proprietatea Control Source poate fi calculat. Orice expresie trebuie s nceap cu semnul egal (=). De exemplu, dac n formularul DetaliiProfesor dorim s avem un cmp ce calculeaz impozitul din salariul afiat n controlul Salariu, expresia folosit va fi: =[Salariu]*0.12 Aceast expresie poate fi introdus direct n control dac acesta este o caset text sau n cmpul proprietii Control Source a controlului. 4.5.2. Casete combinate, casete list i grupuri de opiuni n continuare, v vom arta cum putei s profitai de ajutorul oferit de vrjitorul Control Wizard pentru lucrul cu controalele de tip caset combinat, caset list i grup de opiuni. Dac butonul Control Wizard din cutia de instrumente este apsat, prin plasarea pe formular a unui control de tipul celor enumerate anterior, se va activa vrjitorul corespunztor (Combo Box Wizard, List Box Wizard sau Option Group Wizard). Vrjitorii pentru casete combinate i casete list sunt foarte asemntori cu vrjitorul Lookup Wizard, care v ajut s creai ntr-o tabel o coloan ale crei valori proveaneau din alt tabel sau dintr-o list specificat de dumneavoastr. Pentru a ilustra lucrul cu ei, ne vom ntoarce la formularul DetaliiProf care trebuie s fie deschis n modul Design View. 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 acelai nume. tergei aadar controlul Titlu de pe formular (facei clic pe el pentru a-l selecta i apoi apsai tasta Del) i adugai un control de tip Combo Box. n prima cutie de dialog a vrjitorului Combo Box Wizard alegei prima opiune, prin care specificai c valorile controlului vor proveni dintr-o tabel sau interogare. n a doua cutie de dialog va trebui s alegei tabela sau interogarea respectiv, n spe, tabela Titlu. n cea de-a treia cutie de dialog vei alege cmpurile din tabela Titlu ce vor da valorile din caseta combinat. Deoarece n list dorim s fie afiate titlurile din coloana Titli, dar n tabela Profesor se vor stoca doar identificatorii din coloana IdTitlu, aici vom selecta att coloana Titlu, ct i IdTitlu. n cea de-a patra cutie de dialog vei ajusta, eventual, limea listei i vei lsa validat caseta Key Column, deoarece nu dorii ca n list s apar i valorile coloanei IdTitlu. 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. Alegei a doua opiune i specificai c valorile vor fi stocate n coloana IdTitlu. Ultima cutie de dialog v las s introducei textul etichetei plasat n dreptul casetei combinate. Scriei Titlu i apsai butonul Finish pentru a nchide vrjitorul i a crea controlul. Trecei apoi n modul Form View i testai formularul (figura 4.7).

Pag. 70

Figura IV.7 S privim pagina de proprieti a casetei combinate Titlu pentru a nelege ce a fcut Combo Box Wizard (figura 4.8). n cmpul proprietii Row Source Type este selectat valoarea Table / Query, deoarece valorile din lista casetei combinate provin dintr-o tabel, interogare sau instruciune SQL. Proprietatea Row Source specific aceast instruciune: SELECT DINCTINCROW [Titlu].[IdTiltu], [Titlu].[Titlu] FROM [Titlu]; Proprietatea Control Source specific exact coloana din care provin datele din caseta combinat: IdTitlu. Atunci cnd vei dori s introducei n tabela Profesor date despre un nou profesor prin intermediul acestui formular, n coloana IdTitlu a tabelei Profesor va fi stocat valoarea lui IdTitlu din tabela Titlu, n funcie de alegerea dumneavoastr din caseta combinat.

Figura IV.8
Pag. 71

n continuare, vom aduga formularului DetaliiProf un grup de opiuni cu ajutorul vrjitorului Option Group Wizard. Pentru aceasta, va trebui s adugm o nou coloan la tabela Profesor i anume Statut, de tip Number (FieldSize=Integer) i care va avea valoarea 1 dac profesorul este titular sau 0 dac este suplinitor. De asemenea, va trebui s modificm i sursa de date a formularului (interogarea DetaliiProf) astfel nct ea s conin i aceast coloan. Deschidei din nou formularul DetaliiProf n modul DesignView i, din cutia de instrumente selectai controlul de tip grup de opiuni. Dac butonul Control Wizard din cutia de instrumente este apsat, cnd vei plasa controlul pe formular, se va activa vrjitorul Option Group Wizard. n prima cutie de dialog a vrjitorului vei specifica etichetele fiecrui buton de opiune: Titular i Suplinitor. n urmtoarea cutie de dialog vei alege care dintre cele dou opiuni s fie implicit: alegei opiunea Titular. n cea de-a treia cutie de dialog vei introduce valorile corespunztoare opiunilor, valori ce vor fi stocate n tabel: 1 pentru Titular i 0 pantru Suplinitor. Urmtoarea cutie de dialog ne cere s specificm dac valorile vor fi stocate ntr-o tabel, i dac da, n ce cmpuri. Alegei aici coloana Statut i apsai Next. Urmtoarea cutie de dialog ne propune diferite tipuri de controale ce pot aprea ntr-un grup de opiuni. Selectndu-le, le vei putea vedea n partea stng a cutiei de dialog. Acceptai, de exemplu, varianta implicit i trecei la ultima cutie de dialog n care va trebui s introducei denumirea grupului de opiuni (s-i spunem Statutul). Pentru a vedea funcionarea grupului de opiuni trecei n modul Form View i testai formularul. El va arta ca n figura 4.9. Pentru ca la introducerea datelor s nu poat aprea neconcordane ntre caseta combinat Titlu i cmpul IdTitlu al formularului, dai proprietii Locked a casetei text IdTitlu valoarea Yes, astfel nct valorile sale s nu poat fi modificate direct de ctre utilizator.

Figura IV.9 S vedem acum ce a fcut Option Group Wizard. Observai c grupul conine dou butoane de opiune, ale cror etichete sunt Titular i Suplinitor. Din pagina
Pag. 72

de proprieti a grupului de opiuni (figura IV.10), merit s remarcm valoarea proprietii Control Source, i anume coloana Statut. De asemenea, proprietatea Default Value are valoarea 1, corespunztoare opiunii Titular (aa cum am specificat n cea de-a doua cutie de dialog a vrjitorului). Din pagina de proprieti a primului buton de opiune, Titlu, remarcm doar c valoarea 1 pe care o specificasem n cea de-a treia cutie de dialog a vrjitorului se regsete n valoarea proprietii Option Value. Analog, valoarea 0 corespunztoare opiunii Suplinitor se regsete n valoarea proprietii Option Value a celui de-al doilea buton de opiune.

Figura IV.10 4.6. Subformulare Atunci cnd avem dou tabele ntre care exist o relaie de tip 1:m, poate fi avantajos s putem lucra cu amndou prin intermediul unui singur formular. De exemplu, tabelele Profesor i Titlu sunt legate printr-o astfel de relaie, coloana de legtur fiind IdTitlu. Ar fi interesant ca, atunci cnd obinem informaii despre titlul de lector, s putem vedea i toi profesorii care au acest titlu. Pentru aceasta, vom crea un formular ce va conine un subformular. Formularul printe va lucra cu datele din tabela aflat n partea (1) a relaiei, iar subformularul, cu cele ale tabelei din partea (m). Access recunoate faptul c ntre cele dou tabele este definit o relaie i, pentru o anumit nregistrare din tabela Titlu, limiteaz nregistrrile din subformular la cele pentru care valorile cmpului de legtur din cele dou tabele sunt egale. Putei avea maximum dou niveluri de imbricare a subformularelor i oricte subformulare pe acelai nivel de imbricare. Access 97 v pune la dispoziie un instrument foarte prietenos pentru crearea de formulare cu subformulare: Form Wizard. Paii pe care trebuie s-i parcurgei pentru aceasta sunt urmtorii: 1. n pagina Forms a ferestrei Database alegei butonul New i apoi, din cutia de dialog New Forms, alegei Form Wizard.
Pag. 73

2. n prima cutie de dialog a Vrjitorului, selectai din caseta combinat Tables/Queries tabela Profesor i apoi, din lista Available Fields alegei coloanele Nume, Catedra i Data Angajrii. Selectai apoi din caseta combinat rabela Titlu i coloanele Titlu i Salariu. 3. Pe baza datelor pe care le-ai selectat, Access i d seama c dorii s creai un formular bazat pe dou tabele ntre care exist o relaie de tip1:m i v pune la dispoziie trei moduri de a vizualiza aceste date. Dac n cea de-a doua cutie de dialog din Wizard alegei ca datele s fie prezentate n funcie de tabela Profesor, atunci formularul va fi de tip Single Form, adic datele din cele dou tabele vor fi afiate ntr-un singur formular. Dac alegei ca datele s fie prezentate n funcie de tabela Titlu, atunci putei opta ntre 2 posibiliti: Linked Forms (formulare legate) (n acest caz vor fi create dou formulare separate, cel care se bazeaz pe tabela din partea (1) a relaiei avnd un buton, pe care dac apsai se va deschide formularul bazat pe tabela din partea (m) a relaiei) i Form with subform(s) (formular cu subformulare). Alegei aceast ultim posibilitate. 4. Urmtoarele cutii de dialog din Wizard se ocup cu caracteristicile grafice ale formularului. Pentru a nelege legtura dintre formularul printe i subformular, s le privim n modul Design View. Observai,c formularul printe, Titlu_Profesori are, n plus fa de casetele text Titlu i Salariu i etichete corespunztoare acestora, un control de tip Subform/Subreport. Legtura ntre cele dou formulare se face prin intermediul a dou proprieti ale controlului de tip Subform/Subreport: Link Child Fields i Link Master Fields care specific numele coloanelor de legtur ce formeaz cheia strin n tabela din partea (m) i, respectiv, ale coloanelor ce formeaz cheia primar a tabelei din partea (1) a relaiei. Mai observai faptul c proprietatea Source Object are ca valoare numele subformularului (Profesori Subform). Un subformular poate fi adugat unui formular printe i fr ajutorul lui Form Wizard. Nu trebuie dect s tragei numele subformularului din pagina Forms a ferestrei Database Container peste formularul principal deschis n modul Design View i apoi s stabilii proprietile Link Child Fields i Link Master Fileds ale controlului de tip Subform/Subreport care va conine subformularul. Alt metod ar fi s selectai din cutia de instrumente un control de tip Subform/Subreport i s-i stabilii n mod corespunztor proprietile Link Child Fields, Link Master Fileds i Source Object.

Pag. 74

CAP: 5. Modelul orientat pe evenimente Microsoft Access v permite dezvoltarea de aplicaii orientate pe evenimente. Un astfel de eveniment este o aciune pe care aplicaia o recunoate (cum ar fi apsarea unei taste, efectuarea unui clic cu mouse-ul, deschiderea unui formular sau raport etc.) i care genereaz un anumit rspuns. Rspunsul poate fi executarea unei macrocomenzi, a unei proceduri VBA sau evaluarea unei expresii. Evenimentele sunt declanate de aciunile utilizatorului. Obiectele supuse evenimentelor sunt formularele, rapoartele i controalele acestora. Astfel, aplicaiile Access trebuie s fie proiectate n aa fel nct s rspund evenimentelor declanate de utilizator. Pentru a rspunde unui anumit eveniment, trebuie s i atribuii o macrocomand, o procedur sau o expresie. Acest lucru l putei face n pagina Event a ferestrei Properties a obiectului respectiv (figura 5.1). Ordinea n care se execut codul aplicaiei este astfel determinat de ordinea n care sunt invocate evenimentele prin aciunile utilizatorului. Aceasta este esena programrii orientate pe evenimente: utilizatorul este cel care efectueaz anumite aciuni, iar aplicaia rspunde n consecin, prin intermediul codului scris de programator. La acest lucru trebuie s v gndii mereu atunci cnd creai o aplicaie Access (sau o aplicaie Windows n general). Cu alte cuvinte, programatorul trebuie s fac o serie de presupuneri pentru a determina comportamentul aplicaiei. Spre exemplu, putei presupune c utilizatorul va trebui s introduc o valoare ntr-o caset de text nainte de a putea s apese pe un buton. Pentru aceasta, va trebui s dezactivai butonul respectiv nainte ca utilizatorul s introduc o valoare n caseta de text.

Pag. 75

Fig. 5.1

5.1. Tipuri de evenimente n Access Access i pune programatorului la dispoziie mai multe tipuri de evenimente ce pot fi declanate de aciunile utilizatorului i tratate de aplicaie. n cele ce urmeaz, vom vorbi despre evenimentele cel mai des ntlnite. 5.1.1. Evenimente generate de accesarea datelor Aceste evenimente au loc ori de cte ori utilizatorul adaug, modific sau terge datele dintr-un formular ori control sau cnd trece de la o nregistrare la alta. Current Are loc la deschiderea unui formular sau cnd se trece de la o nregistrare la alta. Delete Are loc atunci cnd utilizatorul efectueaz o operaie de tergere a datelor, nainte ca datele s fie efectiv terse. Procedura pentru tratarea acestui eveniment are un parametru: Cancel care, dac are valoarea True, tergerea nu va fi efectuat, iar dac are valoarea False, vor avea loc urmtoarele evenimente, n ordine: Delete, Current (pentru accesarea nregistrrii urmtoare), BeforeDelConfirm, afiarea unei casete de mesaj pentru confirmarea tergerii, AfterDelConfirm. BeforeDelConfirm Are loc dup ce utilizatorul a ters una sau mai multe nregistrri i nainte ca sistemul s afieze caseta de mesaj pentru confirmare. Procedura pentru tratarea acestui eveniment are doi parametri: Cancel i Response. Dac parametrul Cancel are valoarea True, nregistrrile nu vor mai fi terse i caseta de mesaj nu va mai aprea. Dac el are valoarea False, iar parametrul Response are valoarea 0, tergerea va
Pag. 76

fi efectuat fr a mai aprea caseta de mesaj, iar dac Response are valoarea 1, caseta de mesaj va aprea. AfterDelConfirm Are loc dup confirmarea i/sau tergerea nregistrrilor. Procedura pentru tratarea acestui eveniment are un argument, Status, care poate avea valorile 0,1 sau 2. Valoarea 0 spune c tergerea a fost efectuat cu succes, 1 c Access a anulat-o i 2 c utilizatorul a anulat-o. BeforeInsert Are loc numai atunci cnd utilizatorul introduce primul caracter al unei nregistrri noi, dar nainte ca nregistrarea s fie inserat n tabel. Procedura pentru tratarea acestui eveniment are un argument, Cancel, care, dac are valoarea True, aciunea de inserare va fi abandonat. AfterInsert Are loc dup inserarea unei nregistrri noi ntr-o tabel. BeforeUpdate Apare nainte ca datele dintr-un control sau dintr-o nregistrare s fie modificate efectiv. Procedura pentru tratarea acestui eveniment are un argument, Cancel, care, dac are valoarea True, modificarea nu se va mai efectua. AfterUpdate Are loc dup ce au fost modificate datele dintr-un control sau dintr-o nregistrare. Controalele ataate au o anumit proprietate, Old Value, care pstreaz valoarea controlului dinaintea modificrii pn dup ce acest eveniment a avut loc. Astfel, avei posibilitatea ca n procedura pentru tratarea acestui eveniment s redai controlului vechea valoare astfel: FORMS!formular!control = FORMS!formular!control.OldValue Change Apare atunci cnd se efectueaz o modificare ntr-o caset de text sau n cmpul de editare al unei casete combinate. NotInList Este un eveniment specific casetelor combinate i poate aprea numai dac proprietatea LimitToList a unui astfel de control are valoarea Yes. Astfel, evenimentul are loc dac utilizatorul introduce n cmpul de editare al casetei combinate o valoare care nu se regsete n lista acestuia. Procedura pentru tratarea acestui eveniment are dou argumente: NewData, care pstreaz valoarea nou introdus de utilizator i Response, care poate avea valorile 0,1 sau 2. Valoarea 0 i indic lui Access s afieze un mesaj standard pentru a ntiina utilizatorul c a introdus o valoare care nu se afl n lista casetei combinate, 1 i indic lui Access s nu afieze masajul standard i nici s nu introduc noua valoare n list (dndu-v posibilitatea de a afia un mesaj propriu), iar valoarea 2 i indic lui Access s nu afieze mesajul standard i s introduc noua valoare n list. n acest ultim caz, va trebui s introducei noua valoare i n sursa de date a casetei combinate.
Pag. 77

Updated Are loc atunci cnd au fost modificate datele unui obiect OLE i este specific controalelor cadru pentru obiecte OLE ataate sau neataate. Procedura pentru tratarea acestui eveniment are un parametru, Code, care poate avea valorile 0, 1, 2 sau 3. Valoarea 0 i indic lui Access c datele obiectului au fost modificate, 1 c datele au fost salvate de aplicaia care a creat obiectul, 2 c fiierul ce conine obiectul OLE a fost nchis de aplicaia care l-a creat, iar 3 c fiierul ce conine obiectul a fost redenumit de aplicaia care l-a creat.

5.1.2. Evenimente legate de focus Acestea apar atunci cnd un control, formular sau raport primete sau pierde focusul (sau cnd devine activ sau inactiv). Enter Are loc nainte ca un control s primeasc focusul de la un alt control al aceluiai formular sau la deschiderea formularului, pentru primul control al acestuia. Evenimentul apare naintea lui GotFocus i dup Current. Exit Are loc nainte ca un control s piard focusul n favoarea altui control de pe formular, naintea evenimentului LostFocus.

Not:Spre deosebire de evenimentele GotFocus i LostFocus, evenimentele Enter i Exit nu vor avea loc dac focusul trece la un alt formular sau raport. Ele pot fi folosite pentru a afia mesaje naintea actualizrii controalelor sau pentru a schimba ordinea n care se trece cu tasta Tab de la un control al formularului la altul. GotFocus Apare atunci cnd un control de pe un formular primete focusul sau cnd un formular primete focusul, dac toate controalele lui sunt dezactivate. Un control nu poate primi focusul dac este dezactivat sau dac nu este vizibil. Acest eveniment are loc dup evenimentul Enter. LostFocus Are loc atunci cnd un formular sau un control de pe un formular pierde focusul, dup apariia evenimentului Exit (care poate s aib loc sau nu). Activate Are loc atunci cnd un formular sau un raport primete focusul i devine activ. Aceasta se ntmpl la deschiderea formularului sau a raportului, cnd se face clic pe un control al su sau cnd este apelat procedura Visual Basic SetFocus. Formularul sau raportul trebuie s fie vizibil pentru ca evenimentul s aib loc.
Pag. 78

Deactivate Apare atunci cnd un formular sau raport pierde focusul n favoarea altei ferestre (cum ar fi fereastra Database, fereastra unei tabele, a unei macrocomenzi, a unui modul sau alt formular sau raport). Acest eveniment nu are loc dac focusul trece ctre o cutie de dialog sau ctre alt aplicaie.

5.1.3. Evenimente legate de tastatur Acestea au loc la apsarea unei taste sau ca rezultat al instruciunii SendKeys. KeyDown Apare de cte ori este apsat o tast atunci cnd un control sau un formular are focusul. KeyUp apare de cte ori o tast care a fost apsat se relaxeaz (cnd un control sau formular are focusul). Procedurile ce trateaz aceste evenimente au dou argumente: KeyCode i Shift. KeyCode are ca valoare un ntreg ce reprezint tasta care a fost apsat. Valoarea 0 nu corespunde nici unei taste. Argumentul Shift are ca valoare un ntreg ce arat dac tastele Shift, Ctrl sau Alt au fost apsate n combinaie cu alte taste. Valoarea 0 arat c aceste taste nu au fost apsate, 1 c a fost apsat tasta Shift, 2 pentru Ctrl, 4 pentru Alt. Dac este apsat o combinaie a acestor taste, valoarea parametrului Shift este suma valorilor corespunztoare. KeyPress Apare atunci cnd o tast sau o combinaie de taste ce corespund unui caracter ce poate fi tiprit este apsat i apoi relaxat, pentru un control sau formular. El nu are loc la apsarea tastelor funcionale (F1 F12), a tastelor pentru navigare (sgei, Home, End, Page Up, Page Down) sau Shift, Ctrl i Alt. Procedura pentru tratarea acestui eveniment are un argument, KeyAscii, ce are ca valoare un ntreg reprezentnd codul caracterului respectiv. Not: Folosii aceste evenimente cu precauie, deoarece dac o tast este inut apsat, evenimentele KeyDown i KeyPress au loc repetat, ceea ce poate duce la terminarea resurselor sistemului. Pentru a urmri aciunile utilizatorului, putei folosi n schimb evenimentele generate de accesarea datelor, cum ar fi Change i Updated. 5.1.4. Evenimente legate de activitatea cu mouse-ul Apar atunci cnd se efectueaz anumite aciuni cu mouse-ul asupra unui control sau formular. Click Are loc atunci cnd se efectueaz un clic cu mouse-ul pe un formular sau pe un control ori pe o seciune a unui formular. Atunci cnd se face clic pe un control aflat n cadrul unui grup de opiuni, acest eveniment nu este al controlului respectiv, ci al grupului. Acest eveniment mai apare i n urmtoarele situaii (cnd nu se face clic cu mouse-ul): - cnd este selectat o valoare din lista unei casete combinate cu ajutorul sgeilor i este apsat tasta Enter pentru a plasa valoarea n cmpul de editare al casetei combinate;
Pag. 79

- dac este apsat tasta Space atunci cnd o caset de validare, un buton de comand sau un buton de opiune are focusul; - dac se apas tasta Enter pentru un formular care are un buton a crui proprietate Default are valoarea Yes sau dac se apas tasta Esc pentru un formular cu un buton a crui proprietate Cancel are valoarea Yes; - dac se acceseaz un buton de comand cu ajutorul comenzii sale prescurtate (Alt + litera subliniat dintitlul butonului). DblClick Are loc atunci cnd se face clic de dou ori la rnd cu mouse-ul pe un formular, pe un control al lui sau pe o seciune a acestuia. Atunci cnd se face clic pe un control aflat n cadrul unui grup de opiuni, acest eveniment nu este al controlului respectiv, ci al grupului. Procedura pentru tratarea acestui eveniment are un argument, Cancel, care, dac are valoarea True, evenimentul este anulat. MouseMove Apare atunci cnd utilizatorul mic mouse-ul. Procedura pentru tratarea acestui eveniment are patru argumente: Button (care arat care dintre butoanele mouse-ului a fost apsat), Shift (arat dac au fost apsate tastele Shift, Ctrl sau Alt), X i Y (care dau coordonatele curente ale cursorului mouse-ului). Argumentul Button poate lua valorile: 0 dac nu a fost apsat nici unul dintre butoanele mouse-ului, 1 dac a fost apsat butonul din stnga, 2 pentru cel din dreapta i 4 pentru cel din mijloc. Dac au fost apsate mai multe butoane o dat, valoarea lui Button va fi suma valorilor corespunztoare. Valorile argumentului Shift sunt aceleai ca la procedurile pentru tratarea evenimentelor de la tastatur.

MouseDown i MouseUp Au loc atunci cnd un buton al mouseului este apsat sau relaxat, n timp ce cursorul se afl deasupra unui formular, control al lui sau seciune a acestuia. Procedura pentru tratarea acestui eveniment are aceleai argumente ca i cea pentru tratarea lui MouseMove, cu diferena c argumentul Button poate avea valorile: 1 (pentru butonul din stnga), 2 (pentru butonul din dreapta) sau 4 (pentru butonul din mijloc). Dac au fost apsate mai multe butoane o dat, vor avea loc tot attea evenimente MouseDown i MouseUp. 5.1.5. Evenimente legate de tiprire Acestea au loc pentru fiecare seciune a unui raport atunci cnd acesta este tiprit sau este formatat pentru a fi tiprit. Format Apare nainte ca Access s formateze fiecare seciune a unui raport, dar dup ce datele au fost selectate. Pentru seciunea Detail, acest eveniment se produce pentru fiecare nregistrare n parte. Procedura pentru tratarea acestui eveniment are dou argumente: Cancel i FormatCount.
Pag. 80

Dac argumentul Cancel are valoarea True, se renun la formatarea seciunii curente i se trece la urmtoarea seciune. FormatCount reprezint numrul de evenimente Format produse pentru seciunea curent. Retreat Apare atunci cnd Access trebuie s revin la o seciune anterioar a unui raport n timpul formatrii. El are loc dup evenimentul Format i naintea evenimentului Print, pentru a v da posibilitatea de a modifica formatrile fcute deja. Print Are loc dup formatare i nainte de afiare sau tiprire. Ca i evenimentul Format, acest eveniment are loc pentru fiecare seciune n parte. Procedura de tratare are dou argumente: Cancel i PrintCount. Dac argumentul Cancel are valoarea True, seciunea sau nregistrarea curent nu va mai fi tiprit. PrintCount reprezint numrul de apariii ale acestui eveniment pentru nregistrarea curent. Astfel, putei afla dac o nregistrare va fi tiprit pe mai mult de o pagin i putei renuna la ea. 5.1.6. Evenimentele ferestrelor Acestea se produc atunci cnd o fereastr a unui formular sau raport este deschis, redimesionat sau nchis. Open Se produce la deschiderea unui formular sau raport i nainte ca prima nregistrare a formularului s fie afiat sau ca raportul s fie afiat sau tiprit. Procedura pentru tratarea evenimentului are un argument, Cancel, care dac are valoarea True, formularul sau raportul respectiv nu va mai fi deschis. Acest eveniment se produce naintea evenimentului Load. Close Are loc atunci cnd un formular sau un raport este nchis sau nu mai este vizibil pe ecran, dup evenimentul Unload. Load Apare la deschiderea unui formular i la afiarea nregistrrilor, naintea evenimentului Current al primei nregistrri sau al primului control al formularului, dar dup evenimentul Open. Unload Apare la nchiderea unui formular (dar nainte ca acesta s dispar de pe ecran), naintea evenimentului Close. Procedura pentru tratarea evenimentului are un argument, Cancel, care, dac are valoarea True, formularul nu va mai fi nchis.

Not: Atenie! Dac dai argumentului Cancel valoarea True, formularul nu va mai fi nchis sau trs de pe ecran. Astfel, dac nu i dai explicit mai trziu valoarea False, nu vei mai putea nchide formularul dect nchiznd aplicaia. Resize Apare la deschiderea unui formular sau la redimesionarea sa. Astfel, avei posibilitatea s redimensionai i controalele formularului.

Pag. 81

5.1.7. Evenimente generate de erori Error Are loc atunci cnd apare o eroare de execuie la rularea aplicaiei. Astfel, avei posibilitatea de a intercepta mesajele de eroare ale lui Access i de a afia propriile dumneavoastr mesaje. Procedura pentru tratarea acestui eveniment are dou argumente: DataErr, care reprezint codul de eroare returnat de funcia Err ce se apeleaz de cte ori apare o eroare i Response, care determin dac trebuie s fie afiat un mesaj de eroare standard. Dac Response are valoarea 0, Access nu mai afia mesajul de eroare, putnd astfel s afiai un mesaj personalizat, iar dac are valoarea 1, Access va afia mesajul standard. 5.1.8. Evenimentele legate de timer Timer Apare la intervale de timp regulate, dac ai stabilit proprietatea TimerInterval a unui formular. Dac aceast proprietate are valoarea 0, evenimentul nu se va produce. Pentru valori cuprinse ntre 0 i 65536, evenimentul va avea loc la intervalul stabilit, valoarea reprezentnd mrimea intervalului n milisecunde.

5.2. Ordinea producerii evenimentelor n Access Dup ce ai fcut cunotin cu cteva dintre evenimentele ce pot aprea ntr-o aplicaie Access, este important s nelegei ordinea n care acestea se succed, pentru ale putea folosi la stabilirea comportamentului aplicaiei. 5.2.1. Ordinea producerii evenimentelor legate de controale Cnd un control primete focusul, au loc urmtoarele evenimente: Enter GotFocus

Cnd introducei sau modificai datele dintr-un control i apoi trecei focusul altui control, ordinea producerii evenimentelor este urmtoarea: KeyDown KeyPress AfterUpdate Change Exit KeyUp
BeforeUpdat e

LostFocus

Pag. 82

Not: Dac n cmpul de editare al unei casete combinate este introdus o valoarea care nu se regsete n lista acestuia, dup evenimentul KeyUp apar evenimentele NotInLst i Error. 5.2.2. Ordinea producerii evenimentelor legate de lucrul cu negistrrile unui formular Evenimentele ce se produc atunci cnd sunt afiate nregistrrile unui formular, sunt diferite de cele ale controalelor care afieaz date ale nregsitrrilor respective. Dac modificai o nregistrare prin intermediul controalelor unui formular i trecei apoi la urmtoarea nregistrare, se vor produce, n ordine, urmtoarele evenimente: Current (formular)
BeforeUpdate (control) AfterUpdate (formular) Enter (control) GotFocus (control)

AfterUpdate (control) Exit (control)

BeforeUpdate (formular) LostFocus (control)

Current (formular)

La tergerea unei nregistrri, ordinea producerii evenimentelor este urmtoarea: Delete BeforeDelConfirm AfterDelConfirm

Cnd trecei focusul pe o nregistrare nou (ce nu conine nc date), vor aprea evenimetele: Current (formular) Enter (formular)
GotFocus (control)

BeforeInsert (formular)

AfterInsert (formular)

5.2.3 Ordinea producerii evenimentelor legate de formulare Lucrul cu un formular implic generarea unor evenimente legate de nchidere, deschidere, trecerea de la un formular la altul i lucrul cu datele formularului.
Pag. 83

De exemplu, dac deschidei formularul f1, apsai pe un buton al su pentru a deschide formularul f2 i apoi trecei din nou la formularul f1, vor avea loc, n ordine, 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)

Observai c evenimentul Deactivate al formularului f1 apare dup evenimentele Open, Load i Resize ale lui f2. Astfel, dac n timpul deschiderii celui de-al doilea formular apare o eroare, l putei nchide i pune focusul pe primul formular. Cnd lucrai cu subformulare, ordinea producerii evenimentelor este urmtoarea: Evenimente ale controalelor subformularului Evenimentele formularului Evenimente ale controalelor formularului Evenimentele subformularului

5.2.4. Ordinea producerii evenimentelor legate de tastatur i mouse Dup cum am mai spus, aceste evenimente apar atunci cnd un formular sau un control al unui formular primete focusul. Ordinea producerii evenimentelor generate de apsarea unei taste este: KeyDown KeyPress KeyUp

Ordinea evenimentelor generate de apsarea unui buton al mouse-ului este: MouseDown MouseUp Click

Dac de efectueaz un dublu clic, evenimentul DblClick va aprea dup evenimentul Click.

Pag. 84

5.2.5. Ordinea producerii evenimentelor rapoartelor Evenimentele unui raport sunt generate de tiprirea, afiarea sau de nchiderea raportului respectiv. Astfel, cnd deschidei un raport pentru a-l tipri sau afia i apoi l nchidei, vor aprea, n ordine, evenimentele: Open Activate Format Print Close Deactivate

Evenimentul Open are loc nainte ca nregistrarea pe care se bazeaz raportul s fie executat. Dac interogarea nu genereaz nici o nregistrare, se produce evenimentul NoData. 5.3. Tratarea evenimentelor Dup ce ai decis ce aciuni dorii s fie efectuate ca rspuns la anumite evenimente, nu mai trebuie dect s le scriei codul Visual Basic corespunztor procedurilor pentru tratarea evenimentelor respective. Figura VII.1 prezint pagina Event a ferestrei Properties a unui formular. Fcnd clic pe sgeata din dreapta cmpului unui eveniment, se va deschide o list din care vei putea alege o macrocomand. Pentru a crea procedura pentru tratarea unui eveniment i a-i scrie codul VBA, procedai astfel: 1. Deschidei formularul sau raportul n modul Design. Dac dorii s tratai un eveniment al unui control sau al unei seciuni, selectai controlul sau seciunea respectiv. 2. Deschidei fereastra Properties a formularului, raportului, seciunii sau controlului respectiv i selectai pagina Event.

Din lista corespunztoare evenimentului pe care dorii s l tratai, alegei opiunea [Event Procedure] i apsai butonul Build () pentru a deschide fereastra modului n care se va afla procedura. 4. Access va scrie automat scheletul procedurii, care va arta astfel: Sub nume_procedura () End Sub 5. Alegei comanda Debug | Compile Loaded Modules pentru a compila procedura. 6. Salvai modulul.
3.

Astfel, de cte ori va avea loc evenimentul respectiv, aceast procedur va fi apelat i executat.
Pag. 85

Despre procedurile VBA vom vorbi pe larg mai trziu. Ai observat c n acest capitol am insistat mai mult pe folosirea procedurilor VBA dect a macrocomenzilor pentru tratarea evenimentelor. Aceasta pentru c procedurile sunt mai rapide n execuie, mai flexibile i mai uor de ntreinut. Spre deosebire de macrocomenzi, ele v dau posibilitatea de a intercepta i a trata erorile cu ajutorul evenimentului Error i a funciei OnError. Cu toate acestea, exist i cteva macrocomenzi care nu au corespondent n VBA: AutoKeys, Autoexec i AddMenu.

. CAP:6. Macrocomenzi Macrocomenzile reprezint o metod simpl de a efectua anumite aciuni ntro aplicaie Access, fr a avea prea multe cunotine de programare. Mai precis, o macrocomand este o niruire de aciuni, programat s se execute n cazul producerii unui anumit eveniment. Macrocomenzile sunt, aadar, nite instrumente utile, care v permit s programai aciuni simple, de la deschiderea i nchiderea unui formular ori raport sau stabilirea unor opiuni, pn la emiterea unui semnal sonor, totul n doar cteva secunde. Pe de alt parte, macrocomenzile au dezavantajele lor, care i determin pe cei mai muli programatori Access s prefere modulele i codul VBA. Access v d chiar posibilitatea de a transforma o macrocomand n codul VBA echivalent. Pe lng faptul c macrocomenzile sunt mai lente n execuie dect procedurile, ele mai
Pag. 86

au dezavantajul c nu ofer programatorului posibilitatea de a intercepta i trata corespunztor erorile. Exist ns i unele aciuni care pot fi efectuate numai prin intermediul macrocomenzilor: Definirea comenzilor rapide de la tastatur pentru diferite aciuni. Spre exemplu, dac vei dori ca tasta F3 s deschid un anumit formular, nu vei putea stabili acest lucru dect cu ajutorul macrocomenzii AutoKeys. Rularea anumitor aciuni la deschiderea bazei de date. Crearea i utilizarea meniurilor i a barelor cu instrumente personalizate. 6.1. Crearea unei macrocomenzi Pentru a nelege mai bine cum se creeaz o macrocomand, vom descrie n cele ce urmeaz paii necesari crerii unei macrocomenzi care s afieze o caset de mesaj cu un text de salut. 1. Deschidei pagina Macros a ferestrei Database i apsai butonul New. Se va deschide fereastra Macro Builder (figura 6.1). 2.

Fig. 6.1

3. Facei clic pe prima linie a coloanei Action i apoi apsai pe sgeata din

partea dreapt a cmpului. Se va deschide o list cu toate aciunile. Selectai aciunea MsgBox. 4. Dup ce ai selectat o aciune, n partea de jos a ferestrei Macro Builder vor aprea argumentele corespunztoare aciunii respective. n acest caz, ele sunt: Message (mesaj), Beep (semnal sonor), Type (tipul casetei de mesaj) i Title (titlul casetei de mesaj). Figura 6.1 prezint valorile pe care le-am ales pentru aceste argumente. 5. Salvai macrocomanda cu ajutorul comenzii File | Save. Va aprea o cutie de dialog cerndu-v un nume pentru noua macrocomand (s-i spunem Salut).
Pag. 87

6.

Pentru a rula macrocomanda, apsai butonul Run de pe bara cu instrumente sau alegei comanda Run | Run. Caseta de mesaj va arta ca n figura 6.2.

Fig. 6.2 Not: Este bine ca pentru fiecare aciune a unei macrocomenzi s introducei un scurt comentariu care s descrie ce anume face aciunea respectiv. Folosii pentru aceasta liniile coloanei Comment. Dac vei converti ulterior macrocomanda la codul VBA corespunztor, aceste comentarii nu se vor pierde. Dup cum v-ai putut da seama, pentru a crea o macrocomand care s ndeplineasc o anumit cerin, este important s cunoatei att aciunile disponibile, ct i argumentele acestora.. 6.2. Grupuri de macrocomenzi Grupurile de macrocomenzi sunt, dup cum le spune i numele, colecii de macrocomenzi simple, salvate separat, dar cuprinse n aceeai comand global. Fiecare macrocomand din grup trebuie s aib un nume propriu, pe care l introducei n coloana Macro Name a ferestrei Macro Builder (aceast coloan va fi afiat dac selectai comanda View | Macro Names). ntr-un grup, macrocomenzile componete trebuie s fie separate prin linii goale (ca n figura 6.3).

Pag. 88

Fig. 6.3 Grupurile de macrocomenzi sunt utile, de exemplu, atunci cnd dorii s pstrai toate macrocomenzile unui formular n acelai obiect, astfel nct numrul obiectelor din pagina Macro a ferestrei Database s fie mai mic. Pe de alt parte, o macrocomand poate apela alt macrocomand n cadrul unei condiii, caz n care vei prefera s le includei pe amndou n acelai obiect, pentru a fi mai simplu de depanat. O macrocomand din grup poate fi executat utiliznd numele grupului, urmat de un punct i de numele macrocomenzii: nume_grup.nume_macro Execuia unei macrocomenzi din grup se oprete la ntlnirea urmtoarei linii libere din coloana Action. O alt utilizare frecvent a grupurilor de macrocomenzi o reprezint crearea meniurilor personalizate, n care fiecrui control i corespunde o macrocomand din grup. 6.3. Macrocomenzi imbricate n Access putei crea i macrocomenzi compuse, n care o macrocomand s fie apelat de alta. Cel mai simplu mod de a realiza acest lucru este folosirea aciunii RunMacro. Figura 6.4 prezint macrocomanda care apeleaz macrocomanda Mac1.

Pag. 89

Fig. 6.4 O alt situaie n care se folosesc macrocomenzi imbricate este atunci cnd vei dori s controlai execuia unei macrocomenzi impunnd o condiie. Despre condiii n macrocomenzi vom vorbi n seciunea urmtoare. 6.3.1. Condiii n macrocomenzi Access v pune la dispoziie un mod rudimentar de a controla firul de execuie al macrocomenzilor, prin intermediul coloanei Condition a ferestrei Macro Builder. Pentru a vedea aceast coloan, selectai comanda View | Conditions. Dac introducei o expresie n coloana Condition, aciunea aflat pe aceeai linie n coloana Action se va executa numai dac expresia este adevrat. Dac expresia este fals, Access nu va executa aciunea de pe aceeai linie cu condiia i va trece la urmtoarea aciune. Dac introducei trei puncte de suspensie () n coloana Condition pe linia de sub o condiie existent, Access va considera aciunea de pe aceeai linie cu punctele de suspensie ca fiind pus aceleiai condiii. 6.4. Macrocomenzi speciale n cele ce urmeaz, vom discuta despre dou macrocomenzi ce merit o atenie special: AutoKeys i AutoExec. 6.4.1. Macrocomanda AutoKeys Macrocomanda AutoKeys v permite s atribuii comenzi rapide de la tastatur aciunilor pe care le poate efectua aplicaia dumneavoastr. De exemplu, ar fi util ca, de cte ori utilizatorul folosete combinaia de taste Ctrl+P, s fie tiprit raportul curent. Astfel, putei atribui orice combinaie de taste oricrei aciuni (sau
Pag. 90

grup de aciuni) care poate fi executat prin intermediul unei macrocomenzi. Pentru a nu crea confuzii, evitai totui atribuirea combinaiilor de taste predefinite n Access (cum ar fi Ctrl +V pentru comanda Edit | Paste) deoarece, n astfel de cazuri, Access va executa macrocomanda dumneavoastr n locul comenzii predefinite. Nu putei atribui o macrocomand unei singure taste alfanumerice sau unei taste folosite, n general, n combinaie cu alte taste (precum Ctrl sau Alt). Tastelor funcionale (F1-F12) i tastelor Insert i Delete le putei atribui macrocomenzi. Pentru a atribui o combinaie de taste unei aciuni, procedai astfel: 1. Creai o nou macrocomand, apsnd butonul New din pagina Macros a ferestrei Database. 2. Alegei comanda View | Macro Names pentru a afia coloana Name a ferestrei Macro Builder. Introducei aici combinaia de taste pe care dorii s o atribuii, urmnd instruciunile din tabelul 6.5. 3. Introducei n coloana Action corespunztoare aciunea atribuit combinaiei de taste din coloana Name. Dac dorii s atribuii mai multe aciuni unei combinaii de taste, nu trebuie dect s le introducei pe linii consecutive ale coloanei Action (fr a lsa linii libere ntre ele). 4. nchidei macrocomanda i salvai-o cu numele AutoKeys. Este important ca acesta s fie numele macrocomenzii, deoarece altfel Access nu va efectua atribuirile. 5. nchidei baza de date (cu comanda File | Close) i deschidei-o din nou pentru a activa macrocomanda AutoKeys. Pentru a specifica o anumit combinaie de taste, trebuie s folosii o sintax special, descris n tabelul 6.5, n care tastei din coloana Tasta i corespund, n coloana Name a ferestrei Macro Buider, caracterele din coloana Corespondent a tabelului. Coloana Exemplu v arat concret ce ai putea introduce n coloana Name a ferestrei Macro Builder. Tasta Ctrl Tast funcional Shift Insert Delete Combinaii 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) Folosii caracterele de mai sus +^{F8} (pentru combinaia Shift+Ctrl+F8) Tabelul 6.5 ^ {} Corespondent

n figura 6.6 este prezentat macrocomanda AutoKeys care atribuie aciunii de tiprire a primelor dou pagini ale obiectului curent combinaia de taste Ctrl+P.
Pag. 91

Figura 6.6 6.4.2. Macrocomanda AutoExec Dac dorii ca anumite ca anumite aciuni s aib loc ori de cte ori se deschide o baz de date, putei crea o macrocomand care s efectueze aciunile respective i pe care s o salvai cu numele AutoExec. Cea mai frecvent utilizare a macrocomenzii AutoExec este ascunderea ferestrei Database i deschiderea unui formular care s joace rolul de meniu principal al aplicaiei sau de spalsh-screen. n Access 97 v putei lipsi de aceast macrocomand, deoarece exist o cutie de dialog n care putei alege formularul care va fi afiat la deschiderea bazei de date. Pentru a deschide aceast cutie de dialog alegei comanda Tools | StartUp. innd tasta Shift apsat, utilizatorul va putea, totui, s mpiedice rularea macrocomenzii AutoExec la deschiderea bazei de date. Figura 6.7 prezint macrocomanda AutoExec care deschide formularul Student ori de cte ori este deschis baza de date Optionale.mdb.

Pag. 92

Figura 6.7 6.5. Crearea meniurilor i a barelor cu instrumente personalizate n versiunile anterioare lui Access 97, se foloseau macrocomenzi pentru crearea barelor de meniuri personalizate pentru aplicaii. Aceste bare de meniuri nlocuiau bara de meniu standard Access, pentru a limita aciunile utilizatorului la cele specifice aplicaiei sau pentru a simplifica efectuarea unor aciuni prin rularea de macrocomenzi. Aceste versiuni anterioare de Access furnizau un instrument specializat pentru crearea de astfel de meniuri, numit Menu Builder i care v ajuta s scriei macrocomenzile corespunztoare. Access 97 nu mai include instrumentul Menu Builder, ci trateaz barele de meniuri i barele cu instrumente unitar, numindu-le bare de comand. Introducem totui aceast discuie aici, deoarece pn la versiunea Access 97, meniurile i barele cu instrumente erau create cu ajutorul macrocomenzilor. i n Access 97 mai pot fi folosite macrocomenzile n acest scop, dar exist i o modalitate mai simpl, pe care o prezentm n continuare. Pentru a crea sau a modifica o bar cu instrumente sau o bar de meniuri n Access 97, procedai astfel: 1. Alegei comanda View | Toolbars | Customize. Se va deschide cutia de dialog Customize (figura 6.8).
Pag. 93

Apsai butonul New din pagina Toolbars pentru a crea o nou bar cu instrumente. Se va deschide cutia de dialog Toolbar Name, n care va trebui s introducei un nume pentru bara cu instrumente. Dup ce apsai butonul OK, va aprea pe ecran noua bar, ce nu conine nici un buton i nici un meniu. Pentru a aduga butoane la o bar cu instrumente existent, selectai-o n lista din pagina Toolbars a cutiei de dialog Customize i trecei la pagina
2.

Commands. Dac dorii ca butonul s fie asociat deschiderii unui obiect din baza de date (tabel, interogare, formular sau raport) sau rulrii unei macrocomenzi, selectai din lista Categories una dintre opiunile All Tables, All Queries, All Forms, All Reports sau, respectiv, All Macros. n funcie de opiunea aleas, n lista Commnads vor aprea toate obiectele din baza de date curent care fac parte din categoria respectiv. Selectai i executai drag & drop cu obiectul dorit pe bara cu instrumente la care dorii s l adugai. Dup ce nchidei fereastra Customize, nu trebuie dect s apsai pe noul buton pentru a se efectua aciunea pe care i-ai atribuit-o.

Figura VIII.8 Pentru a aduga un meniu la o bar cu instrumente existent, procedai ca i pentru butoane, cu diferena c din lista Categories trebuie s alegei opiunea New Menu. Selectai apoi articolul New Menu din lista Commands i facei drag & drop cu el peste bara respectiv. Facei apoi clic dreapta pe meniul nou adugat, pentru a afia un meniu derulant. n caseta Name a acestui meniu derulat, scriei numele noului meniu i apsai tasta Enter. Acum, meniul exist, dar nu are nici un articol de meniu. Pentru a aduga comenzi unui meniu, procedai la fel ca pentru adugarea butoanelor la o bar cu instrumente, cu diferena c trebuie s facei drag & drop cu obiectele
Pag. 94

selectate din lista Commands pe meniul respectiv. Exact n acelai mod putei aduga submeniuri la meniurile existente. Pentru a terge un meniu sau un buton al unei bare cu instrumente, selectai bara respectiv din lista din pagina Toolbars a cutiei de dialog Customize. Facei apoi clic dreapta pe butonul sau pe meniul respectiv i alegei din meniul derulant comanda Delete. Pentru a terge o bar cu instrumente cu totul, selectai-o n pagina Toolbars a cutiei de dialog Customize i apsai butonul Delete.

6.6. Rularea i depanarea macrocomenzilor Exist mai multe modaliti de rula o macrocomand n Access: 1. Fcnd dublu-clic pe numele macrocomenzii n pagina Macros a ferestrei Database. 2. Prin intermediul codului VBA dintr-un modul, folosind metoda RunMacro a obiectului DoCmd: DoCmd.RunMacro nume_macrocomanda 3. Dintr-o alt macrocomand sau prin intermediul barelor personalizate de meniuri sau de instrumente. 4. La deschiderea bazei de date, dac numele macrocomenzii este AutoExec. V putei da seama dac o macrocomand nu funcioneaz cnd vedei cutia de dialog (figura 6.9) aceasta v prezint numele macrocomenzii care a euat, aciunea care a produs eroarea i argumentele aciunii respective. Apsai butonul Halt pentru a depana macrocomanda.

Fig. 6.9 Putei depana o macrocomand rulnd-o aciune cu aciune, n felul urmtor:
Pag. 95

Deschidei macrocomanda n fereastra Macro Builder. Apai butonul Single Step de pe bara cu instrumente sau alegei comanda Run | Single Step. Dac macrocomanda ncepe pe prima linie a ferestrei Macro Builder, putei apsa butonul Run de pe bar pentru a porni execuia. Dac depanai o macrocomand dintr-un grup, va trebui s rulai codul care apeleaz macrocomanda respectiv. Cnd macrocomanda ncepe s ruleze, pe ecran apare cutia de dialog Macro Single Step, care prezint aciunea n curs de rulare i valorile parametrilor acesteia. Aceast cutie de dialog v ofer trei opiuni: rularea aciunii urmtoare (cu butonul Step), oprirea execuiei macrocomenzii (cu butonul Halt) i continuarea nentrerupt a execuiei (cu butonul Continue). De asemenea, putei opri de la tastatur execuia unei macrocomenzi la un moment dat, apsnd Ctrl + Break. Atunci, va aprea cutia de dialog Macro Single Step, ce v va permite rularea pas cu pas a macrocomenzii.

Pag. 96

CAP:7. Visual Basic for Applications (VBA) Dup cum v-ai putut da seama, n Access putei realiza multe lucruri fr a avea prea multe caliti de programator. Totui, dac dorii s creai o aplicaie dotat cu o interfa inteligent i prietenoas, va trebui s nvai s scriei codul necesar pentru a controla aplicaia. Obiectul acestui capitol este limbajul VBA (Visual Basic for Applications), care este un limbaj de programare complex, ce v permite dezvoltarea de aplicaii att n Access, ct i n Microsoft Excel, Microsoft Project i, bineneles, Microsoft Visual Basic. Interceptarea i tratarea erorilor, un control mai bun asupra interfeei cu utilizatorul, mai mult rapiditate n execuie, posibilitatea de a interaciona cu alte aplicaii i de a apela funcii Windows API sunt numai cteva dintre avantajele programrii n VBA. 7.1 Mediul de programare Access Access pstreaz codul procedurilor scrise de dumneavoastr n aa-numitele module. Acestea se mpart n trei categorii: module standard, module pentru clase i module pentru formulare i rapoarte. Modulele standard sunt obiecte de sine stttoare i sunt folosite pentru a crea i stoca proceduri ce nu sunt legate de un anumit formular sau raport. Le putei crea i vedea n pagina Modules a ferestrei Database folosind butoanele New i, respectiv, Design. Modulele pentru clase sunt folosite pentru a crea i a defini obiecte crora le putei apoi crea instane (vom reveni asupra lor n seciunea 7.6). Modulele pentru formulare i rapoarte se deosebesc de celelalte tipuri de module prin faptul c nu sunt obiecte independente, ci sunt incluse n formularul sau raportul corespunztor. Ele conin procedurile pentru tratarea evenimentului formularului sau raportului respectiv i pot fi deschise cu ajutorul comenzii View | Code, atta timp ct suntei n modul Design View. Ce conin modulele Ai vzut deja cum putei accesa un modul. Atunci cnd un modul este deschis, n partea de sus a ferestrei asociate vei vedea dou casete combinate. Acestea v ajut s gsii diferitele proceduri stocate n modulul respectiv. Cel din stnga v permite s alegei obiectul al crui cod dorii s-l vedei sau s-l editai. n cazul modulelor standard, singura opiune este General, deoarece acestea nu conin obiecte,
Pag. 97

n timp ce n cazul unui modul al unui formular sau raport, aceast caset combinat va afia lista tuturor obiectelor pe care le conine. Dup ce ai selectat un obiect, n caseta combinat din dreapta vei putea alege un eveniment al acelui obiect.

Fig. 7.1 (General) (General) nu este un obiect, ci mai degrab o seciune n cadrul unui modul. Aici vei putea pune tot ce ine de modulul respectiv, n general: opiuni, declaraii, proceduri care nu trateaz evenimente (n cazul modulelor standard, toate procedurile se vor afla aici). Opiuni Orice modul are un set de opiuni, pe care le putei stabili cu ajutorul cuvntului cheie Option i pe care vi le prezentm n continuare: 1. Option Base v permite s stabilii indicele cel mai mic pentru elementele unei matrice (array). Implicit, acesta este zero. 2. Option Compare determin modul n care Access va compara dou iruri de caractere (lucru util, de exemplu, pentru sortri). 3. Option Compare Binary Access va folosi reprezentarea binar a caracterelor pentru comparaiile fcute n cadrul modulului. 4. Option Compare Database opiune implicit, ce face ca Access s foloseasc ordinea de sortare a bazei de date pentru efectuarea comparaiilor ntre iruri de caractere. Aceast ordine poate fi schimbat
Pag. 98

cu ajutorul comenzii Tools | Options, dac n pagina General a cutiei de dialog ce se va deschide vei selecta o alt valoare n caseta combinat New Database Sort Order. 5. Option Compare Text similar cu Option Compare Database, cu deosebire c la efectuarea comparaiilor ntre iruri de caractere nu se face diferen ntre literele mari i mici. 6. Option Explicit Dac specificai aceast opiune, toate variabilele vor trebui s fie declarate nainte de a fi folosite n cadrul modulului. 7. Option Private Dac stabilii aceast opiune, codul aflat n interiorul modulului nu va putea fi accesat dintr-un alt modul. Declaraii (Declarations) Tot la seciunea (General) a unui modul mai putei declara proceduri, variabile i constante ce pot fi folosite n ntregul modul. Proceduri pentru tratarea evenimentelor Modulele pentru formulare i rapoarte pot conine i alte seciuni, n afar de (General). Acestea corespund controalelor i seciunilor formularului sau raportului respectiv i conin procedurile pentru tratarea evenimentelor legate de ele. 7.2 Proceduri O procedur este o niruire de linii de cod, care ca scop ndeplinirea unui anumit obiectiv. n Access, procedurile pot fi de dou tipuri: subrutine i funcii. O subrutin este, pur i simplu, un bloc de cod care are un nume. Blocul de cod ce compune subrutina poate fi folosit prin apelarea numelui. O funcie este ceva asemntor unei subrutine, cu diferena c ea returneaz o valoare. Programatorul poate comunica informaii unei proceduri prin intermediul argumentelor. Acestea sunt variabile ale cror valori au fost deja stabilite i care transmit procedurilor datele necesare efecturii operaiilor specifice. Chiar dac pe moment lucrurile nu sunt foarte clare, este important s nelegei faptul c o procedur este un mod de a aduna mai multe linii de cod laolalt, astfel nct de cte ori vei dori s efectuai o anumit operaie, s nu trebuiasc s scriei dect o singur linie de cod, coninnd numele procedurii. 7.2.1 Declararea procedurilor Declararea unei proceduri trebuie s conin urmtoarele informaii: tipul procedurii (subrutin sau funcie), numele procedurii, numele i tipul argumentelor (dac acestea exist), tipul informaiei returnate (dac procedura este o funcie). De exemplu, iat cum ar putea s arate (schematic) declararea unei subrutine care tiprete un ir de caractere: Sub Tiparire(strText As String)
Pag. 99

Debug.Print strText End Sub Numele subrutinei este Tiparire i ea are un singur argument, strText, de tip String (ir de caractere). Subrutina va putea fi apelat astfel: Call Tiparire (Salut!) Iat acum declararea unei funcii care returneaz rezultatul mpririi a dou numere reale:

Function Cat (db1Nr1 As Double, db1Nr2 As Double) As Double If db1Nr2 = 0 Then Cat = 0 Else Cat = db1Nr1 / db1Nr2 End If End Function Pentru a apela funcia, vom scrie: db1Rez = Cat (n1, n2) unde n1 i n2 sunt variabile ale cror valori au fost stabilite anterior. Observai facptul c, pentru ca rezultatul s fie corect, este important ordinea n care sunt date argumentele. Exist i o modalitate de a furniza argumentele unei funcii n alt ordine dect cea n care acestea au fost date la declararea funciei: n faa argumentului efectiv, specificai numele argumentului din declaraie, urmat de dou puncte i egal, ca n exemplul de mai jos. db1Rez = Cat (db1Nr2:= n2, db1Nr1:= n1) n general, pentru ca apelul unei proceduri s se poat compila, trebuie s fi fost furnizate toate argumentele din declaraie. Putei ns modifica acest comportament, dac n cadrul declaraiei vei specifica naintea numelui unui argument cuvntul cheie Optional. Astfel, la apelul procedurii, nu va mai trebui neaprat s dai valoarea efectiv a acelui argument. De exemplu, funcia Cat poate fi declarat ca: Function Cat (Optional db1Nr1 As Double, db1Nr2 As Double) As Double i apoi apelat astfel:
Pag. 100

db1Rez = Cat (, n2) sau db1Rez = Cat (db1Nr2:= n2) Atunci cnd apelai o procedur fr s furnizai unele dintre argumentele opionale, trebuie ca n locul lor s punei o virgul sau s specificai pentru argumente neopionale, numele acestora din declaraie. De aceea, este bine ca la declararea unei proceduri s lsai la urm argumentele opionale, pentru ca la apelare s nu mai trebuiasc s includei virgule sau nume. Astfel, putem s declarm funcia Cat aa: Function Cat (db1Nr2 As Double, Optional db1Nr1 As Double) As Double i o putem apela: db1Rez = Cat (n2) Not: Att folosirea argumentelor opionale ct i a celor complet specificate (cu ajutorul numelui din declaraie) este recomandat mai ales atunci cnd procedura are un numr mare de argumente. 7.2.2. Lucrul cu argumente opionale Cum putem afla dac un argument declarat ca opional a fost sau nu furnizat la apelul procedurii? Pentru aceasta exist o funcie Access predefinit, IsMissing, care returneaz valoarea True dac argumentul lipsete i False dac acesta a fost furnizat. Putem rescrie funcia Cat astfel nct, dac dempritul lipsete, s returneze valoarea zero: Function Cat (db1Nr1 As Double, 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.2.3. Funcii predefinite IsMissing este una dintre funciile predefinite pe care Access vi le pune la dispoziie. Exist funcii predefinite pentru toate tipurile de activiti: lucrul cu texte i date numerice, comunicarea cu alte aplicaii, lucrul cu fiiere i directoare, cu date i ore etc. Putei facei cunotin cu funciile predefinite dac lucrai cu Expression Builder. Pentru a v bucura de facilitile oferite de aceste funcii, nu trebuie dect s le apelai n codul dumneavoastr.

Pag. 101

7.3. Variabile Variabilele sunt utilizate pentru a stoca date folosite n subrutine sau funcii (asemeni unor containere). Putei atribui o valoarea unei variabile i apoi s efectuai calcule cu valoarea respectiv prin intermediul variabilei. Folosind variabila i nu direct valoarea, dai flexibilitate codului pe care l vei putea apoi refolosi i pentru alte valori. Spuneam mai nainte c variabilele sunt nite containere folosite pentru a stoca date. ns, pn acum, ai vzut c n Access datele sunt stocate n tabele, deci ce nevoie mai avem de variabile? Exist o diferen esenial ntre aceste dou mijloace de stocare a datelor: spre deosebire de tabele, variabilele sunt folosite pentru a stoca o informaie temporar, ce ne ajut s obinem un anumit rezultat i apoi va fi uitat. Tabelele sunt folosite pentru a stoca informaii pentru o perioad mai lung de timp.

7.3.1 Tipuri de date Tipurile de date sunt folosite pentru a specifica ce fel de informaie va fi pstrat ntr-o variabil astfel nct Access s tie cum s stocheze i cum s manipuleze aceast informaie. Tabelul 7.2 prezint toate tipurile de date pe care Access 97 vi le pune la dispoziie. 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, cu valoare absolut ntre 1.401298*10-45 i 3.402823*1038 Numerele reale pozitive sau negative cu maximum 15 zecimale, cu valoare absolut ntre 4.94065645842147*10-324 i 1.79769313486231*10308 Numr cu 4 zecimale ntre 922337203685477.5808 i 922337203685477.5807, 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. 102

Currency

Boolean

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, nu numai obiecte Access 97 Folosit pentru a stoca diferite tipuri de date Stocheaz date de tip text ce reprezint adrese de hiperlegturi Tabelul 7.2

Dim datData As Date Dim bytNr As Byte Dim objObiect As Object Dim varOrice As Variant Dim hypPag As Hyperlink

7.3.2 Declararea variabilelor Dac la seciunea (General) (Declarations) a unui modul ai stabilit opiunea Option Explicit, nainte de aputea atribui o valoare unei variabile, trebuie s-I indicai lui Access dou lucruri: numele variabilei i tipul datelor pe care aceasta le va stoca; cu alte cuvinte, trebuie s declarai variabila. Acest lucru l vei face prin intermediul instruciunii Dim i a clauzei As Type: Dim intNumar As Integer

Prin linia de cod de mai sus am declarat variabila intNumr de tip Integer. Atunci cnd alegei numele pentru o variabil, trebuie s inei cont de urmtoarele reguli: Trebuie s nceap cu o liter Poate s conin doar litere, cifre i caracterul underscore (_) Poate avea cel mult 40 de caractere Nu poate fi un cuvnt rezervat Dac nu v-ai hotrt de la nceput ce tip de date va stoca variabila dumneavoastr, o putei face ulterior folosind tipul de date Variant. 7.3.2.1 Tipul Variant ntr-o variabil de acest tip putei stoca text, date numerice sau orice alt tip de date predefinit n Access. Spre exemplu: Dim varOrice As Variant VarOrice = 32 VarOrice = varOrice & este un numar intreg n prima linie de cod declarm variabila varOrice ca fiind de tipul Variant, apoi i atribuim valoarea 32. n cea de-a 3-a linie de cod am folosit caracterul & pentru a concatena 32 cu un ir de caractere. Astfel, variabila noastr conine irul de
Pag. 103

caractere 32 este un numar intreg. Access a fcut implicit conversia de la tipul ntreg la ir de caractere. Iat un alt exemplu: varOrice = 2.5 varOrice = varOrice + 10 Cea de-a doua linie de cod va face ca valoarea lui varOrice s fie 12.5, prin conversia irului de caractere 2.5 la numrul real 2.5. Acelai efect l vor avea i urmtoarele linii de cod: varOrice = 2.5 varOrice = varOrice + 10 De aceast dat, irul 10 va fi convertit la numrul ntreg 10. Atunci cnd lucrai cu variabile de tipul Variant, este bine s tii urmtoarele: Access va converti variabila la tipul de date corespunztor valorii atribuite; Atunci cnd dorii s concatenai dou iruri de caractere, folosii operatorul & n loc de +; Cnd folosii operatorul + pentru lucrul cu variabile de tip Variant, Access va aciona astfel: Dac ambele valori sunt numerice, se va efectua o adunare; Dac ambele conin iruri de caractere, ele vor fi concatenate; Dac una este o valoare numeric i cealalt este un ir de caractere, Access va ncerca s-o converteasc n valoare numeric i s fac adunarea. Dac nu reuete, va rezulta o eroare. Pentru a determina ce tip de date conine o variabil de tip Variant la un moment dat, apelai la funcia predefinit VarType. Aceasta va returna una dintre valorile prezentate n tabelul 7.3.

Valoarea returnat 0 1 2 3 4 5

Tipul de date vid (variabila este neiniializat) Null Integer Long Single Double

Constanta intrinsec vbEmpty vbNull vbInteger vbLong vbSingle vbDouble


Pag. 104

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.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. Despre constante intrinseci vom vorbi n seciunea 7.3.3. Atunci cnd o variabil este declarat, ei i se atribuie valoarea iniial 0 dac variabila e de tip numeric sau (irul vid) dac e de tip ir de caractere. Variabilelor de tip Variant ns, nu li se atribuie la declarare nici o valoare, cu alte cuvinte sunt vide (a nu se confunda aceasta cu valoarea 0 sau i nici cu valoarea Null). Aceste variabile rmn vide pn n momentul cnd li se atribuie o valoare. Putei testa dac o variabil de tip Variant a fost sau nu iniializat cu ajutorul funciei IsEmpty, care returneaz valoarea True dacn variabila este vid. Pentru a vida din nou o variabil, trebuie s-i atribuii ca valoare o alt variabil de tip Variant care nu a fost nc iniializat:

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, caracterul apostrof () introduce un comentariu ntr-un modul. O alt valoare special pe care o poate avea o variabil de tip Variant este Null (dac vei ncerca s atribuii valoarea Null unei variabile de orice alt tip dect Variant, vei obine o eroare). Dac folosii valoarea Null ntr-o expresie, ntreaga expresie va avea valoarea Null. De exemplu:
Pag. 105

Dim varOrice As Variant varOrice = Null varOrice = varOrice + 2.5 Dup cea de-a treia linie de cod, varOrice va avea tot valoarea Null. Dac nlocuii aceast linie cu: varOrice = varOrice & ceva varOrice va avea valoarea ceva. Deci, operatorul & este singurul care nu propag valoarea Null ntr-o expresie. Putei testa dac o variabil are valoarea Null cu ajutorul funciei IsNull. Variabilele de tip Variant sunt foarte utile, deoarece, pe lng faptul c nu trebuie s v mai batei capul cu alegerea unui tip de date, sunt singurul tip de variabile crora li se poate atribui valoarea Null. Astfel, dac unei anumite variabile i vei atribui valori dintr-un cmp al unei tabele care poate conine i valoarea Null, acea variabil trebuie s fie de tip Variant. Folosirea acestui tip de variabile are ns i dezavantaje, printre care ncetinirea execuiei aplicaiei i chiar posibila apariiei a unor erori. 7.3.2.2 Option Explicit S revenim acum la opiunea Option Explicit i s vedem ce se poate ntmpla n cazul n care nu am stabilit aceast opiune n cadrul seciunii (General) a unui modul. Pentru aceasta, vom considera urmtoarea subrutin: Sub AriaCercului (db1Raza As Double) Dim db1Aria As Double db1Aria = 3.14 * db1Raza * db1Raza Debug.Print Aria = & db1Aria End Sub Pentru a rula aceast subrutin, deschidei fereastra Debug, apsnd butonul Debug Window de pe bara cu instrumente (fereastra Debug v va permite s apelai procedurile direct, pentru a le putea testa). Scriei n partea de jos a ferestrei Debug linia: Call AriaCercului (5) Dup aceasta, apsai pe Enter i vei vedea rezultatul: 0 (figura 7.4). Este clar c acest rezultat este eronat. Motivul este acela c n codul subrutinei s-a strecurat o greeal: n loc de db1Raza am scris, ntr-un loc, db1Rsza. Opiunea Option Explicit nefiind stabilit, i deci nefiind necesar ca variabila s fie declarat nainte de a fi folosit, Access a atribuit variabilei db1Raza valoarea implicit 0, care a dus la acest rezultat eronat.
Pag. 106

Fig. 7.4

7.3.3 Constante Constantele sunt tot un fel de variabile, cu deosebirea c nu le putei schimba valoarea. n Access exist trei tipuri de constante: Constante simbolice, create cu ajutorul instruciunii Const, Constante intrinsece, Constante de sistem: True, False i Null. Cu ajutorul constantelor simbolice putei da un nume unei valori. Astfel, codul dumneavoastr va fi mai uor de citit i de ntreinut. Prin urmtoarea linie de cod: Const csPi = 3.14 am definit constanta csPi, a crei valoare este 3.14. Constantele pot fi folosite oriunde pot fi folosite i variabilele. Mai mult, ele pot fi folosite la definirea unor constante:
Pag. 107

Const csMinut=60 Const csOra=csMinut * 60 Putem atribui i tipuri de date constantelor, astfel nct Access s le poat recunoate i s putem efectua diferite operaii cu ele: Const csPi As Double = 3.14 Constantele intrinsece sunt constnte definite n Access. n tabelul 7.2 am inclus i coloana Constanta intrinsec, ce conine numele constantelor ale cror valori sunt returnate de funcia VarType. Astfel, putem scrie n codul nostru ori: If VarType (avrOrice) = 2 Then Ori If VarType (avrOrice) = vbInteger Then Rmne la alegerea dumneavoastr care dintre liniile de mai sus este mai clar. n tabelul 7.2 sunt enumerate doar cteva dintre constantele intrinsece definite n Access. 7.3.4 Vizibilitatea i durata de via a variabilelor Vizibilitatea unei variabile este dat de poriunea de cod n care ea poate fi folosit i depinde de locul n care a fost declarat. Vizibilitatea unei variabile create n cadrul unei proceduri se reduce doar la acea procedur. O variabil poate fi declarat i n afara oricrei proceduri, n cadrul seciunii (General) (Declarations) a unui modul. n acest caz, ea poate fi folosit de ctre toate procedurile din modulul respectiv (i, uneori, i din alte module) i spunem c vizibilitatea sa este public. Durata de via a unei variabile e dat de perioada n care ea va putea conine o valoare. Astfel, o variabil local a unei proceduri triete atta timp ct se ruleaz procedura respectiv i este recreat la urmtorul apel al procedurii. Dac dorii ca o variabil local s existe i dup terminarea procedurii, folosii cuvntul cheie Static la declararea ei. Putem declara i o procedur ca fiind static, astfel nct toate variabilele sale locale s fie statice. Variabilele publice exist atta timp ct este deschis baza de date. n Access 97 putei stabili i vizibilitatea procedurilor, folosind cuvintele cheie Public i Private. O procedur avnd specificatorul Private poate fi apelat numai din interiorul modulului n care este declarat, n timp ce o procedur cu specificatorul Public poate fi apelat din orice alt modul. Pentru a putea apela o procedur din fereastra Debug, aceasta trebuie s fie public.
Pag. 108

n exemplele de proceduri pe care le-am prezentat pn acum, toate variabilele erau locale i deci valorile lor se pierdeau dup terminarea rulrii 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 pstreze valoarea i ntre dou apeluri ale procedurii, ea trebuie s fie declarat folosind cuvntul cheie Static, n locul lui Dim. O astfel de variabil va fi iniializat o singur dat: la primul apel al procedurii. Pentru a studia mai bine variabilele statice, s considerm urmtorul exemplu: Sub VarStatic() Static intVar As Integer intVar = intVar + 1 Debug.Print intVar End Sub

Pag. 109

Rulai 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 tiprit de fiecare dat aceeai valoare: 1. Pentru ca toate variabilele unei proceduri s fie statice, folosii cuvntul cheie Static naintea declaraiei 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 aplicaiei Variabilele publice n cadrul unui modul se declar cu ajutorul instruciunii Dim la seciunea (General) (Declarations) a modulului i pot fi folosite de ctre toate procedurile modulului. Urmtorul exemplu folosete astfel de variabile. 1. La seciunea (Declarations) a unui modul declarai variabila intVarModul astfel: Dim intVarModul As Integer

Pag. 110

2. Creai urmtoarele dou subrutine: Sub Incrementare () intVarModul = intVarModul + 1 End Sub i Sub Tiparire () Debug.Print intVarModul End Sub
3. Apelai de mai multe ori ambele subrutine din fereastra Debug. Figura 7.6

prezint rezultatele.

Fig. 7.6 4. Creai o a 3-a procedur, n acelai modul: Sub LocalVar() Dim intVarModul As Integer IntVarModul = 50 Debug.Print intVarModul End Sub 2. Apelai acum subrutina LocalVar i apoi, din nou, pe Tiparire. n figura 7.7 putei vedea ce se ntmpl. LocalVar lucreaz cu variabila intVarModul declarat n interiorul su fr a modifica sau a fi afectat de variabila public intVarModul, chiar dac acestea au acelai nume.
Pag. 111

Fig. 7.7 Not: Pentru a evita confuziile este bine, totui, s alegei pentru variabilele locale nume diferite de cele ale variabilelor publice. Variabilele publice n cadrul aplicaiei pot fi accesate din toate modulele aplicaiei, dar pot fi declarate numai n cadrul seciunii (General) (Declarations) a unui modul standard. Aceste variabile se declar nlocuind instruciunea Dim cu instruciunea Public: Public intVarPublic As Integer Nu putei declara variabile publice n cadrul procedurilor. Not: Folosii variabile publice n cadrul aplicaiei numai dac este neaprat nevoie. Astfel v putei feri de erorii codul dumneavoastr va fi mai uor de ntreinut i de refolosit. Dac vei dori ca mai multe proceduri s foloseasc o anumit valoare, dai-o ca parametru sau ca valoare de retur.

Pag. 112

7.4. Instruciuni de control VBA v ofer posibilitatea de a testa n cadrul procedurilor anumite condiii i de a efectua operaii diferite n funcie de rezultatele testelor. n continuare, vom studia instruciunile VBA care v permit luarea de decizii n urma unor astfel de teste. 7.4.1 Instruciunea IfThen Vei folosi aceast instruciune n cazul n care vei dori s executai anumite operaii doar dac o condiie este adevrat. Ea are dou sintaxe. Dac instruciunea este folosit pe o singur linie de cod, sintaxa este: If conditie Then instructiune Altfel, dac instruciunea e compus din mai multe linii de cod: If conditie Then Instructiuni End If Cea de-a doua variant este util atunci cnd dorii s se execute mai multe instruciuni n cazul n care condiia este adevrat. Urmtorul exemplu ilustreaz folosirea ambelor variante ale instruciunii 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 execuie a subrutinei TestIfThen.

Pag. 113

Fig 7.8 n cadrul subrutinei TestIfThen am folosit o funcie predefinit n Access, InStr, care verific dac un ir de caractere se regsete n alt ir i returneaz poziia la care apare irul cutat n irul surs sau 0 dac irul cutat nu se regsete n irul surs. Orice expresie poate aprea n cadrul clauzei If. Dac expresia se evalueaz la ceva diferit de 0, ea e considerat a fi adevrat, i fals dac valoarea ei este zero. 7.4.2 Instruciunea IfThenElse Pentru a specifica ce operaii trebuie efectuate n cazul n care condiia e fals, folosii aceasta instruciune. De exemplu: If InStr (strDat, strCautat) Then strRezultat = strCautat & se afla in & strDat Else strRezultat = strCautat & nu se afla in & strDat
Pag. 114

End If 7.4.3 Instruciunea ElseIf Putei privi aceast instruciune ca pe un mijloc de a imbrica mai multe instruciuni IfThenElse i deci, de a verifica mai multe condiii. Iat un exemplu: If strDat = Then strRezultat = Sirul dat este vid ElseIf InStr(strDat, strCautat) Then strRezultat = strCautat & se afla in & strDat Else strRezultat = strCautat & nu se afla in & strDat End If Astfel, dac prima condiie nu e adevrat, se verific cea de-a doua i, dac nici aceasta nu e adevrat, se execut instruciunea din cadrul clauzei Else. n acest mod putei folosi oricte instruciuni EndIf. 7.4.4 Instruciunea Select Case Atunci cnd trebuie s testai mai multe condiii i s efectuai pentru fiecare un anumit set de operaii, folosirea instruciunilor ElseIf poate s devin greoaie. Putei folosi, n schimb, o instruciune Select Case care s fac acelai lucru. Astfel, urmtoarele dou secvene de cod duc la acelai 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. 115

Case Else End Select Se poate observa c cea de-a doua variant este mult mai uor lizibil. Expresiile clauzelor Case se testeaz n ordinea n care sunt date i, n momentul n care este ntlnit o expresie adevrat, se vor executa instruciunile corespunztoare i se va iei din instruciunea Select Case. Astfel, dac expresiile a dou dintre clauzele Case sunt adevrate, va fi executat numai codul corespunztor primeia dintre ele, nemaifcndu-se apoi nici o verificare. Instruciunea Select Case de mai sus poate fi scris i astfel: Select Case intVarsta Case Is <=18 Case 19, 20, 21, 22, 23, 24, 25 Case 26 To 40 Case Else End Select Existena clauzei Case Else n cadrul unei instruciuni Select Case nu este obligatorie. Ea poate fi ns util n cazul n care variabila testat poate avea i alt valoare dect cele cuprinse n clauzele Case. Not: Variabila testat poate conine att valori numerice, ct i iruri de caractere sau date. 7.4.5 Instruciunea IIf (Immediate If) Aceast instruciune este aproape echivalent cu instruciunea IfThen Else. Spunem aproape pentru c exist o diferen n modul n care sunt executate cele dou instruciuni. Iat mai nti care este sintaxa instruciunii IIf: IIf (conditie, valoarea1, valoarea2) Unde: conditie este condiia care trebuie s fie testat; valoarea1 este valoarea returnat n cazul n care condiia e adevrat; valoarea2 este valoarea returnat cnd condiia e fals. S considerm acum urmtoarele dou funcii: Function Impartire(intImpartitor As Integer, intDeimp As Integer) As_ Double If intImpartitor = 0 Then
Pag. 116

Impartire = 0 Else Impartire = intDeimp /intImpartitor End If End Function i Function Impartire(intImpartitor As Integer, intDeimp As Integer) As_ Double Impartire = IIf(intImpartor = 0, 0, intDeimp /intImpartitor) End Function Aparent, cele dou funcii fac acelai lucru. Diferena const n faptul c n prima funcie, dac este ndeplinit condiia instruciunii IIf, se execut instruciunea Impartire = 0 i se iese din instruciunea IfThenElse fr alte verificri. n instruciunea IIf din cea de-a doua funcie se evalueaz ns toate argumentele. Astfel, dac intImpartitor = 0, la evaluarea lui intDeimp /intImpartitor va rezulta o eroare. Faptul c n instruciunea IIf se evalueaz toate argumentele, nu numai c ncetinete execuia procedurii, dar poate duce i la erori. 7.5 Instruciuni iterative Exist situaii, foarte des ntlnite n programare, cnd un anumit bloc de instruciuni trebuie s fie executat de mai multe ori. Pentru astfel de operaii, VBA v pune la dipoziie instruciunile ForNext i DoLoop, despre care vom vorbi n continuare.

7.5.1 Instruciunea ForNext Aceast instruciune este util atunci cnd tii precis cte iteraii avei de efectuat. Sintaxa ei este: For contor = val_initiala To val_finala [Step pasul] Next [contor] Unde:
Pag. 117

contor este variabila care se incrementeaz la fiecare iteraie val_initiala valoarea iniial a variabilei contor val_finala valoarea finala a variabilei contor pasul valoarea cu care se incrementeaz variabila contor la fiecare iteraie. Valoarea implicit a pasului este 1. Pasul poate fi i negativ, caz n care variabila contor va descrete la fiecare iteraie cu valoarea absolut a pasului.

For intCont = 1 To intTotal Step2 Debug.Print intCont Next n exemplul de mai sus, valoarea iniial a contorului intCont este 1 i la fiecare pas aceast valoare crete cu dou uniti, pn cnd se egaleaz valoarea variabilei intTotal. De asemenea, la fiecare iteraie se va afia valoare lui intCont. 7.5.2 Instruciunea DoLoop Pentru cazurile n care cunoatei dinainte numrul de iteraii ce trebuie efectuate, instruciunea ForNext este ideal. Sunt ns i situaii n care un set de instruciuni trebuie s se execute pn cnd sau atta timp ct o anumit condiie este satisfcut. n astfel de cazuri, vei folosi instruciunea DoLoop, care are urmtoarele 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. 118

Do bloc de instructiuni Loop While conditie Primele variante ale instruciunii DoLoop execut blocul de instruciuni pn cnd condiia va deveni adevrat (adic atta timp ct ea este fals). Deosebirea dintre ele este aceea c n cea de-a doua variant blocul de instruciuni se execut cel puin o dat. Ultimele dou variante execut blocul de instruciuni atta timp ct condiia e adevrat, cu deosebirea c, n cazul ultimei variante, blocul de instruciuni se execut cel puin o dat. 7.5.3 ntreruperea iterrii Att n cazul instruciunii ForNext, ct i n cel al instruciunii DoLoop, tim cnd anume se va opri procesul iterativ. VBA v d ns i posibilitatea de a ntrerupe acest proces la o anumit iteraie, cu ajutorul instruciunii Exit. De exemplu: For intCont = 1 To intTotal If intStop Then Exit For End If Debug.Print intCont Next Dac intStop este diferit de zero, procesul iterativ se oprete, indiferent de valoarea lui intCont. n mod asemntor, pentru a prsi o subrutin sau o funcie, putei folosi instruciunile Exit Sub sau Exit Function. 7.6 Matrice O matrice poate fi privit ca o mulime de variabile de acelai tip, avnd aceleai nume i care stocheaz informaii similare. Fiecrei variabile ce compune matricea i corespunde un indice (un numr de ordine). Dac numrul de elemente ale matricei a fost specificat la declarare, matricea se numete static; altfel, ea se numete dinamic. 7.6.1 Matrice statice Dup ce ai fixat un numr de elemente la declararea matricei, acesta nu mai poate fi schimbat pe parcurs. Matricele statice se declar astfel:
Pag. 119

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.

Not: Nu confundai matricele statice cu variabilele statice. Repetm faptul c o variabil static e o variabil declarat cu ajutorul cuvntului cheie Static i i pstreaz valoarea i dup terminarea procedurii n care a fost declarat, iar o matrice static este o matrice al crei numr de elemente a fost specificat la declarare. La rndul lor, matricele statice pot fi declarate, asemeni variabilelor, cu ajutorul instruciunilor Dim, Static, Private sau Public. n continuare, v prezentm 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, Matrice) For i = 2 To 5 iMatrice (i) = InputBox (Introduceti al & i & -lea element, Matrice) Next i Debug.Print Primul element este & iMatrice(1) For i = 2 To 5 Debug.Print All & i & -lea element este & iMatrice(i) Next i End Sub Rulai subrutina (apelnd-o de la fereastra Debug). Vor aprea nti cinci cutii de dialog care v vor cere s introducei cte un element, apoi elementele introduse vor fi afiate ca n figura 7.9.

Pag. 120

Fig 7.9

Observai c am folosit funcia predefinit InputBox, care afieaz o cutie de dialog ce permite utilizatorului s introduc o valoare, pe care funci o returneaz.
Pag. 121

Astfel, dup ce fiecare element al matricei a primit cte o valoare introdus de utilizator, matricea este parcurs cu ajutorul instruciunii iterative ForNext, pentru a afia valorile stocate. Indici Nu este obligatoriu ca indicele primului element al unei matrici s fie 1; el poate fi orice numr ntreg, de exemplu: Dim iMatrice(5 To 14) As Integer este declaraia unei matrice de 10 elemente numere ntregi. Dac nu specificai indicele primului element al unei matrici, Access va considera n mod implicit c acesta e zero. Astfel, urmtoarele dou declaraii sunt echivalente: Dim iMatrice(9) As Integer i Dim iMatrice(0 To 9) As Integer Dac vei dori ca indicele implicit al primului element s nu fie 0, ci un altul (1, de exemplu), introducei la seciunea (Declarations) a modulului urmtoarea linie de cod: Option Base 1 7.6.2 Matrice dinamice Dac nu cunoatei de la nceput numrul de elemente pe care trebuie s le aib o matrice, putei s o declarai ca fiind dinamic. Astfel de matrice se declar tot cu ajutorul instruciunilor Dim, Static, Private sau Public, dar punnd dou paranteze rotunde dup numerele matricei. Apoi, cu ajutorul instruciunii ReDim, putei fixa indicii primului i ultimului element al matricei. n continuare, vom modifica exemplul anterior astfel nct utilizatorul s poat introduce numrul de elemente ale matricei. 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, Matrice) For i = 2 To iTot iMatrice(1) = InputBox(Introduceti al & i & -lea element, Matrice) Next i Debug.Print Primul element este & iMatrice(1)
Pag. 122

For i = 2 To iTot Debug.Print Al & i & -lea element este & iMatrice(i) Next i End Sub Dup ce ai specificat, cu ajutorul instruciunii ReDim, indecii primului i ultimului element al matricei, putei folosi din nou instruciunea ReDim pentru a modifica aceti indeci (i deci, dimensiunea total a matricei). n mod normal, modificnd aceti indeci se vor pierde valorile stocate de elementele matricei. Pentru a preveni acest lucru, folosii cuvntul cheie Preserve. Astfel, dac declarm urmtoarea matrice: Dim iMatrice () As Integer ReDim iMatrice (1 To 10) i dorim ulterior s reducem la cinci elemente fr a pierde valorile primelor 5, vom scrie: ReDim Preserve iMatrice (1 To 5) 7.6.3 Detectarea matricelor Exist trei funcii care ne ajut s aflm dac o variabil este simpl sau este o matrice: IsArray, VarType i TypeName. Funcia IsArray returneaz valoarea True dac variabila care i este dat drept argument este o matrice i False dac nu. Despre funcia VarType am mai vorbit i n seciunea 7.3.2, unde am dat i tabelul cu valorile pe care aceasta le poate returna. Ai putut observa n acel tabel c unei variabile de tip matrice i corespunde valoarea de retur 8192 (sau constanta intrinsec vbArray). Astfel, dac variabila dat ca argument funciei VarType este o matrice, funcia va avea ca valoare de retur 8192 plus valoarea corespunztoare tipului variabilelor ce compun matricea. Sub TestMatrice() Dim iNum As Integer Dim iMatrice (1 To 10) As Integer Debug.Print iNum: & VarType(iNum) Debug.Print iMatrice: & VarType(iMatrice) End Sub

Pag. 123

Dac vei rula subrutina Test Matrice, n fereastra Debug vor aprea valorile 2 i 8194, ca n figura 7.10.

Fig 7.10 Observai c pentru variabila iMatrice, funcia VarType a returnat valoarea 8194, adic 8192 pentru matrice, plus 2 pentru tipul Integer (care e tipul elementelor matricei). Funcia TypeName se aseamn cu VarType, cu diferena c n locul valorii corespunztoare unui tip de date, ea returneaz chiar numele tipului respectiv. Spre exemplu, urmtoarea subrutin: Sub TestMatrice1 () Dim iNum As Integer Dim iMatrice (1 To 10) As Integer Debug.Print iNum: & TypeName (iNum) Debug.Print iMatrice: & TypeName (iMatrice) End Sub va da rezultatele din figura 7.11.

Pag. 124

Figura 7.11 7.6.4 Matrice multidimensionale Pn acum am vorbit numai despre matrice unidimensionale, numite i vectori. Matricele pot avea ns i dou, trei sau mai multe dimensiuni. Pentru a declara o matrice multidimensional, trebuie s specificai marginile inferioare i superioare ale indicilor pentru fiecare dimensiune, separate prin virgul. Astfel, pentru a declara o matrice bidimensional cu 6 elemente i cu indicii ncepnd de la 1, scriei: Dim iMatrice(1 To 2, 1 To 3) As Integer sau, pentru o matrice de aceeai dimensiune dar cu indicii ncepnd de la 0 (presupunnd c nu s-a specificat opiunea Option Base 1): Dim iMatrice(1, 2 ) As Integer

Not: Teoretic, numrul maxim de dimensiuni ale unei matrici este 60. Practic, ns nu vei folosi matrice cu mai mult de patru dimensiuni, deoarece ar fi foarte greu de lucrat cu ele. 7.6.4.1 Matrice multidimensionale dinamice Ca i cele unidimensionale, matricele multidimensionale pot fi declarate ca fiind dinamice, pentru ca numrul dimensiunilor i marginile fiecrei dimensiuni s poat fi stabilite ulterior. Sintaxa este urmtoarea:
Pag. 125

Dim iMatrice() As Integer ReDim iMatrice(1 To 2, 1 To 3) Sau, pentru ca indicii matricei s nceap de la 0: Dim iMatrice() As Integer ReDim iMatrice(1, 2) O astfel de matrice are 2x3 = 6 elemente. Similar, prin instruciunea urmtoare: ReDim iMatrice(1, 2, 3) matricea va fi tridimensional i va conine2x3x4=24 de elemente. 7.6.4.2 Accesarea componentelor unei matrice multidimensionale Pentru a accesa un element al unei matrice multidimensionale, trebuie s specificai indicii corespunztori fiecrei dimensiuni a matricei, ce caracterizeaz elementul respectiv. Urmtoarea subrutin declar o matrice bidimensional i o umple cu anumite valori, pe care apoi le afieaz. Fiecrui element al matricii i vom da ca valoare suma indicilor care i corespund. Sub Matrice() Dim i As Integer Dim j As Integer crearea matricei dinamice Dim iMat() As Integer redimensionarea matricei ReDim iMat(1 To 2, 1 To 3) For i = 1 To 2 For j = 1 To 3 iMat (i, j) = i+j Next Next For i = 1 To 2 For j = 1 To 3 Debug.Print i & + & j & = & iMat(i, j)
Pag. 126

Next Next End Sub Rulnd subrutina de mai sus, vei obine rezultatele din figura 7.12.

Fig. 7.12 7.6.5 tergerea matricelor dinamice O matrice ocup n memorie 20 de octei, plus cte 4 octei pentru fiecare dimensiune, plus numrul de octei necesari datelor stocate, adic numrul de elemente ale matricei nmulit cu numrul de octei ocupai de tipul respectiv de date. Astfel, matricea iMatrice (1, 2, 3) ocup n memorie: 20 octei + 3x4 octei + (2x3x4)x2 octei = 80 octei.
Pag. 127

Pentru a elibera memoria ocupat de o matrice dinamic, putei folosi instruciunea Erase astfel: Erase iMatrice Folosit pentru matrice statice, instruciunea Erase le va reiniializa, fr s elibereze memoria ocupat de acestea. 7.6.6 Folosirea matricelor ca parametri pentru proceduri Access v permite s dai i matrice ca parametri funciilor i subrutinelor. Un paametru-matrice (sau matrice de parametri) v d posibilitatea de a crea proceduri cu un numr variabil de parametri. De exemplu, urmtoarea funcie 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 scriei: ?Media (1,2,3,4,5) i apsai tasta Enter, vei obine rezultatul 3. Iat trei lucruri eseniale pe care trebuie s le avei n vedere cnd lucrai cu parametri de tip matrice: Pentru a declara o matrice ca parametru al unei proceduri, precedai-o cu cuvntul cheie ParamArray. Un parametru de tip matrice poate aprea doar pe ultima poziie n lista de parametri ai unei proceduri. Matricele de parametri pot fi numai de tipul Variant. Funcia Media calculeaz nti suma tuturor elementelor matricei de parametri, pe care o mparte apoi la numrul total de elemente. Not: Indicii matricelor de parametri ncep ntotdeauna de la zero, indiferent dac n modulul ce conine procedura ai specificat sau nu opiunea Option Base 1.
Pag. 128

Funcia predefinit Ubound returneaz valoarea celui mai mare indice al unei matrice. Cum indicii matricei de parametri aNum ncep de la 0, numrul total de elemente este Ubound(aNum) + 1. 7.7 Lucrul cu biblioteci DLL i cu funcii Windows API Vom vorbi n continuare despre una dintre cele mai importante faciliti oferite de VBA: posibilitatea de a apela un DLL (Dynamic Link Library) dintr-o procedur VBA. Astfel, putei realiza mai mult dect v permit funciile predefinite i instruciunile VBA: putei controla sistemul de operare Windows. Windows vine cu mai multe biblioteci DLL, ce conin sute de funcii utile pentru programatori. Aceste funcii formeaz ceea ce poart numele de Windows API (prescurtarea API vine de la Application Programming Interface, adic interfaa de programare a aplicaiilor Windows). Dar ce este, de fapt, un DLL? Este un fiier surs ce conine un numr mare de funcii (o bibliotec de funcii). Programatorul poate folosi o funcie DLL ntr-un program de-al su fr ca acel program s conin o copie a funciei respective. Indiferent de numrul aplicaiilor ce apeleaz funcii dintr-un DLL la un moment dat, biblioteca DLL se ncarc n memorie o singur dat, i anume, prima oar cnd s-a apelat o funcie din el. Apoi, dup ce aplicaiile nu mai au nevoie de funciile sale, biblioteca DLL este descrcat din memorie. 7.7.1 Declararea funciilor API nainte de a putea apela o funcie dintr-un DLL, trebuie s-I dai indicaii lui Access unde se afl funcia i cum anume s o apeleze. Acest lucru l realizai cu ajutorul instruciunii Declare, incluznd practic o declarare a funciei la seciunea (General) (Declarations) a modului n care se face apelul. Printr-o astfel de declaraie, VBA primete ase informaii: Domeniul de vizibilitate al funciei; Numele pe care l vei folosi n codul dumneavoastr pentru a apela funcia; Numele i calea bibliotecii DLL care o conine; Numele funciei, aa cum este ea definit n DLL; Numele i tipul argumentelor; Tipul valorii returnate (dac aceasta exist). Dac funcia returneaz o valoare, sintaxa instruciunii Declare este:

[Public | Private] Declare Function denumireaFunctiei_ Lib numeleBibliotecii [Alias numeleDinDLLAlFunctiei]_


Pag. 129

[([argumente])] [As tip] iar dac funcia nu returneaz nici o valoare: [Public | Private] Declare Sub denumireaFunctiei_ Lib numeleBibliotecii [Alias numeleDinDLLAlFunctiei]_ [([argumente])] 7.7.1.1 Domeniul de vizibilitate al funciei API Ca i n cazul unei proceduri VBA obinuite, putei stabili vizibilitatea funciilor declarate prin intermediul instruciunii Declare. Astfel, dac instruciunea Declare e precedat de cuvntul cheie Private, funcia API nu va fi apelat dect din modulul n care a fost declarat. Dac folosii cuvntul cheie Public (care e i implicit), funcia va putea fi apelat din orice modul. 7.7.1.2 Denumirea funciei API n cadrul instruciunii Declare trebuie s specificai i denumirea pe care o vei folosi n codul dumneavoastr pentru a apela funcia API respectiv. Aceast denumire trebuie s respecte regulile impuse pentru orice procedur VBA: s nceap cu o liter, s conin numai caractere alfanumerice sau caracterul underscore(_), s fie unicn cadrul domeniului su de vizibilitate, s conin maximum 255 de caractere i s nu fie un cuvnt cheie VBA. Dac nu folosii clauza Alias pentru a specifica numele din DLL al funciei, denumirea trebuie s fie exact aceeai cu acest nume din DLL. 7.7.1.3 Specificarea bibliotecii DLL n cadrul clauzei Lib a instruciunii Declare trebuie s specificai, ntre ghilimele, numele bibliotecii DLL i, eventual, locaia sa pe disc. Dac biblioteca DLL este una dintre principalele biblioteci DLL din Windows, putei omite extensia .DLL (de exemplu, User32, GDI32 sau Kernel32). Dac nu specificai calea complet pentru DLL, Windows l va cuta n ordine: 1. n directorul n care se afl Access; 2. n directorul curent; 3. numai pentru Windows NT: n directorul Windows\System32; 4. n directorul Windows\System; 5. n directorul Windows; 6. n directoarele din PATH. 7.7.1.4 Clauza Alias Clauza Alias a instruciunii Declare c permite s schimbai numele unei funcii API din cel specificat n DLL ntr-unul permis n VBA. Astfel, dac ai specificat o alt denumire pentru funcie dect cea dat n DLL, trebuie s includei n
Pag. 130

instruciunea Declare i clauza Alias, care s conin numele exact al funciei. De exemplu, pentru a declara funcia API_lwrite(), trebuie s folosii un alias, deoarece n VBA numele funciilor nu pot ncepe cu caracterul underscore(_): Declare Function lwrite Lib Kernel32 Alias _lwrite _ (ByVal hFile As Integer, ByVal lpBuffer As String, ByVal intBytes_ As Integer) As Integer Astfel, pentru a apela n codul dumneavoastr funcia_lwrite() din Kernel32.DLL, vei folosi denumirea lwrite(). 7.7.1.5 Argumente n mod implicit, Access d unei proceduri, ca argumente, pointeri la adresa de memorie a variabilelor i nu valorile explicite ale acestora. Cu toate acestea, multe funcii API ateapt s primeasc drept argumente valorile variabilelor i nu pointeri la adresele lor. n acest caz, trebuie s dai i dumneavoastr acestor funcii, ca argumente, tot valori i acest lucru l realizai plasnd cuvntul cheie ByVal n faa numelor argumentelor funciei din cadrul instruciunii Declare: Declare Function GetSystemMetrics Lib user32 (ByVal nIndex_ As Long) As Long iruri de caractere ca argumente Multe funcii API primesc ca argumente iruri de caractere ce se termin cu caracterul \0 (al crui cod ASCII este 0). VBA nu lucreaz cu astfel de iruri de caractere. De aceea, pentru a putea da un ir VBA ca argument unei funcii dintr-un DLL, trebuie nti s-l transformai ntr-un ir de caractere ce se termin cu \0. Tot cuvntul cheie ByVal v ajut i de aceast dat. Astfel, dac folosii acest cuvnt cheie pentru un argument de tip String, VBA l convertete ntr-un ir terminat cu \0 i apoi i d funciei API respective un pointer la adresa de memorie a irului. Dei acest fapt vine n contradicie cu ce am spus pn acum, el se aplic totui irurilor n VBA. Dac o funcie dintr-un DLL primete ca argument valoarea unei variabile, ea nu va putea modifica efectiv aceast valoare. Dac ns funcia primete adresa de memorie a variabilei, atunci ea i poate modifica valoarea. Cum aceasta se ntmpl i n cazul irurilor de caractere, pot aprea probleme. Dac funcia din DLL modific valoarea irului de caractere primit ca argument i noua valoare conine mai multe caractere, funcia nu modific i dimensiunea irului. Ea scrie noul ir la adresa respectiv, suprascriind caracterul \0 i ocupnd n continuare locaii de memorie adiacente. Acest fapt poate duce la blocarea aplicaiei i chiar a sistemului. Pentru a-l evita, trebuie s v asigurai c irul pe care-l dai funciei ca

Pag. 131

argument este suficient de mare pentru a putea pstra valorile pe care aceasta i le va atribui. Putei folosi n acest scop un ir de caractere de lungime fix, suficient de mare: Dim strSir As String* 255 Matrice ca argumente Putei da ca argumente unei funcii API elementele unei matrici aa cum i-ai da orice alt variabil. Pentru a face acest lucru, pur i simplu dai funciei ca argument primul element al matricei. Funcia va ti s regseasc i celelalte elemente. Deoarece elementele unei matrice se afl la locaii consecutive de memorie, este suficient ca funcia s tie unde ncepe matricea i dimensiunea ei. Nu putei da ca argument unei funcii dintr-un DLL. Transformarea tipurilor de date ale argumentelor Deoarece majoritatea bibliotecilor DLL sun scrise n C sau C++, tipurile de date ale argumentelor funciilor pe care acestea le conin nu sunt aceleai cu tipurile de date VBA. De aceea, e necesar s folosim n instruciunea Declare tipul de date VBA corespunztor tipului C al argumentului funciei din DLL. Tabelul 7.13 arat corespondenele dintre tipurile date din limbajul C i tipurile VBA. Tip de date n C ATOM, BOOL, HFILE, int, UINT, WORD, WPARAM int FAR*, UINT FAR* BYTE BYTE* CALLBACK, DWORD, FARPROC, HACCEL, HANDLE, HBITMAP, HBRUSH, HGLOBAL, HICON, HINSTANCE, HLOCAL, HMENU, HMETAFILE, HMODULE, HPALETTE, HPEN, HRGN, HRSRC, HTASK, HWND, LONG, LPARAM, LRESULT Char*, LPSTR, LPCSTR Tabelul 7.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 funcii API primesc argumente ce au ca tip de date alte tipuri dect cele predefinite. Acestea se numesc tipuri de date definite de utilizator sau tipuri-utilizator. Un tip-utilizator poate fi o structur n C, adic un mod de a grupa variabile de tipuri diferite i care mpreun definesc un nou concept. Una dintre structurile cel mai des
Pag. 132

folosite n bibliotecile DLL este structura RECT, ce reprezint un dreptunghi prin distanele laturilor sale fa de marginea din stnga i, respectiv, de sus a ecranului. Type RECT left As Long top As Long right As Long bottom As Long End Type este tipul VBA corespunztor structurii RECT n C. 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).

Pointeri nuli Exist i cazuri cnd o funcie API ateapt ca argument pointerul nul, care n VBA este dat ca: ByVal 0& unde caracterul & arat faptul c pointerul este pe 32 de bii (adic Long). Observai faptul c pointerul nul trebuie dat ca argument prin valoare. De exemplu, funcia API ClipCursor (pe care o vom folosi n Exemplul 2) are argumentul: lpRect As Any Dac ea primete ca argument un pointer la o variabil de tip RECT, atunci cursorul va fi capturat n dreptunghiul definit de acea variabil. Dac primete ca argument pointerul nul, ea elibereaz cursorul. Tipul Any este folosit pentru a dezactiva mecanismul Access de verificare a corespondenei dintre tipurile argumentelor din declaraia unei funcii i tipurile argumentelor efective, astfel nct funcia poate primi orice tip de date pentru un argument de tip Any. Not: Atunci cnd lucrai cu funcii DLL, este bine s facei regulat copii ale bazei de date. Este de asemenea bine s salvai orice alte informaii din alte aplicaii Windows deschise, deoarece este posibil ca, din cauza unor erori generate de aceste funcii, sistemul s se blocheze i s pierdei informaiile nesalvate.

Pag. 133

CAP:8. Lucrul cu obiecte Unul dintre motivele principale ale apariiei programrii orientate pe obiecte este nevoia de a modela ct mai bine fenomenele i entitile din lumea nconjurtoare. O main, o cas, un calculator toate acestea sunt obiecte, care la rndul lor conin diferite pri componente obiecte i ele. Caracteristica cea mai important a obiectelor este aceea c ele conin toate informaiile necesare pentru a funciona. n Access 97, un formular este un obiect. El tie tot ce trebuie pentru a-i face datoria. De exemplu, dac apsai butonul Cnacel, formularul se nchide; dac apsai butonul Minimize din bara de titlu, formularul se minimizeaz etc. Astzi ntlnim obiecte n mai toate domeniile programrii: programare obiectual sistem, sisteme de gestiune a bazelor de date orientate pe obiecte, programare obiectual n proiectare, jocuri orientate obiectual, peste tot, numai programare obiectual. i toate acestea se datoreaz avantajelor pe care aceasta le ofer fa de limbajele procedurale tradiionale: Eficien mai mare datorat posibilitii de a refolosi cantiti nsemnate de cod din alte aplicaii, de unde rezult i creterea complexitii i calitii aplicaiilor; Posibilitatea de a accesa date stocate pe platforme i sisteme diferite; Posibilitatea de a oferi utilizatorilor metode grafice intuitive i prietenoase de comunicare cu sistemul. n continuare, vom explica termenii cheie ce apar atunci cnd vorbim de obiecte. Proprieti Toate obiectele au ca proprieti ce le caracterizeaz. Aa cum o main se caracterizeaz prin marc, model, culoare i o groaz de caracteristici tehnice, n Access 97 un formular are i el o mulime de proprieti, cum ar fi: titlul (Caption), filtrul (Filter) etc. Proprietile unui obiect pot fi modificate fie cu ajutorul paginii de proprieti n modul Design View, fie prin intermediul limbajului VBA. Metode Metodele reprezint modul n care un obiect efectueaz diferite aciuni. Aa cum o main tie ce metod s aplice pentru a frna atunci cnd oferul apas pedala de frn, n Access 97 obiectul baz de date (Database) are o metod pentru a crea un nou set de nregistrri (OpenRecordset).
Pag. 134

Clase O clas reprezint mulimea tuturor obiectelor care au aceleai proprieti i metode. Un obiect al unei clase poart numele de instan a clasei respective. O clas poate avea mai multe subclase (sau clase derivate) care motenesc proprietile i metodele clasei de baz dar, pe lng acestea, mai au i propriile lor proprieti i metode, ce le particularizeaz.

8.1 Obiectele din Access 97 n Access exist dou seturi de obiecte: obiectele Access generale (prezentate n tabelul 8.1) i obiecte pentru accesarea datelor (Data Access Objects sau, pe scurt, DAO), prezentate n tabelul 8.2. Obiect Access Application Control DoCmd Debug Form Module Report Screen Section Pages References Tabelul 8.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 Aciuni n VBA Fereastra Debug Un formular sau subformular deschis Un modul Un raport sau subraport deschis Ecranul O seciune a unui formular sau raport Paginile unui control Referine la alte biblioteci de obiecte

Descriere Un obiect care conine informaii despre alte obiecte O baz de date deschis Motorul bazei de date Informaii pe care motorul bazei de date le administreaz, despre alte obiecte Erori generate de accesarea datelor Un cont al unui grup de utilizatori Un index pe o tabel Un parametru al unei interogri Proprietatea unui obiect O interogare salvat Un set de nregistrri definit de o tabel sau interogare
Pag. 135

Relation TableDef User Workspace

O relaie ntre dou tabele sau interogri O tabel salvat Contul unui utilizator O sesiune de lucru cu o baz de date Tabelul 8.2

n continuare, vom vorbi mai pe larg despre obiectele DAO i despre cum se folosesc ele. 8.1.1 Colecii n tabelul 8.2 ai vzut c o baz de date este un obiect care conine, la rndul su, alte obiecte. n mod asemntor, formularele conin controale, iar tabelele, cmpuri. Obiectele care sunt coninute ntr-un alt obiect sunt grupate n colecii. Coleciile pot fi formate numai din obiectele aceleiai clase. Astfel, dac un obiect conine mai multe formulare, acestea vor forma colecia Forms (formulare) a obiectului respectiv. O colecie poate fi deci considerat ca fiind un vector. Figura 8.3 prezint obiectele DAO sub forma unei diagrame ierarhice ce arat legturile dintre obiecte i coleciile lor.

Figura 8.3

Pag. 136

n vrful ierarhiei se afl DBEngine (motorul bazei de date). El conine dou colecii: Errors i Workspaces (erori i sesiuni de lucru). n Workspace este ca un birou al unei cldiri, cldirea fiind motorul DBEngine. Colecia Errors conine o list cu erorile aprute n DBEngine. Aproape toate aciunile dumneavoastr sunt procesate de motorul DBEngine i sunt efectuate asupra unui obiect DAO. De aceea, este foarte important s nelegei ce sunt obiectele pentru accesarea datelor i care sunt relaiile dintre ele. Pentru aceasta, 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. 1. Creai un nou modul standard n baza de date curent (Cursuri Optionale.mdb). Deschidei fereastra Debug i scriei n ea: ?DBEngine.Workspaces(0).Name Dup ce ai apsat tasta Enter, vei primi urmtorul rezultat: #Default Workspace# (adic sesiunea de lucru implicit).

Prin linia de cod scris mai sus ai cerut numele unei sesiuni de lucru. Obiectul DBEngine, care se afl n vrful ierarhiei DAO, conine dou colecii: Workspaces i Errors. Colecia Workspaces este, de fapt, o matrice ale crei elemente sunt obiecte de tip Workspace. Astfel, DBEngine.Workspaces(0).Name nseamn proprietatea Name (nume) a elementului cu indicele 0 al coleciei Workspaces a obiectului DBEngine. 2. S coborm pe o treapt inferioar a ierarhiei, cernd numele bazei de date curente. Pentru aceasta, introducei n fereastra Debug: ?DBEngine.Workspaces(0) . Databases(0) .Name

Pag. 137

Dup ce apsai tasta Enter, rezultatul va fi calea complet i numele fiierului n care se afl baza de date curent.

Fiecare obiect de tip Workspace conine trei colecii: Users (utilizatori), Gorups (grupuri) i Databases (baze de date) care, la rndul lor pot fi privite ca matrice (vectori). Prin linia de cod de mai sus ai cerut, aadar numele obiectului de tip Database cu indicele 0 din cadrul coleciei Databases a obiectului Workspaces(0) al obiectului DBEngine. 3. Mai coborm o treapt a ierarhiei i cerem numele unui obiect al unei colecii a obiectului, DBEngine.Workspaces(0) .Databases(0), i anume: ?DBEngine.Workspaces(0).Databases(0).TableDefs(0).Name

TableDefs(0) e obiectul cu indicele 0 din matricea TableDefs (tabele salvate). Dup ce apsai pe Enter, rezultatul va fi numele unei tabele din baza de date curent, i anume, Curs. Dac nlocuii TableDefs(0) cu TableDefs(3), vei obine un rezultat mai neobinuit: MSysACEs. Aceasta deoarece tabelele sunt stocate n ordine alfabetic n cadrul matricei TableDefs, astfel nct tabelei sistem MSysACEs (folosit de Access) i corespunde indicele 3 (primele trei tabele sunt, n ordine alfabetic: Curs, Curs_Prof i Curs_Student).
Pag. 138

Observai c ntre obiectele de pe trepte consecutive ale ierarhiei i ntre obiecte i proprietile lor se pune un punct. Continund ca mai sus, putei gsi informaii despre toate obiectele stocate ntr-o baz de date. n continuare, ne vom ocupa n detaliu cu obiectele i coleciile ierarhiei DAO. Not: E important s sesizai diferena dintre o colecie i tipul elementelor ce o compun. Spre exemplu, Workspaces (la plural) este numele coleciei, iar Workspace (la singular) este tipul elementelor pe care ea le conine. Obiectul DBEngine (motorul Jet Engine) Este obiectul aflat n vrful ierarhiei DAO, este un obiect predefinit ce nu poate fi creat. Exist un singur obiect DBEngine pentru o aplicaie. El nu face parte din nici o colecie i conine toate celelalte obiecte. El poate fi folosit pentru a compacta sau repara o baz de date, pentru a nregistra baze de date ODBC, pentru a obine versiunea motorului Jet i pentru a stabili timpul maxim necesar deschiderii sesiunii unui utilizator.

Colecia Errors (Erori) Un obiect de tip Error primete toate erorile aprute n urma eurii unei aciuni efectuate asupra unui obiect DAO. Erorile sunt ordonate n cadrul coleciei n funcie de codul lor. Colecia Workspaces (Sesiuni de lucru) Un obiect de tip Workspace definete o sesiune de lucru pentru un utilizator. Acest obiect conine toate bazele de date deschise de acel utilizator. Tranzaciile efectuate n cadrul unei sesiuni (obiect de tip Workspace) sunt globale tuturor bazelor de date ale sesiunii respective. Access creeaz implicit obiectul Workspaces(0). Dac nu au fost impuse msuri de securitate asupra bazei de date curente, proprietii Name(nume) a acestui obiect i se d valoarea #Default Workspace#, iar proprietii UserName(numele utilizatorului) i se d valoarea Admin(administrator). Acest obiect implicit nu poate fi ters sau nchis i este deci disponibil tot timpul. Colecia Databases (Baze de date) Un obiect de tip Database reprezint o baz de date deschis sau creat cu DAO. Cu ajutorul metodei CreateDatabase a unui obiect Workspace, adugai automat o baz de date la colecia Database a sesiunii respective. O baz de date poate fi nchis cu ajutorul metodei Close, ceea ce o va terge din cadrul coleciei. Colecia Databases conine toate bazele de date deschise DAO, plus baza de date curent, deschis n Access (care este obiectul DBEngine.Workspaces(0). Databases(0) sau CurrentDB).
Pag. 139

Colecia Users (Utilizatori) Un obiect de tip User reprezint contul unui utilizator. Vom reveni cum mai multe detalii despre utilizatori, conturi i grupuri, cnd vom vorbi despre aplicaii multiuser i securitate. Colecia Groups (Grupuri) Un obiect de tip Group (grup) reprezint grupuri de utilizatori i drepturile acestora. Fiecare utilizator dintr-un grup e reprezentat printr-un obiect de tip User din colecia Users a grupului. Colecia QueryDefs (Interogri) Fiecare interogare salvat n Access sau creat cu ajutorul metodei CreateQueryDef este reprezentat printr-un obiect de tip QueryDef din colecia QueryDefs. Obiectele de tip QueryDef sunt deci instruciuni SQL precompilate. Cu ajutorul unui obiect de tip QueryDef putei crea seturi de nregistrri, i putei regsi instruciunea SQL, putei afla dac returneaz sau nu nregistrri sau putei executa interogarea. Colecia TableDefs (Tabele) Un obiect de tip TableDef reprezint o tabel stocat ntr-o baz de date. Tabela se poate afla n baza de date curent sau poate fi ataat dintr-o baz de date extern. Cu ajutorul unui obiect de tip TableDef putei afla dac tabela e ataat, i putei afla regulile de validare, dac poate fi sau nu actualizat sau numrul de nregistrri. Colecia Indexes (Indeci) Un obiect de tip index reprezint un index al unei tabele sau al unui set de nregistrri. Colecia Fields (Cmpuri) Un obiect de tip Field reprezint o coloan. Obiectele de tip Relation (relaie), Recorset, TableDef, QueryDef i Index conin cte o colecie Fields. Atributele unui cmp pot fi aflate i modificate prin intermediul proprietilor obiectului Field corespunztor. Colecia Recordsets (Seturi de nregistrri) Obiectele de tip Recordset (set de nregistrri) sunt cel mai des folosite i deci, poate, cele mai importante obiecte DAO. Aceste obiecte sunt temporare (nu sunt salvate pe disc).

Pag. 140

Colecia Relations (Relaii) Fiecare relaie dintre dou sau mai multe tabele ale unei baze de date Access e reprezentat printr-un obiect de tip Relation. Colecia Relations a unui obiect de tip Database conine toate relaiile definite n baza de ate respectiv. Colecia Parameters (Parametri) Ai vzut c n Access putei crea interogri cu parametri. Parametrii declarai cu ajutorul cuvntului cheie PARAMETERS n instruciunea SQL a unei interogri se numesc parametri formali. Colecia Parameters a unui obiect de tip QueryDef e format din toi parametri formali definii pentru interogarea respectiv. Nu putei terge sau aduga obiecte la colecia Parameters. Colecia Properties (Proprieti) Un obiect de tip Property reprezint o caracteristic a unui obiect. Fiecare obiect DAO are o colecie Properties. Un obiect de tip Properties poate fi o proprietate predefinit sau una definit de utilizator. Programatorul poate aduga proprieti (cu ajutorul metodei CreateProperty) unui anumit obiect i este responsabil pentru stabilirea i modificarea valorilor acestor proprieti. Proprietile definite de utilizator sunt singurele care pot fi terse din colecia Properties a unui obiect; proprietile predefinite nu pot fi terse. 8.1.2 Containere i documente Un container este o colecie de obiecte salvate n Access: baze de date, formulare, rapoarte, module, tabele, relaii. Termenul document este o descriere generic pentru un obiect stocat ntr-un container. Pentru a nelege mai bine ce reprezint containerele i documentele, gndii-v la fereastra Database. Fiecare pagin a acestei ferestre reprezint un container, iar fiecare obiect dintr-o pagin este un document. Pentru a examina containerele i documentele bazei de date Cursuri Optionale.mdb, vom scrie o subrutin care le va afia pe ecran. Sub Containere_Documente() Dim dbCrt As Database Dim conCrt As Container Dim docCrt As Document Set dbCrt = DBEngine.Workspaces(0) .Databases (0) For Each conCrt In DbCrt.Containers Debug.Print Container: & conCrt.Name For Each docCrt In conCrt.Documents Debug.Print Document: & docCrt.Name Next Next End Sub
Pag. 141

nti am definit trei variabile: una de tip Database, care indic baza de date curent, una de tip container care indic fiecare element din colecia Containers i una de tip Document, ce indic fiecare document dintr-un container. Apoi, pentru a itera printre elementele coleciilor Containers, am folosit instruciunea For Each, ce se aseamn cu instruciunea ForNext, cu deosebirea c este creat special pentru parcurgerea coleciilor 8.2 Lucrul cu variabile de tip obiect Cnd declarai o variabil obinuit, practic i cerei lui Access s aloce spaiul necesar stocrii unei informaii pentru care ai specificat un tip de date (dac nu specificai nici un tip de date, Access va considera n mod implicit c tipul e variant). Lucrurile sunt puin diferite la declararea unei variabile de tip obiect. n acest caz, Access creeaz numai un pointer la obiect. De exemplu, nici una din declaraiile de mai jos: Dim db As Database Dim form As Form Dim ctl As Control nu stocheaz informaii i, deocamdat, nu indic vreun obiect existent. Pentru a le face s indice un obiect, trebuie s folosim cuvntul cheie Set, ca mai jos: Set dbCrt = DBEngine.Workspaces(0) .Databases(0) Set form = dbForms!DetaliiProf Set ctl = frm.Controls!Nume Legtura dintre variabile i obiectul spre care acestea indic este distrus (i memoria necesar este eliberat) o dat cu expirarea duratei de via a variabilei. Dac dorii s facei dumneavoastr, explicit, acest lucru, putei folosi valoarea predefinit Nothing: Set frm = Nothing Dup cum ai mai vzut i n exemplele anterioare, pentru a accesa un anumit obiect DAO trebuie s parcurgei ierarhia n sens descresctor, pn la acel obiect: DBEngine.ColectieParinte.ColectieCopil (ObiectCopil) Tabelul 8.5 prezint cele patru metode prin care putei accesa un element al unei colecii.
Pag. 142

Sintaxa colectie (nume) colectie (var)

Exemplu DBEngine.Workspaces(0). Databases_ (Cursuri Optionale) StrBazaDate = Cursuri Optionale DBEngine.Workspaces(0). Databases_

Explicaii

var e o variabil de tip ir de caractere sau Variant

colectie (indice) colectie!nume Sau colectie! [nume]

(strBazaDate) DBEngine.Workspaces(0). Databases(0) DBEngine.Workspaces(0). Databases!_ [Cursuri Optionale] Tabelul 8.5

indice reprezint poziia obiectului n cadrul coleciei Parantezele drepte sunt necesare numai dac numele coleciei conine caractere speciale (de exemplu, spaii)

Astfel, dac vrei s accesai un obiect al crui nume l cunoatei, putei folosi acest nume ca mai jos: Debug.Print Current.TableDefs(Profesor).RecordCount Ai vzut c pentru a obine baza de date curent, trebuie s scriei: DBEngine.Workspaces(0) .Databases(0) Sau, pe scurt, DBEngine(0) (0) Access v mai pune ns la dispoziie i funcia CurrentDB(), pentru a obine un pointer la baza de date curent. Dac dorii s accesai o baz de date din afara sistemului Access (prin OLE), trebuie s folosii varianta DBEngine(0) (0). Altfel, dac lucrai n Access, putei folosi ambele variante, cu observaia c funcia CurrentDB() este mai rapid. Atenie, ns, la urmtorul aspect: nu putei folosi un pointer la un obiect pe care l-ai obinut apelnd funcia CurrentDB() ntr-o linie urmtoare de cod. Cu alte cuvinte, urmtoarea procedur: Sub Test1 () Dim doc As Document Set doc = CurrentDb.Containers!Forms.Documents(0) Debug.Print doc.Name

Pag. 143

va eua cnd va ncerca s tipreasc doc.Name deoarece, n acel punct, doc este un pointer invalid. Urmtoarea procedur, n schimb, va rula corect: Sub Test2 () Dim doc As Database Dim doc As Document Set db = CurrentDb() Set doc = db.Containers!Forms.Documents(0) Debug.Print doc.Name End Sub Cnd folosim semnul exclamrii (!) i cnd punctul (.) Att operatorul (!), ct i operatorul (.) sunt folosii pentru a descrie relaiile de apartenen dintre colecii, obiecte i proprieti. n general, dup (!) urmeaz numele unui obiect creat de dumenavoastr: un formular, un raport sau un control (deci un element al unei colecii). Astfel, operatorul (!) separ un obiect de colecia din care face parte. Operatorul (.) este folosit, n general, pentru a separa un obiect de o colecie, proprietate sau metod a sa. 8.3 Colecii implicite Ai putut observa din exemplele de pn acum c adesea, pentru a obine un pointer la un obiect, trebuie s scriei o linie de cod destul de lung. n Access ns, aproape orice tip de obiect are o colecie implicit, care va fi luat n considerare dac nu specificai nici o colecie. De aceea, DBEngine.Workspaces(0) .Databases(0) .TableDefs(0) se mai poate scrie prescurtat ca: DBEngine(0) (0) (0) Aceasta pentru c, dup cum putei vedea i n tabelul 8.6, TableDefs e colecia implicit a unui obiect de tip Database, Databases e colecia implicit a unui obiect de tip Workspace, iar Workspaces e colecia implicit a obiectului DBEngine. Obiect Container Database DBEngine Group Index QueryDef Recordset Relation TableDef User Colecia implicit Documents TableDefs Workspaces Users Fields Parameters Fields Fields Fields Groups
Pag. 144

Workspace Tabelul 8.6

Databases

8.4 Lucrul cu proprietile obiectelor Fiecare obiect DAO are o colecie de proprieti. Unele obiecte au i proprieti care nu exist pn n momentul n care li se d o valoare. De aceea, este important s nelegei diferenele dintre tipurile de proprieti ale obiectelor DAO. 8.4.1 Tipuri de proprieti Exist dou tipuri de proprieti DAO: predefinite i definite de utilizator. Proprietile predefinite ale unui obiect reprezint caracteristicile de baz ale acestuia. Ele exist nc de la crearea obiectului i sunt disponibile pentru orice aplicaie ce folosete motorul Jet. De exemplu, pentru un obiect de tip Field (cmp), proprietile Name(nume) i Type(tip) sunt predefinite. Proprietile definite de utilizator nu exist pn cnd nu sunt adugate la colecia Properties a obiectului. De exemplu, proprietatea Description (descriere) a unui cmp nu este predefinit i nu exist pn cnd nu introducei descrierea. Dac ncercai s regsii proprietatea Description a unui obiect ce nc nu o are, vei obine o eroare. 8.4.2. Accesul la proprieti Pentru a regsi o proprietate predefinit a unui obiect, putei folosi sintaxa: obiect.proprietate Pe de alt parte, nu putei regsi o proprietate definit de utilizator dect prin intermediul coleciei Properties a obiectului: Obiect.Properties(proprietar) sau Obiect.Properties!proprietate Aceast din urm sintax funcioneaz i pentru proprieti predefinite. 8.4.3. Stabilirea proprietilor Cu ajutorul instruciunii With putei stabili mai multe proprieti ale unui obiect, fr a mai fi necesar s specificai obiectul pentru fiecare proprietate n parte: Private Sub Set_Form_Prop() With txtCtl .Text = Acesta este un control de tip text
Pag. 145

.ForeColor = RGB(0, 255, 0) verde .BackColor = 0 End With End Sub 8.5. Crearea i manipularea obiectelor cu DAO n exemplele de pn acum, nu am fcut altceva dect s folosim DAO pentru a accesa obiecte existente i proprietile acestora. O mare parte a facilitilor oferite de DAO const ns n posibilitatea de a crea i de a modifica obiecte. 8.5.1. Crearea obiectelor Pentru a crea un obiect nou, procedai astfel: 1. Folosii una dintre metodele Create(CreateTable, CreateIndex etc.) pentru a crea obiectul dorit (tabel, index etc.). 2. Stabilii proprietile obiectului creat. Unele proprieti (cum ar fi numele) sunt eseniale i trebuie specificate la crearea obiectului. Altele pot fi stabilite i ulterior. 3. Adugai obiectul la colecia corespunztoare, pentru ca ele s fac parte din baza de date. Dac obiectul nou creat conine alte obiecte (aa cum o tabel conine cmpuri), trebuie s creai nti obiectul principal i pe urm cele subordonate, pe care le adugai la coleciile corespunztoare ale obiectului principal. Apoi, l adgai i pe acesta la colecia sa. Tabelul 8.7 prezint n detaliu metodele Createcu 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 ataate, sistem sau ascunse Informaii despre tipul tabelei de baz a unei tabele ataate Calea i numele fiierului unei tabele ataate Numele cmpului Tipul de date Dimensiunea (pentru
Pag. 146

Cmp

CreateField

Name Type Size

Index Interogare

CreateIndex CreateQueryDef

Name Name SQL Name Table ForeignTable Attributes

String String String String String String Integer

Relaie

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

cmpuri de tip text) Numele indexului Numele interogrii ir de caractere ce conine instruciunea SQL pe care se bazeaz interogarea Numele relaiei Numele tabelei primare Numele tabelei ce conine cheia strin Atributele relaiei: tipul relaiei, integritatea referenial, actualizri i tergeri n cascad Numele sesiunii de lucru Numele utilizatorului Parola pentru sesiune Numele fiierului ce conine baza de date Expresie ce specific limba pentru noua baz de date (pentru sortri i comparaii ntre variabile de tip text) O constant sau o combinaie 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.7 n continuare, vom ilustra crearea unor astfel de obiecte complexe.

Pag. 147

8.5.1.1. Crearea unei tabele Funcia urmtoare creeaz tabela Profesor1 i i adaug doar dou coloane: IdProf i Nume. 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.CreateTableDef () tdProf.Name = Profesor1 Set fd1 = tdProf.CreateField (IdProf, dbLong) Set fd2 = tdProf.CreateField (Nume, dbText, 60) Adaugarea la colectii With tdProf.Fields .Append fd1 .Append fd2 End With With db.TableDefs .Append tdProf Actualizarea colectiei TableDefs .Refresh End With End Function Este s folosii metoda Refresh (actualizare) pentru a v asigura c noile obiecte au fost adugate (acest lucru e recomandat mai ales n cazul unei aplicaii multiuser). Not: Aceast funcie nu trateaz nici o eroare i, de aceea, va eua dac o vei rula de dou ori consecutiv. Pentru a o putea rula cu succes a doua oar, tergei nti tabela creat. 8.5.1.2 Crearea unui index Iat care sunt paii pe care trebuie s-i urmai pentru a crea un index folosind DAO: Folosii metoda CreateIndex a unui obiect de tip TableDef pentru a crea indexul i stabilii-i proprietatea Name (nume). 2. Atribuii valorile dorite proprietilor noului index (cele mai importante proprieti sunt Name, Primary, Unique i Required). Dup ce ai adugat indexul la colecia sa, nu-i vei mai putea modifica proprietile.
1. Pag. 148

3. Pentru aceasta, va trebui s tergei obiectul i s creai unul nou, cu proprietile dorite. 4. Folosii metoda CreateField a indexului pentru a crea cte un obiect de tip Field pentru fiecare cmp ce face parte din index. Adugai-le apoi la colecia Fields a indexului. 5. Folosii metoda Append a obiectului de tip TableDef pentru a aduga indexul la colecia Indexes. Funcia CreareCheiePrimara() pe care o dm mai jos ca exemplu, creeaz o cheie primar pentru o tabel. Ea primete ca argumente numele tabelei, numele indexului i coloanele ce vor compune cheia primar. Argumentul varColoane fiind de tip Variant, poate conine fie o matrice, dac vor fi mai multe coloane n componena cheii primare, fie un singur nume. Pentru a testa dac nu exist deja o cheie primar pentru tabela respectiv, funcia CreareCheiePrimara() apeleaz funcia ExistaCP(), care returneaz numele indexului corespunztor cheii primare, dac acesta exist, sau valoarea Null, dac nu exist. De asemenea, pentru a aduga un obiect de tip Field la colecia Fields a unui index, funcia CreareCheiePrimara() apeleaz funcia AdaugareCamp(), ce returneaz valoarea True n caz de reuit i False n caz de eec. Pentru a testa funcia CreareCheiePrimara() am creat i subrutina TestCP, ce listeaz pentru tabela Curs_Prof cheia primar format din coloanele IdCurs i IdProf. Function CreareCheiePrimara(strTabela As String, strCP As String,_ 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.TableDefs(strTabela) Set idxs = td.Indexes daca exista o cheie primara, o stergem varCP = ExistaCP(td) If Not IsNull (varCP) Then Idxs.Delete varCP End If cream noul index Set idx = td.CreateIndex (strCP) facem ca indexul sa fie cheie primara. Astfel, stabilim automat proprietatile: IgnoreNulls = False; Required = True; Unique = True; idx.Primary = True
Pag. 149

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, varIdx) Next varIdx Else daca avem o singura coloana: Call AdaugareCamp (idx, 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.Indexes If idx.Primary Then ExistaCP = idx.Name Exit Function End If Next idx ExistaCP = Null End Function Private Function AdaugareCamp (idx As Index, varIdx As Variant)_ As Boolean Dim fd As Field On Error GoTo AdaugareCamp_Err If Len(varIdx & ) > 0 Then Set fd = idx.CreateField(varIdx) Idx.Fields.Append fd End If AdaugareCamp = True
Pag. 150

AdaugareCamp_Exit: Exit Function AdaugareCamp_Err: AdaugareCamp = False Resume AdaugareCamp_Exit End Function

Sub TestCP() Debug.Print CreareCheiePrimara(Curs_Prof, PrimaryKey,_ Array(IdCurs, IdProf)) End Sub

8.5.1.3 Crearea unei relaii Pentru a crea o relaie folosind DAO, trebuie s efectuai urmtorii pai: 1. Verificai dac tabela primar (tabela din partea 1 a relaiei) are definit o cheie primar. 2. Folosii metoda CreateRelation a obiectului baz de date pentru a crea relaia. Proprietile relaiei le putei stabili fie la crearea ei, fie ulterior, una cte una (Table, ForeignTable i Attributes sunt printre cele mai importante). 3. Creai cte un obiect de tip Field (cmp) pentru fiecare coloan din cheia primar a tabelei primare. Pentru fiecare dintre acestea, stabilii proprietatea ForeignName, ce reprezint numele coloanei corespunztoare din tabela din partea (many) a relaiei. Adugaia apoi obiectele de tip Field la colecia Fields a relaiei. 4. Folosii metoda Append a obiectului de baz de date pentru a aduga relaia la colecia Relations. Funcia CreareRel, prezent mai jos, creeaz o asociere left outer join ntre tabelele Profesor i Titlu i permite actualizrile n cascad. Dac relaia exist deja, funcia CreareRel o terge i o creeaz din nou. 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.CreateRelation() stabilim proprietatile relatiei
Pag. 151

With rel .Name = RelProfTitlu .Table = Titlu .ForeignTable = Profesor left outer join, modificari in cascada .Attributes = dbRelationLeft Or dbRelationDeleteCascade End With cream campurile Set fd = rel.CreateField(IdTitlu) fd.ForeignName = IdTitlu rel.Fields.Append fd adaugam relatia la colectia Relations CreareRel = True CreareRel_Exit: Exit Function CreareRel_Err: Select Case Err.Number Case 3012 daca relatia exista deja Db.Relations.Delete rel.Name Resume Case Else MsgBox Relatia nu a putut fi creata CreareRel = False Resume CreareRel_Exit End Select End Function

8.5.1.4. Crearea proprietilor-utilizator DAO v d posibilitatea s creai noi proprieti pentru un obiect, pe care s le adugai apoi la colecia Properties a obiectului respectiv. Paii pe care trebuie s-i urmai sunt cei de mai jos: 1. Folosii metoda CreateProperty a obiectului respectiv pentru a crea proprietatea. 2. Definii caracteristicile proprietii. 3. Adugai proprietatea la colecia Properties a obiectului. Subrutina de mai jos creeaz o nou proprietate pentru o tabel: UltimaModificare. Ea pstreaz data ultimei modificri a tabelei. Sub UltimaModif(strTab As String) Dim db As Database
Pag. 152

Dim tb As TableDef Dim prUltMod As Property Set db = CurrentDb() Set tb = db.TableDefs(strTab) cream noua proprietate Set prUltMod = td.CreateProperty(UltimaModificare, dbDate, Now) adaugam UltimaModificare la colectia Properties ignoram posibilele erori On error Resume Next td.Properties.Append prUltMod afisam valoarea proprietatii Debug.Print td.Properties(UltimaModificare).Value End Sub Deoarece metoda Append d o eroare dac proprietatea exist deja, pentru a scpa de probleme am dezactivat detectarea erorilor. 8.5.2. Modificarea obiectelor Putei modifica un obiect existent fr a-l deschide n modul Design View, ci numai folosind proprietile i metodele furnizate de DAO. Trebuie totui s inei cont de anumite restricii atunci cnd stabilii proprietile unui obiect DAO. Unele proprieti pot fi stabilite numai la crearea obiectului i nu mai pot fi modificate dup ce acesta a fost adugat la colecia corespunztoare (proprietatea Attributes a unui obiect de tip TableDef e un exemplu n acest sens). Pentru a modifica o astfel de proprietate, trebuie s creai un nou obiect, s copiai n el toat informaia coninut n cel vechi, s stabilii proprietatea respectiv, s adugai noul obiect la colecia sa i apoi s tergei vechiul obiect. De asemenea, trebuie s inei cont de faptul c unele proprieti ale unui obiect DAO nu exist dect din momentul n care li s-a dat o valoare, astfel nct ncercarea de a regsi o astfel de proprietate s-ar putea solda cu o eroare. 8.6. Obiecte definite de utilizator n Access 97 putei crea propriile dumneavoastr obiecte, cu proprietile i metodele lor, n cadrul modulelor pentru clase. Pe parcursul acestui subcapitol, ne-am propus s crem un obiect care s poat fi accesat prin VBA i care s ofere diferite informaii despre sistem. 8.6.1. Proprietile i metodele obiectului Primul lucru pe care trebuie s-l facem atunci cnd crem un obiect este s stabilim care sunt informaiile pe care acesta le va oferi. Cu alte cuvinte, trebuie s determinm caracteristicile i comportamentul lui. Tabelul 8.8 conine proprietile obiectului Calculator, pe care l vom crea.
Pag. 153

Proprietate Calculator.Nume Calculator.PornireWindows

Descriere ir de caractere ce conine numele calculatorului Proprietate de tip Date/Time, ce arat cnd a fost pornit ultima oar sistemul de operare Windows Calculator.DirAccess ir de caractere ce conine directorul n care se afl msaccess.exe Tabelul 8.8 n plus fa de aceste proprieti, obiectul Calculator trebuie s-i ofere utilizatorului posibilitatea de a efectua diferite aciuni, cum ar fi, de exemplu, tergerea unui director gol sau redarea unui fiier de sunet wave. Pentru aceasta, vom implementa metodele Calculator.StergeDir i Calculator.RedareWave

Ceea ce vom face pe parcursul acestui capitol este s definim o clas (clasa Calculator), cu ajutorul unui modul pentru clase (class module). Apoi, prin VBA, vom putea crea i folosi obiecte ale acestei clase. Deschidei fereastra Database i alegei comanda Class Module din meniul Insert pentru a crea un nou modul pentru clase. Salvai acest modul cu numele Calculator (numele clasei pe care dorim s o implementm). Observai c modulele pentru clase sunt foarte asemntoare cu modulele standard. Una dintre diferene este aceea c ele pot conine dou proceduri speciale, Class_Initialize() i Class_Terminate(). Procedura Class_Initialize() se apeleaz automat la crearea instanelor unui obiect al clasei definite n modulul respectiv. De aceea, n cadrul acestei proceduri se efectueaz, de obicei, iniializri ale proprietilor obiectului. Procedura Class_Terminate() este apelat ori de cte ori este distrus o instan a unui obiect bazat pe modulul respectiv. Declarai nti la seciunea (General)(Declarations) a modulului o variabil global n cadrul modulului Calculator: Private strDirAccess As String Creai subrutina Calss_Initialize(), selectnd din caseta combinat Object (aflat n partea din stnga-sus a ferestrei modulului) seciunea Class, iar din caseta combinat Procedure (din partea dreapta-sus a ferestrei modulului), evenimentul Initialize (iniializare). n cadrul acestei subrutine vom iniializa variabila global declarat anterior. Ea va pstra directorul (cu calea complet) n care este instalat aplicaia Access (n care se afl fiierul Msaccess.exe). Pentru a obine o informaie, vom apela funcia VBA SysCmd. Scriei deci, n cadrul subrutinei Class_Initialize(), urmtoarea linie de cod:
Pag. 154

StrDirAccess = SysCmd(acSysCmdAccessDir) Funcia SysCmd() poate fi folosit pentru a efectua diferite aciuni n Access. Dac i dm ca parametru constanta intrinsec acSysCmdAccessDir, ea va returna un ir de caractere ce reprezint directorul n care se afl Msaccess.exe. Faptul c am obinut aceast informaie nu este suficient. Mai trebuie s ne asigurm c ea poate fi accesat prin intermediul proprietii Calculator.DirAccess. Procedura Property Get creeaz o proprietate i stabilete modul n care sunt regsite valorile acestei proprieti. Ea are urmtoarea 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; Private indic faptul c procedura Property Get poate fi apelat numai de ctre procedurile din modulul n care a fost declarat; Static indic faptul c valorile variabilelor locale ale procedurii se pstreaz ntre apeluri; NumeProprietate numele proprietii ale crei valori le regsete procedura; ListaArgumente lista argumentelor procedurii; TipDate tipul de date al proprietii. Procedura Property Get ce regsete valoarea proprietii DirAccess este: Public Property Get DirAccess() As String DirAccess = strDirAccess End Property Proprietatea Calculator.dirAccess este read-only, adic valoarea ei nu poate fi modificat. Totui, majoritatea proprietilor unui obiect (formular, raport, control etc.) i pot schimba valoarea. O astfel de proprietate este i Calculator.Nume. pentru a regsi i modifica valoarea acestei proprieti, vom folosi dou funcii API, GetComputerName i, respectiv, SetComputerName, ale cror declaraii: Private Declare Function GetComputerName Lib kernel132 Alias_ GetComputerNameA (ByVal lpBuffer As String, nsize As Long) As Long Private Declare Function SetComputerName Lib kernel132 Alias_ SetComputerNameA (ByVal lpComputerName As String) As Long trebuie s le includei la seciunea (General)(Declarations) a modulului.
Pag. 155

Funcia SetComputerName primete ca argument un ir de caractere ce reprezint noul nume pe care dorii s i-l dai calculatorului dumneavoastr. Modificarea nu devine efectiv ns dect dup ce ai nchis i pornit din nou calculatorul. Astfel, dac apelai funcia SetComputerName cu argumentul NumeNou i apoi apelai funcia GetComputerName fr a fi iniializat ntre timp calculatorul, aceasta din urm va returna vechiul nume al calculatorului i nu irul de caractere NumeNou, cum ar fi de ateptat. De aceea, ne propunem ca proprietatea Calculator.Nume s pstreze ultimul nume pe care l-am dat calculatorului n cadrul unei instane a obiectului Calculator i nu rezultatul returnat de funcia GetComputerName. Deoarece proprietatea Nume poate fi modificat, n plus fa de o procedur Property Get, trebuie s scriem i o procedur Property Let pentru aceasta proprietate, care s ne ajute s-i modificm valoarea prin intermediul unei simple atribuiri, sintaxa instruciunii Property Let este urmtoarea: [Public | Private] [Static] Property Let NumeProprietate_ (ListaArgumente) unde cuvintele cheie Public, Private, Static i NumeProprietate au aceleai semnificaii ca i pentru instruciunea Property Get, iar ListaArgumente reprezint argumentele procedurii. Numele i tipul fiecrui argument (cu execepia ultimului) trebuie s corespund exact numelui i tipului argumentelor procedurii Property Get a aceleiai proprieti. Ultimul argument reprezint noua valoare ce va fi atribuit proprietii i deci trebuie s aib acelai tip de date ca i cel returnat de procedura Property Get. Iat care sunt cele dou proceduri pentru regsirea i modificarea valorilor proprietii Calculator.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 seciunea (General)(Declarations) a acestuia: Private strNume As String * 255 Ea trebuie s fie iniializat n cadrul funciei Class_Initialize(): Call GetComputerName(strNume, 255)
Pag. 156

Pn acum am vorbit numai despre proprietile obiectului Calculator. Metodele unui obiect sunt mult mai simplu de implementat: ele sunt subrutine sau funcii publice obinuite. 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, 0, 0) End Sub Pentru a putea apela funciile API RemoveDirectory i PlaySound, trebuie s includei la seciunea (General)(Declarations) a modulului declaraiile lor: Private Declare Function RemoveDirectory Lib kernel132 Alias_ RemoveDirectoryA (ByVal lpPathName As String) As Long Private Declare Function PlaySound Lib winmm.dll Alias_ PlaySoundA (ByVal lpszName As String, ByVal hModule As Long, ByVal_ dwFlags As Long) As Long

8.6.2 Crearea instanelor 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. Prin urmtoarea lini de cod: Dim comp As New Calculator nu se creeaz o nou instan a obiectului Calculator, ci doar se aloc resursele necesare crerii unui nou obiect de acest tip. Obiectul n sine nu este creat pn cnd una dintre proprietile sau metodele sale nu este folosit sau apelat. Cu alte cuvinte, dac dup declaraia de mai sus am dori s afim proprietatea DirAccess i am scrie: MsgBox comp.DirAccess aceast instruciune este cea care declaneaz crearea obiectului, apelarea procedurilor: Class_Initialize i Prop Get DirAccess Instruciunea folosit pentru alocarea resurselor poate fi nlocuit cu: Set comp = New Calculator
Pag. 157

n acest caz, instruciunea Dim aloc spaiul necesar crerii obiectului, iar instruciunea Set determin crearea obiectului i apelarea procedurii Class_Initialize. Observai utilizarea cuvntului cheie New n ambele variante folosite pentru crearea instanelor. Acesta trebuie folosit pentru orice obiect. Pentru a testa funcionalitatea unui obiect de tip Calculator, crei un nou modul standard n care scriei urmtoarea subrutin: Sub testCalculator() Dim comp As New Calculator MsgBox comp.DirAccess MsgBox comp.Nume Comp.Nume = CalculatorulMeu End Sub 8.6.3. Durata de via a obiectelor n situaia n care avem mai multe variabile care fac referire la acelai obiect, acesta nu poate fi distrus i deci, resursele ocupate de el nu pot fi eliberate dect dup ce au fost distruse toate variabilele ce fac referire la el. Acest lucru se ntmpl ori cnd o variabil i ncheie durata de via (scopul), ori cnd ea primete valoarea Nothing: Set comp = Nothing 8.7 Lucrul cu obiecte de tip Recordset Adevrata putere a unei baze de date const n modul n care putem s regsim informaia, s manipulm nregistrrile i seturile de nregistrri. Ce este un set de nregsitrri? Atunci cnd deschidei o tabel n modul Datasheet View, vedei un set de nregistrri. De aceea, dac v decidei s programai n VBA, vei lucra foarte mult cu obiecte de tip Recordset. Iat un prim exemplu de subrutin ce folosete un astfel de obiect pentru a gsi numrul de nregistrri dintr-o tabel a bazei de date Cursuri Opionale.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.RecordCount Debug.Print Tabela & strTabela & contine & iNrInregistrari & inregistrri
Pag. 158

rst.close End Function Deschidei fereastra Debug i scriei: ?NrInregistr(Student) dup care apsai pe Enter. Figura 8.9 prezint rezultatul obinut.

Pag. 159

Figura 8.9 Atta timp ct un set de nregistrri este deschis (ntre apelul metodei OpenRecordset i al metodei Close), putei face orice dorii cu nregistrrile sale: le putei edita, terge sau putei chiar aduga nregistrri noi. Este important s nchidei un set de nregistrri (apelnd metoda Close) pentru a elibera resursele pe care Access i le-a alocat. 8.7.1. Tipuri de seturi de nregistrri n VBA exist nu mai puin de cinci feluri de obiecte de tip Recordset: Obiecte Recordset de tip tabel; Obiecte Recordset de tip dynaset; Obiecte Recordset de tip snapshot; Obiecte Recordset de tip forward-only; Obiecte Recordset de tip dinamic. n funcie de urmtorii factori, decidei pe care dintre aceste tipuri l vei folosi la un moment dat: Dac dorii s i actualizai nregistrrile, nu numai s le vedei; Dac tabelele se afl ntr-o baz de date Access sau de alt tip; Cte nregsitrri conine setul de nregistrri. n cadrul acestui capitol ne vom ocupa numai de primele trei tipuri de seturi de nregistrare.
Pag. 160

Dup cum ai observat i din exemplul anterior, pentru a crea un set de nregistrri, folosii expresia: Set rst = db.OpenRecordset (Sursa[, tip[, optiuni[, blocaje]]]) Sau Set rst = obiect.OpenRecordset ([tip[, optiuni[, blocaje]]]) Unde: db este un obiect de tip Database; sursa este o tabel, o interogare sau o instruciune SQL ce returneaz nregistrri; obiect un obiect al unei baze de date deschis anterior: tabel, interogare sau un alt set de nregistrri; tip specific tipul setului de nregistrri i poate fi una dintre urmtoarele constante predefinite: dbOpenTable set de nregistrri de tip tabel dbOpenDynaset dynaset dbOpenSnapshot snapshot dbOpenForwarsOnly set de nregistrri de tip forward-only dbOpenDynamic set de nregistrri de tip dinamic; opiuni combinaie de constante ce definesc caracteristicile noului set de nregistrri; blocaje constant ce specific tipul de blocaj aplicat setului de nregistrri (pentru aplicaii multiuser). Not: Access97 v permite s creai un obiect de tip recordset printr-o singur linie de cod, de exemplu:

Set rst = CurrentDb.OpenRecordset(Profesor, dbOpenTable)

ceea ce n Access 95 nu era posibil. Metoda compus din doi pai este totui preferabil, dac vei folosi obiectul de tip Database n cadrul procedurii i pentru alte aciuni. 8.7.1.1. Seturi de nregistrri de tip tabel Acesta este tipul implicit de set de nregistrri pe care Access l creeaz dac nu specificai alt tip ca argument al metodei OpenRecordset i dac sursa de nregistrri este o tabel din baza de date curent. Unul dintre avantajele unui astfel de set de nregistrri este acela c putei folosi indeci pentru a accelera cutrile. 8.7.1.2. Seturi de nregistrri de tip dynaset Un astfel de set de nregistrri poate conine date din mai multe tabele locale sau ataate. Putei edita datele dintr-un dynaset i modificrile vor fi efectuate i n
Pag. 161

tabelele de baz. n cazul unei aplicaii multiuser, Access va actualiza datele dintr-un dynaset deschis pentru a reflecta modificrile efectuate de ali utilizatori asupra tabelelor de baz. Iat cteva situaii n care ar trebui s optai pentru crearea unui dynaset: cnd dorii s putei modifica nregistrrile; cnd obiectul de tip Recordset are dimensiuni foarte mari; cnd obiectul de tip Recordset conine obiecte OLE. Acesta este tipul implicit de set de nregistrri pe care Access l creeaz dac sursa de nregistrri este o interogare, o instruciune SQL SELECT sau o tabel care nu se afl ntr-o baz de date Access. Iat cteva exemple de creare a unui dynaset: Set db = CurrentDb() Set rst = db.OpenRcordset(IntProfCurs, dbOpenDynaset) unde IntProfCurs este o interogare; Set db = CurrentDb() Set rst = db.OpenRecordset(SELECT * FROM Student, dbOpenDynaset) unde sursa de nregistrri este o instruciune SELECT. 8.7.1.3. Seturi de nregistrri de tip snapshot Seturile de nregistrri de tip snashot nu permit modificarea datelor i nici nu reflect modificrile efectuate de ali utilizatori asupra tabelelor de baz. Ele reprezint instantanee ale datelor la un moment dat. Avantajul lor este acela c sunt mai rapide dect cele dynaset, dar numai atunci cnd numrul de nregistrri nu este mai mare de 500. 8.7.2. Actualizarea datelor unui set de nregistrri Pentru a v asigura c datele unui set de nregistrri sunt actualizate, putei executa din nou interogarea care st la baza setului, apelnd metoda Requery (reinterogare) a obiectului. Nu orice obiect de tip Recordset suport ns reinterogarea. De aceea, pentru a afla acest lucru, trebuie ca nainte de a apela metoda Requery s verificai dac proprietatea Restartable a obiectului are valoarea True (altfel, reinterogarea va genera o eroare): If rst.Restartable = True Then rst.Requery

Pag. 162

8.7.3. Parcurgerea seturilor de nregistrri Dup ce ai creat un obiect de tip Recorset, nregistrarea curent va fi prima nregistrare a setului. Dac nu ai specificat nici o regul de sortare a nregistrrilor, acestea se pot afla n orice ordine. Access v pune la dispoziie cinci metode pentru a parcurge nregistrrile unui set de nregistrri: Metoda MoveNext MovePrevious MoveFirst MoveLast Move n[, start] Descriere nregistrarea urmtoare 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 nregistrri distan (nainte sau napoi) de cea curent sau de o anumit poziie (start).

Parametrul n al metodei Move indic numrul de nregistrri care trebuie s fie parcurse pentru a ajunge la cea dorit. Dac n>0, parcurgerea se face nainte, dac n<0, napoi. Parametrul opional start reprezint un semn de carte, adic o anumit poziie de la care ncepe deplasarea cu n nregistrri. Dac acest parametru nu este specificat, se pornete de la nregistrarea curent. (Despre semne de carte vom vorbi mai trziu, n cadrul acestui subcapitol.) 8.7.4. Regsirea numrului de nregistrri ale unui set de nregistrri n exemplul pe care l-am dat la nceputul acestui subcapitol, am folosit proprietatea RecordCount a unui obiect de tip Recordset pentru a-i afla numrul de nregistrri. Dup cum v-ai putut da seama ulterior, setul respectiv era de tip tabel. Pentru acest tip, Access cunoate numrul de nregistrri i d proprietii RecordCount valoarea corespunztoare. Lucrurile nu sunt ns la fel de simple i n cazul altor tipuri de seturi de nregistrri. Pentru a mri performanele aplicaiei dumneavoastr, atunci cnd creeaz un obiect Recordset de tip dynaset sau snapshot, Access trece la executarea liniei de cod urmtoare celei ce apeleaz metoda OpenRecordset imediat dup ce a fost regsit prima nregistrare. De aceea, Access nu cunoate imediat numrul de nregistrri al unui astfel de set. Pentru ca acest numr s fie calculat corect, trebuie s apelai metoda MoveLast, pentru a v asigura c au fost regsite toate nregsitrrile i apoi s folosii proprietatea RecordCount: Set rst = db.OpenRecordset(IntProfCurs, dbOpenDynaset) Rst.MoveLast Debug.Print rst.RecordCount
Pag. 163

Not: n cazul n care vrei s aflai numai dac setul de nregistrri conine mcar o nregistrare, nu trebuie s mai apelai metoda MoveLast, pentru c Access nu trece la urmtoarea linie pn cnd nu a fost returnat prima nregistrare a setului. De aceea, dac proprietatea RecordCount are valoarea zero, e clar c setul nu conine nregistrri. Dac adugai sau tergei nregistrri dintr-un dynaset, proprietatea RecordCount a obiectului respectiv se modific n consecin. n cazul unei aplicaii multiuser, dac ai utilizatori adaug sau terg nregistrri din tabela din care i iau setul datele, aceste modificri nu sunt reflectate imediat, astfel nct va trebui s-l reinterogai i s apelai MoveLast nainte de a folosi proprietatea RecordCount. 8.7.5. Poziia absolut i poziia procentual Pentru a parcurge un set de nregistrri sau pentru a afla poziia nregistrrii curente, putei folosi proprietile AbsolutePosition (poziia absolut) i PercentPosition (poziia procentual) a obiectului de tip Recordset. Proprietatea AbsolutePosition reprezint poziia nregistrrii curente n cadrul setului (fa de zero), iar dac nu exist o nregistrare curent, valoarea ei este 1. Ea este disponibil numai pentru seturi de tip dynaset sau snapshot. Spre exemplu, pentru ca nregistrarea curent s devin cea de-a 4-a nregistrare din set, scriei: rst.AbsolutePosition = 3 Proprietatea PercentPosition indic poziia nregistrrii curente ca procentaj din numrul total de nregistrri ale setului i poate avea valori ntre 0.0 i 100.00. Astfel, pentru a v deplasa pn la jumtatea setului, putei scrie: rst.PercentPosition = 50 Pentru a v asigura c proprietatea PercentPosition returneaz o valoare corect, trebuie s reinterogai setul i apoi s apelai metoda MoveLast, din aceleai motive prezentate anterior pentru proprietatea RecordCount.

8.7.6. Poziiile de nceput i de sfrit ale setului de nregistrri (BOF i EOF) Orice set de nregistrri are dou proprieti (BOF i EOF) care arat dac nregistrarea curent se afl la nceputul setului (BOF) sau la sfritul lui (EOF). Dac prima negistrare este cea curent i apelai metoda MovePrevious, proprietatea BOF ia valoarea True i nregistrarea curent nu mai exist. Dac mai apelai nc o dat metoda MovePrevious, valoarea lui BOF rmne True, dar va fi generat o eroare.
Pag. 164

Dac ultima nregistrare este cea curent i apelai metoda MoveNext, proprietatea EOF ia valoarea True i nu mai exist o nregistrare curent. Dac apelai din nou metoda MoveNext, valoarea lui EOF rmne True, dar va fi generat o eroare.

8.7.7. Regsirea valorilor cmpurilor unui set de nregistrri Pentru a afla valorile diferitelor cmpuri ale unui set de nregistrri, corespunztoare nregistrrii curente, putei folosi una dintre urmtoarele trei variante de sintax: Sintaxa rst!camp rst(camp) rst(indice) Exemplu rst!Nume rst(Nume) rst(1)

Reinei faptul c, ntr-un set de nregistrri, primul cmp are ntotdeauna indicele 0, indiferent de opiunea Option Base pe care ai specificat-o. Astfel, rst(1) se refer la cea de-a doua coloan a setului rst. S presupunem c dorim s afim numele i catedra tuturor profesorilor din tabela Profesor. Pentru aceasta, putem scrie urmtoarea procedur: Public Sub Nume_Student() Dim db As Database Dim rst As Recordset Set db = CurrentDb() Set rst = db.OpenRecordset(Profesor) With rst verificam daca rst contine inregistrari If .RecordCount Then .MoveLast parcurgem setul de la ultima catre prima inregistrare Do Until .BOF Debug.Print ![Nume], ![Catedra] .MovePrevious Loop End If .Close End With End Sub Dac vei rula aceast subrutin, rezultatele din fereastra Debug vor fi asemntoare cu cele din figura 8.10:
Pag. 165

Fig 8.10 De multe ori, vei dori s avei un acces mai rapid la un set de date pe care nu dorii s le modificai, ci numai s le vizualizai. Pentru aceasta, putei crea un set de tip snapshot cu opiunea dbForwardOnly, care este foarte rapid, dar nu permite dect parcurgerea nainte a setului. O modalitate de a v bucura de rapiditatea unui astfel de set de nregistrri i de a putea, n acelai timp, s accesai n orice ordine datele pe care acesta le conine, este s copiai datele ntr-o matrice. Dumneavoastr nu trebuie dect s declarai o variabil de tip Variant i s apelai metoda GetRows() a setului. Access va crea o matrice bidimensional, pe care o va dimensiona corespunztor. Putem deci rescrie procedura Nume_Student astfel nct 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.OpenRecordset(Student, dbOpenSnashot, dbForwardOnly)
Pag. 166

alegem un numar suficient de mare de inregistrari varDate = rst.GetRows(1000) aflam indicele ultimei linii a matricei iNrInreg = Ubound(varDate, 2) tiparim datela coloanei 1-a (Nr_matr) si a 2-a (Nume) For i = iNrInreg To 0 Step 1 Debug.Print varDate(1, i), varDate(2, i) Next i rst.Close End Sub Rezultatele vor fi tot cele din figura 8.10, dar, pentru un set cu multe nregistrri, procedura se va executa mult mai repede. 8.7.8. Cutarea nregistrrilor Atunci cnd dorii s regsii numai o anumit nregistrare (sau un set de nregistrri ce satisfac un anumit criteriu), vei folosi una dintre metodele Seek sau Find ale setului respectiv. Despre acestea vom vorbi n cadrul seciunilor urmtoare. 8.7.8.1. Cutri n seturi de nregistrri de tip tabel Dup ce ai creat un obiect Recordset de tip tabel, cea mai rapid modalitate de a regsi anumite nregistrri este apelarea metodei Seek. (Apelarea acestei metode pentru un set de nregistrri care nu este de tip tabel va genera o eroare). Pentru aceasta, trebuie s efectuai doi pai: 1. Stabilii valoarea proprietii Index a setului, deoarece cutrile cu metoda Seek se fac numai pe indeci. 2. Apelai metoda Seek dndu-i ca argumente un operator de comparaie (<,<=,>= sau >) i una sau mai multe valori care s reprezinte criteriile de cutare (n funcie de numrul coloanelor ce intr n componena idexului). Valorile trebuie s corespund tipurilor de date ale coloanelor indexului. Dup ce ai folosit metoda Seek pentru a cuta o nregistrare, trebuie s verificai dac ai gsit ceva. Pentru aceasta, vei verifica valoarea proprietii NoMatch a setului de instruciuni. Mai reinei faptul c metoda Seek returneaz numai prima nregistrare care satisface criteriul specificat, chiar dac aceasta nu e singura. S presupunem c dorim s aflm nota obinut de un student la o anumit materie. Pentru aceasta, vom crea un set de nregistrri bazat pe tabela Curs_Student i vom apela metoda Seek pentru el. n acest scop, vom folosi drept index cheia primar a tabelei, care e format din coloanele NrMatricol i IdCurs.
Pag. 167

Public Sub SeekStud_Curs(iNrMat As Integer, iIdCurs As Integer) Dim db As Database Dim rst As Recordset Set db = CurrentDb() Set rst = db.OpenRecordset(Curs_Student) stabilim proprietatea Index a setului rst.Index = PrimaryKey cautam inregistrarea pentru. care IdCurs=iIdCurs si NrMatricol=iNrMat Rst.Seek =, iIdCurs, iNrMat If rst.NoMatch = True Then nu a fost gasita o astfel de inregistrare Debug.Print Studentul cu nr. matricol & iNrMat & vbCrLf & _ nu s-a inscris la cursul & iIdCurs Else Debug.Print Nota & rst!Nota End If rst.Close End Sub 8.7.8.2. Cutri n seturi de nregistrri de tip dynaset i snapshot Spre deosebire de seturile de tip tabel, cele dynaset i snapshot nu pot folosi metoda Seek pentru cutri. Att pentru acestea din urm, ct i pentru cutri dup coloane neindexate, Access v pune la dispoziie patru metode de cutare a datelor: Metoda FindFirst FindLast FindNext FindPrevious Descriere ncepnd cu prima nregistrare a setului de nregistrri, caut o nregistrare ce verific un criteriu dat. Dac exist, nregistrarea gsit devine cea curent. ncepnd cu ultima nregistrare a setului de nregistrri, caut o nregistrare ce verific un criteriu dat. Dac exist, nregistrarea gsit devine cea curent. ncepnd cu nregistrarea curent, caut urmtoarea nregistrare ce verific un criteriu dat. Dac exist, nregistrarea gsit devine cea curent. ncepnd cu nregistrarea curent, caut precedenta nregistrare ce verific un criteriu dat. Dac exist, nregistrarea gsit devine cea curent.

Pag. 168

Dac oricare dintre aceste metode nu reuete s gseasc o nregistrare care s verifice criteriul respectiv, setul de nregistrri nu va mai avea o nregistrare curent i orice operaie ulterioar asupra nregistrrii curente va genera o eroare. Sintaxa acestor metode va fi urmtoarea: rst. {FindFirst|FindPrevious|FindNext|FindLast} criteriu unde rst este un obiect de tip dynaset sau snapshot, iar criteriu este un ir de caractere ce conine o expresie de genul celor din clauza WHERE a unei instruciuni SQL: rst..FindFirst NrMatricol = & nMatr & AND Nota >=5 Subrutina FindCursuriPromovate() caut toate cursurile la care un student a obinut o not mai mare sau egal cu 5. Dac nu exist nici o nregistrare care s ntruneasc acest crietriu, vom afia un mesaj. Cu ajutorul variabilei nRez inem minte dac au fost gsite 0, una sau mai multe nregistrri, pentru a afia un mesaj potrivit pentru fiecare situaie. 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.OpenRecordset(Curs_Student, dbOpenSnapshot) rst.FindFirst NrMatricol = & nMatr & AND Nota >=5 Do While rst.NoMatch = False nPromovate = nPromovate + 1 strRez = strRez & vbCrLf & rst!IdCurs rst.FindNext NrMatricol = & nMatr & AND Nota >=5 Loop Select Case nPromovate Case 0 Debug.Print Studentul cu nr. matricol & nMatr & vbCrLf & _ nu a promovat nici un curs Case 1 Debug.Print Studentul cu nr. matricol & nMatr & vbCrLf & _ a promovat cursul: & rst!IdCurs Case Else Debug.Print Studentul cu nr. matricol & nMatr & vbCrLf & _ a promovat cursurile & strRez End Select
Pag. 169

rst.Close End Sub

8.7.8.3. Criterii ce conin iruri de caractere i date Atunci cnd dorii s creai criterii pentru una dintre metodele Find sau atunci cnd creai n VBA iruri de caractere ce conin instruciuni SQL, va trebui de multe ori s introducei 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 conine un nume pe care s-l cutm ntr-un set de nregistrri cu ajutorul metodei FindFirst i, la un moment dat, valoare ei este Popescu. irul de caractere care constituie crietriul de cutare este: [Nume] = Popescu Pentru a introduce caracterul () ntr-un ir de caractere, trebuie s l dublm. innd cont de aceasta, irul de caractere care ne d crietriul de mai sus este: [Nume] = Popescu Separnd irul Popescu, care este aici doar un caz particular, vom scrie: [Nume] = & Popescu & nlocuind acum valoarea Popescu cu variabila strNume, obinem irul de caractere care ne d criteriul dorit: [Nume] = & strNume & Acelai lucru este valabil i pentru date. Astfel, pentru a specifica urmtorul criteriu: [Data Angajarii] = varData unde varData este o variabil de tip Date, vom construi urmtorul ir de caractere: [Data Angajarii = # & varData & #
Pag. 170

Data pe care o conine variabila varData trebuie s fie n formatul mm/dd/yy, altfel, nu vei obine rezultatul dori. V reamintim c pentru a converti o dat la formatul mm/dd/yy, putei folosi funcia Format: Format (varData, mm/dd/yy) Pentru criterii ce conin valori numerice, totul este mult mai simplu, astfel c pentru a avea urmtorul 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 nregistrri, Access v mai pune la dispoziie i proprietatea Bookmark (semn de carte) a unui astfel de obiect. Dup cum ai vzut, fiecare set are o singur nregistrare curent. Un Bookmark este o proprietate a crei valoare identific unic nregistrarea curent a setului la un moment dat. Putei atribui aceast valoare unei variabile de tip String sau Variant pentru a o folosi ulterior la regsirea nregistrrii respective. Mai exact: 1. Regsii valoarea proprietii Bookmark a nregistrrii curente i o stocai ntr-o variabil de tip String sau Variant. 2. Pentru a v ntoarce ulterior la acea nregistrare, dai proprietii Bookmark valoarea stocat anterior. Astfel, putei pstra oricte semne de carte dorii pentru un anumit set de nregistrri. Lucrul cu semne de carte este metoda cea mai simpl de deplasare ntre nregistrrile unui set. n mare, iat cum vei folosi n codul dumneavoastr proprietatea Bookmark a unui set de nregistrri: 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 vei dori, poate, s comparai dou semne de carte pentru a vedea dac nregistrarea curent este aceeai cu cea pentru care ai salvat un semn de carte.
Pag. 171

Pentru aceasta, trebuie s tii c, dei putei stoca un semn de carte ntr-o variant de tip String sau Variant, ea este reprezentat intern ca o matrice de bii. De aceea, atunci cnd comparm dou semne de carte, comparaia trebuie s fie fcut pe bii. Pentru aceasta, putei folosi funcia predefinit StrComp, care returneaz valoarea 0 dac cele dou variabile comparate sunt egale i care primete un al treilea argument (primele dou sunt variabile de comparat), ce specific modul n care se va face comparaia: 0 pentru compraie pe bii, 1 pentru comparaia obinuit (care nu e case-senzitiv, adic nu ine cont de majuscule/minuscule), 2 pentru a folosi tipul de comparaie specificat de opiunea Option Compare de la seciunea (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 coincidi o valoare diferite de zero, altfel. Seturile de nregistrri 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 testai dac el accept aceast proprietate. n acest scop, verificai dac proprietatea Bookmarkable a setului are valoarea True. 8.7.10 Metoda Clone (clonare) Orice set de nregistrri are o singur nregistrare curent. Dac dorii s lucrai cu dou nregistrri curente pe acelai set de date, putei folosi metoda clone pentru a crea o clon a setului. Astfel, vom avea dou obiecte de tip Recordset indicnd spre acelai set de nregistrri. Aceast metod este mult mai rapid dect dac am crea un al doilea set bazat pe aceleai date. Atunci cnd lucrai cu clone, inei cont de urmtoarele dou probleme: 1. Un set de nregistrri creat cu metoda Clone nu are de la nceput o nregistrare curent. Pentru c o nregistrare a sa s devin curent, apelai una dintre metodele Find sau Move sau dai proprietii Bookmark o valoare regsit 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 nregistrri curente ale aceluiai set de date, vom folosi proprietatea RecordsetClone pentru a avea acces la setul de nregistrri al unui formular. Acest lucru este util atunci cnd dorim s manipulm setul de date pe care se bazeaz un formular, fr ca aciunile noastre s fie vizibile pe formular.
Pag. 172

Pentru a ilustra cum se lucreaz cu metoda Clone i cu proprietatea RecordsetClone, vom scrie funcia ComparaInreg() ce verific dac dou nregistrri succesive ale unui set de nregistrri au aceeai valoare pentru un anumit cmp. Funcia primete ca argumente variabila frm de tip Form (ce va identifica formularul) i variabila strCamp de tip String (ce conine numele cmpului respectiv) i returneaz valoarea True dac nregistrarea curent i cea anterioar conin aceeai valoare a cmpului 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 nregistrri clonat (rstClona) va fi ntotdeauna cea precedent nregistrrii curente a setului rst. Iat deci, cum putem lucra cu dou nregistrri curente pentru a compara valorile cmpurilor unui set, fr a avea nevoie de variabile n care s pstrm valorile regsite. Aceast funcie poate fi, de exemplu, apelat din cadrul procedurii de tratare a evenimentului Current a unui formular, pentru a afia un anumit mesaj sau pentru a efectua diferite alte aciuni n funcie de valoarea returnat. 8.7.12 Sortarea i filtrarea unui set de nregistrri Pentru a sorta un set de nregistrri de tip tabel, nu trebuie dect s-i stabilii proprietatea Index. V reamintim c atunci cnd creai un index pe o tabel, putei
Pag. 173

specifica ordinea de sortare cresctoare sau descresctoare pentru indexul respectiv. Setul va fi sortat exact dup ordinea specificat de index. Pentru a crea un set de nregistrri sortat de tip dynaset sau snapshot, putei proceda n dou moduri: 1. S creai setul pe baza unei instruciuni SQL ce conine clauza ORDER BY: Set rst = db.OpenRecordset(SELECT * FROM Profesor ORDER BY Nume;) 2. S stabilii proprietatea Sort pentru dynaset sau snapshot i apoi s creai un nou set pe baza celui sortat. Valoarea proprietii Sort este un ir de caractere coninnd coloana dup care se va face sortarea i, opional, 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 crem un set de nregistrri (rst), l sortm i apoi crem 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 nregistrri,avei de asemenea la dispoziie dou posibiliti: S creai setul pe baza unei instruciuni SQL ce conine clauza WHERE. Aceast metod poate fi folosit numai pentru a crea seturi pe baza unui obiect din baza de date. S stabilii proprietatea Filter a unui dynaset sau snapshot pentru a-i restrnge numrul de nregistrri i apoi s creai un nou set pe baza acestuia. Valoarea proprietii Filter trebuie s fie un ir de caractere asemntor unei expresii din clauza WHERE a unei instruciuni SELECT.
Pag. 174

Iat un exemplu ce creeaz cte un set de nregistrri 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(SELECT FROM Profesor WHERE [Catedra]_ = Matematici;) folosim a doua metoda Set rst = db.OpenRecordset(Profesor, dbOpenDynaset) rst.Filter = [Catedra] = Matematici Set rstFiltrat = rst.OpenRecordset() Atunci cnd folosii proprietatea Sort sau Filter a unui set de nregistrri, inei cont de urmtoarele: Ele nu se aplic seturilor de tip tabel; Sortarea sau filtrarea sunt vizibile numai pentru setul creat pe baza celui sortat sau filtrat; Crearea seturilor pe baza instruciunilor SQL poate fi mai rapid dect folosirea proprietilor Sort i Filter. 8.7.13 Editarea nregistrrilor unui set de nregistrri Pentru a putea modifica datele unui set de nregistrri trebuie, mai nti, s avei dreptul s facei asta. Seturile de tip tabel sau dynaset pot fi modificate numai dac altcineva nu a blocat tabela respectiv (n cazul aplicaiilor multiuser). Seturile snapshot i seturile bazate pe interogri de tip Crosstab sau Union nu permit modificarea datelor. Pentru a v asigua c putei modifica datele unui set de nregistrri, verificai dac proprietatea sa Updatable are valoarea True. Access v pune la dispoziie cinci metode pentru editarea datelor dintr-un set de nregistrri: Metoda Edit AddNew Update CancelUpdate Descriere Copiaz nregistrarea curent dintr-un buffer pentru a permite editarea. Creeaz o nou nregistrare dintr-un buffer. Salveaz modificrile din buffer. Golete bufferul fr a salva modificrile.
Pag. 175

Delete

terge nregistrarea curent.

Pentru a vedea dac n buffer exist vreo nregistrare care nu a fost salvat, putei verifica valoarea proprietii EditMode, care poate fi: Valoarea 0 1 2 Constanta intrinsec dbEditNone dbEditInProgress dbEditAdd Descriere Bufferul e gol Bufferul conine nregistrarea curent (s-a apelat metoda Edit) Bufferul conine o nregistrare nou (s-a apelat metoda AddNew)

8.7.13.1. Modificarea nregistrrii curente Pentru a edita nregistrarea curent a unui set de nregistrri (presupunnd c putei face acest lucru), trebuie s efectuai urmtoarele operaii: 1. Apelai metoda Edit pentru a copia nregistrarea curent n buffer. 2. Efectuai modificrile dorite. 3. Apelai metoda Update pentru a salva modificrile. S presupunem c n tabela Profesor s-a introdus greit numele unui profesor: n loc de Popescu Marian s-a introdus Popescu Marin. Pentru a rectifica din program aceast eroare, creai setul rst bazat pe tabela Profesor i scriei: With rst cautam inregistrarea pe care dorim s-o editam .FindFirst [Nume] = Popescu Marin daca nu o gasim, afisam un mesaj If .NoMatch Then MsgBox Popescu Marin nu se afla in tabela Profesor altfel, o editam Else.Edit ![Nume] = Popescu Marian .Update End If End With 8.7.13.2 Adugarea unei noi nregistrri la un set de nregistrri Pentru a aduga o nou nregistrare la un set (presupunnd c putei face acest lucru), procedai astfel: 1. Apelai metoda AddNew pentru a aduga o nou nregistrare (valorile cmpurilor vor fi cele implicite, dac exist valori implicite).
Pag. 176

2. Introducei valorile cmpurilor. 3. Apelai metoda Update pentru a salva nregistrarea. nregistrarea curent, dup ce ai adugat o nou nregistrare, va fi tot cea dinainte acestei operaii. De aceea, pentru ca nregistrarea s fie curent s fie cea nou, apelai metoda Move cu valoarea proprietii LastModified a setului ca argument. Urmtorul exemplu adaug o nou nregistrare la un set bazat pe tabela Profesor i face ca nregistrarea curent s fie cea nou. With .rst .AddNew ![Nume] = Toma Dorel ![Catedra] = Fizica ![IdTitlu] = 2 .Update .Move 0, .LastModified End With 8.7.13.3 tergerea unei nregistrri a unui set de nregistrri Pentru a terge nregistrarea curent a unui set nu trebuie dect s apelai metoda Delete. Dup ce ai ters o nregistrare, ea continu s fie cea curent. MovePrevious pentru ca nregistrarea precedent s fie cea curent. Pentru a terge nregistrarea corespunztoare profesorului cu numele Popescu Marin dintr-un set bazat pe tabela Profesor, scriei: With .rst .FindFirst [Nume] = Popescu Marin If .NoMatch Then MsgBox Popescu Marin nu se afla in tabela Profesor Else .Delete .MovePrevious End If End With 8.8. Obiecte speciale Exist anumite proprieti ale unor obiecte care reprezint, la rndul lor, alte obiecte. Ai fcut deja cunotin cu proprietile Me i RecordsetClone. Tabelul 8.16 v prezint alte proprieti ce reprezint obiecte. Proprietatea A cui este ActiveControl Ecran (Screen) Ce reprezint Controlul care are focusul.
Pag. 177

ActiveForm ActiveReport Form Me Module Parent

Ecran (Screen) Ecran (Screen) Subformular, formular sau control Formular sau raport Formular sau raport Control

Formularul care are focusul sau care conine controlul cu focus. Raportul care are focusul sau care conine controlul cu focus. Pentru un control de tip Subform, reprezint subformularul gzduit. Pentru un formular, reprezint formularul nsui. nsui formularul sau raportul respectiv. Modulul asociat formularului sau raportului respectiv. Formularul sau raportul ce conine controlul respectiv. Controlul care a avut anterior focusul. Setul de nregistrri pe care se bazeaz formularul. Pentru un control de tip Subreport, reprezint subraportul gzduit. Pentru un raport, reprezint raportul nsui. Seciunea formularului sau raportului n care se afl controlul.

PreviousControl Formular RecordsetClone Subraport, raport sau control Report Section Control Tabelul 8.16

CAP:9. Crearea i lucrul cu rapoartele Rapoartele reprezint o metod prin care datele pot fi prezentate ntr-un mod intuitiv i plcut. Ele pot fi tiprite, vizualizate sau exportate ntr-un alt format. Dei ntre formulare i rapoarte exist multe asemnri, una dintre deosebiri este aceea c rapoartele nu pot fi folosite pentru introducerea datelor. Raportele pot s conin aproape toate elementele unui formular, cu excepia controalelor care presupun aciuni ale utilizatorului, cum ar fi cele de tip Comba box. Putei s convertii formularele n rapoarte i vice-versa fcnd clic dreapta pe numele formularului sau al raportului n
Pag. 178

fereastra Database i alegnd opiunea Save As Report (sau Save As Form) din meniul derulant. Datele unui raport pot proveni dintr-o tabel, o interogare sau o instruciune SQL. 9.1 Crearea unui raport Pentru a crea un nou raport, Access v pune la dispoziie dou programe wizard, Auto Report i Report Wizard. Acestea sunt utile mai ales atunci cnd sursa de date a raportului este simpl sau pentru a crea un raport de pornire pe care s l perfecionai ulterior, manual. 9.1.1. Crearea rapoartelor cu ajutorul programelor Wizard Pentru a crea un formular n mai puin de un minut, nu trebuie dect s apsai butonul New din pagina Reports a ferestrei Database i s alegei din cutia de dialog New Report una dintre opiunile AutoReport (Columnar, pentru ca datele s fie prezentate pe o singur coloan sau Tabular, pentru prezentarea datelor sub form de tabel). n plus, mai trebuie s selectai numele unei tabele sau interogri din caseta combinat a acestei cutii de dialog. Dup ce ai apsat butonul OK, raportul creat va fi afiat pe ecran n modul Print Preview. Pentru a crea ns un raport mai elaborat, vom folosi Report Wizard. S presupunem c dorim s crem un raport care s prezinte, pentru fiecare student, cursurile opionale la care s-a nscris. Vom crea raportul pe baza interogrii Student_Cursuri, din figura 9.1:

Fig. 9.1

Pag. 179

De data aceasta, alegei din cutia de dialog New Report opiunea Report Wizard. n prima cutie de dialog, alegei din caseta combinat Tables/Queries interogarea Student_Cursuri i apsai butonul (>>) pentru a selecta toate cmpurile acestei interogri, prezentate n lista Available Fields.

Fig. 9.2 Cea de-a doua cutie de dialog din wizard v ntreab n funcie de care date s se fac gruparea: de cele din tabela Curs, 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 studenii care s-au nscris la fiecare curs, vom alege ca gruparea s se fac n funcie de tabele Student.

Fig. 9.3 Urmtoarea cutie de dialog v permite s stabilii i alte niveluri de grupare a datelor. Dup cum putei vedea, deja exist dou niveluri: primul conine informaii despre un student: NrMatricol, NumeSt, PrenumeSt, Grupa, iar al doilea, despre cursurile la care acesta s-a nscris: Denumire i Nota. S zicem c am dori
Pag. 180

ca, la rndul lor studenii s fie grupai n funcie de grupa n care se afl. Pentru aceasta, selectai coloana Grupa din lista din stnga cutiei de dialog i apsai butonul (>).

Fig. 9.4 Nu este prea trziu nc s v rzgndii asupra ordinii n care vor fi grupate datele. Pentru aceasta putei folosi butoanele Priority ( i ). Pentru acest exemplu pstrai totui ordinea din figura 9.5 i apsai butonul Next.

Fig. 9.5 Dac la pasul anterior am stabilit dup care coloane se va face gruparea datelor, n aceast cutie de dialog putem stabili ordinea n care vor fi afiate datele de pe ultimul nivel: Denumire i Nota. S zicem c preferm s afim cursurile n
Pag. 181

ordinea alfabetic a denumirii lor. Pentru aceasta, va trebuie s alegei n prima caset combinat coloana Denumire. Dac dorii s schimbai ordinea de sortare, apsai pe butonul din dreapta casetei combinate. Tot n aceast cutie de dialog exist i butonul Summary Options, care deschide o alt cutie de dialog. Aici putei alege ca pentru o coloan de pe ultimul nivel s se afieze i suma, media, minimul sau maximul.

Fig. 9.6 Urmtoarele dou cutii de dialog v prezint cteva variante de aliniere a datelor i, respectiv, cteva stiluri de fonturi folosite pentru afiarea lor (pentru acest exemplu vom alege alinierea n trepte (Stepped) i stilul Compact). n ultima cutie de dialog din wizard introducei numele raportului (Student_Cursuri) i apsai butonul Finish. Raportul se va deschide n modul Print Preview i va arta n genul celui din figura 9.7.

Fig. 9.7

Pag. 182

9.1.2. Crearea manual a rapoartelor Dac v decidei s creai manual un raport, pornind de la zero, alegei n cutia de dialog New Report opiunea Design View. Se va deschide n modul Design View un raport fr nici un control pe el. Dac ai nvat cum s proiectai un formular, crearea manual a unui raport o s vi se par foarte uoar. Vom avea de-a face cu aceleai categorii de seciuni, aceleai tipuri de controale i aceleai ferestre suport: ToolBox (cutia cu instrumente), Field List (lista cmpurilor) i Properties (pagina de proprieti). Singurul element nou l constituie fereastra Sorting and Grouping (sortare i grupare) care v va ajuta s stabilii nivelurile de grupare i ordinea n care vor fi afiate datele. Figura 9.8 prezint formularul Student_Cursuri n modul Design View.

Fig. 9.8 9.2. Sursa de date a raportului Atunci cnd creai un nou raport n Access, avei posibilitatea de a alege sursa de date a acestuia din caseta combinat a cutiei de dialog New Report. Aceast surs de date poate fi tabel sau interogare salvat. Pentru raportul pe care l-am creat anaterior, sursa de date este interogarea Student_Cursuri. Ca i n cazul formularelor, sursa de date este specificat de proprietatea Record Source, dup cum putei vedea i din pagina de proprieti a raportului Student_Cursuri (figura 9.9).

Pag. 183

Fig. 9.9 Putei schimba ulterior sursa de date a unui raport, modificnd valoarea acestei proprieti. Pentru ca informaiile stocate ntr-un cmp al sursei de date s poat fi afiate n raport, trebuie ca grila n QBE proprietatea Show a cmpului respectiv fie activat. Dac interogarea pe care se bazeaz raportul are parametri, pentru a putea vizualiza sau tipri raportul, utilizatorul trebuie s furnizeze valorile parametrilor respectivi. 9.3. Seciunile unui raport n figura 9.10 putei vedea seciunile raportului Student_Curs i, dup cum v-ai dat seama, ele nu sunt cu mult diferite de seciunile unui formular.

Fig. 9.10

Report Header Apare numai pe prima pagin, ca un titlu pentru ntregul raport. Dac dorii s creai o pagina separat numai pentru titlul raportului, alegei ca valoare a proprietii ForceNewPage a acestei seciuni opiunea After Section (dup seciune). Page Header Apare n partea de sus a fiecrei pagini, cu excepia primeia, unde apare dup antetul raportului. Cel mai adesea, conine titlurile cmpurilor afiate.
Pag. 184

Detail Se repet pantru fiecare nregistrare la vizualizarea sau la tiprirea raportului. S-ar putea ca la proiectarea raportului s nu tii exact ct de nalt trebuie s fie seciunea Detail. De exemplu, este foarte posibil ca o nregistrare s nu aib nimic ntr-un cmp de tip memo, n timp ce alt nregistrare s ocupe o jumtate de pagin sau chiar mai mult. Proprietile Can Grow (poate crete) i Can Shrink (se poate micora) ale seciunii Detail determin pentru aceasta o nlime variabil, n funcie de fiecare nregistrare n parte. Page Footer Apare n partea de jos a fiecrei pagini a raportului. Cel mai adesea conine data i ora i, eventual, numrul paginii. Observai, din figura 9.10, c seciunea Page Footer a raportului Student_Cursuri conine dou casete de text, ce au ca surse de date expresiile: Now () i =Page & [Page] & of & [Pages] Prima afieaz data curent, iar cea de-a doua, pagina curent din numrul total de pagini ale raportului. Variabila [Page] are ca valoare numrul paginii curente, iar variabila [Pages], numrul total de pagini. Pentru a tipri aceste informaii n subsolul de pagin al unui raport, alegei opiunile Page Numbers i, respectiv, Date and Time din meniul Insert. Report Footer Apare numai pe ultima i poate conine totaluri ale datelor diverselor seciuni ale raportului. Pentru a afia totalul unui control numeric, adugai la aceast seciune o caset text, a crei proprietate Control Source s aib valoarea:=Sum ([Nume_Control]). Dac dorii ca totalurile s fie afiate pe o pagin separat la sfritul raportului, dai proprietii ForceNewPage a acestei seciuni valoarea Before Section (naintea seciunii). n plus, fa de aceste seciuni pe care le-am ntlnit i la crearea formularelor, un raport poate avea un numr de antete i subsoluri de grup, care s afieze titlurile cmpurilor ce definesc grupul respectiv i totaluri n cadrul grupului.

9.4. Proprietile unui raport Pentru a deschide pagina de proprieti a unui raport, procedai exact ca n cazul formularelor: facei clic pe careul negru din colul din stnga-sus al raportului n modul Design View i alegei comanda Properties din meniul View. n continuare, v prezentm cteva dintre proprietile cu care vei lucra cel mai des pentru a determina comportamentul raportului.

Record Source Sursa de date a raportului poate fi o tabel, o


interogare sau o instruciune SQL.

Pag. 185

limiteaz numrul de nregistrri din tabela de baz ce vor fi afiate n raport. Filter On: - Dac are valoarea Yes, filtrul definit de proprietatea Filter se va aplica. Order By: - Un cmp sau o list de cmpuri separate prin virgule, din sursa de date a raportului n funcie de care va fi stabilit ordinea n care vor fi afiate datele. Order By On: - Dac are valoarea Yes, se va face sortarea stabilit de proprietatea Order By. Caption: - Numele care apare n bara de titlu a formularului n modul Print Preview. Record Locks: - Dac are valoarea All Records (toate nregistrrile), ali utilizatori nu vor putea modifica datele din tabelele de baz ale raportului atta timp ct acesta nu este vizualizat sau tiprit (pentru aplicai multiuser). Page Header i Page Footer: - Stabilete dac antetul i/sau subsolul de pagin va fi tiprit i pe paginile n care apare antetul i/sau subsolul raportului. Picture: - Dac dorii ca pe fundalul raportului s apar o imagine, aici putei introduce numele i calea unui fiier cu extensia .bmp, .dib, .wmf sau .emf. Picture Type: - Determin dac imaginea specificat de proprietatea Picture va fi salvat n baza de date sau va fi pstrat ntr-un fiier separat. Picture Size Mode: - Determin n ce mod imaginea specificat de proprietatea Picture va fi micorat n cazul n care nu ncape n pagin. Picture Alignment: - Arat dac imaginea specificat de proprietatea picture va fi centrat sau aliniat la stnga sau dreapta paginii. Picture Tiling: - Dac imaginea specificat de proprietatea Picture este mai mic dect pagina, ea se va repeta pe toat pagina. Picture Pages: - Determin dac imaginea specificat de proprietatea Picture va fi tiprit pe toate paginile, numai pe prima, sau pe nici una. Layout for Print: - Dac are valoarea Yes, la proiectarea raportului nu vei putea folosi dect fonturile native ale imprimantei i pe cele True Type. Cea mai bun cale de a descoperi cum lucreaz proprietile unui raport este totui s le testai cu diferite valori pe care le pot lua. 9.5. Sortarea i gruparea datelor

Filter: - Numele unei interogri (sau al unei instruciuni SQL) care

Pag. 186

Dac vei alege comanda Sorting and Grouping din meniul View, n timp ce raportul Student_Cursuri este deschis n modul Design View, se va deschide cutia de dialog prezentat n figura 9.11.

Fig. 9.11 Posibilitatea de grupa i de a sorta nregistrrile este ceea ce deosebete rapoartele de formulare. Cutia de dialog din figura 9.11. v permite s stabilii ordinea de sortare a nregistrrilor. Cheia de sortare cea mai semnificativ se afl pe prima poziie din lista Field/Expression (Grupa, n acest exemplu). Urmeaz apoi coloanele NrMatricol i, respectiv, Denumire. Cu alte cuvinte, pentru fiecare grup, se vor afia toi studenii, n ordinea cresctoare a numerelor lor matricole i, pentru fiecare student, se vor afia cursurile la care acesta s-a nscris, n ordinea alfabetic a denumirilor lor. Dac vei dori s inversai ordinea de sortare pentru un anumit cmp din aceast list, alegei n cmpul corespunztor din coloana Sort Order cealalt opiune (Descending (descendent) dac iniial ordinea era Ascending (ascendent) i invers). Pentru fiecare cmp din list putei stabili cinci proprieti: Group Header: Dac are valoarea Yes, Access va crea pentru acest cmp o seciune antet, n care putei include ce controale dorii. De exemplu, pentru coloana Grupa, acest antet conine o caset de text care are ca surs de date chiar aceast coloan. Group Footer: Dac are valoarea Yes, Access va crea pentru acest cmp o seciune subsol, unde ai putea include controale care s afieze diferite totaluri pentru grupul respectiv. Deocamdat, nici unul dintre grupurile definite nu are subsol, dar n cadrul acestui capitol, vom aduga unul. Group On: Dac valoarea sa este Each Value, Access va considera ca fcnd parte din acelai grup doar nregistrrile pentru care valorile

Pag. 187

cmpului respectiv sunt egale. Cu alte cuvinte, pentru fiecare valoare a cmpului, Access va crea un grup separat care, eventual, va avea un antet i/sau un subsol. Dac valoarea sa este Interval (pentru cmpuri numerice), grupurile se vor extinde la toate nregistrrile pentru care valoarea cmpului respectiv se afl ntr-un interval specificat. Pentru cmpuri de tip text, avem opiunea Prefix Characters care va considera ca fcnd parte din acelai grup toate nregistrrile pentru care valoarea cmpului respectiv ncepe cu aceleai n caractere, unde n este valoarea proprietii Group Interval. De asemenea, pentru coloane de tip sate/time, aceast proprietate mai poate avea valorile Year, Quarter, Month etc., nregistrrile putnd fi astfel grupate pe ani, trimestre, luni etc. Group Interval: Dac valoarea proprietii Group On este alta dect Each Value, proprietatea Group Interval definete intervalul n care se poate afla valoarea cmpului respectiv pentru a face parte dintr-un grup. Keep Together: Dac are valoarea No, Access va trece la o pagin nou numai atunci cnd pagina curent este plin. Dac are valoarea Whole Group (ntregul grup), Access va face tot posibilul ca antetul, subsolul i seciunea Detail a grupului s se afle pe aceeai pagin. Dac ele nu ncap n pagina curent, se va trece la o pagin nou. Dac are valoarea With First Detail (numai primul detaliu), Access va trece la o pagin nou dac antetul i cel puin prima nregistrare de la seciunea Detail a grupului nu ncap pe pagina curent. 9.6. Folosirea funciilor agregat n cadrul rapoartelor Raportul Student_Cursuri ar furniza mai mult informaie dac ar afia, pentru fiecare student, media cursurilor opionale la care s-a nscris. Am mai spus c cel mai bun loc pentru a afia totaluri este subsolul unei seciuni sau al unui grup. Pentru exemplul nostru, media ar trebuie s fie afiat n subsolul grupului determinat de coloana NrMatricol dar, dup cum putei vedea i n figura 9.10, acest grup nu are subsol. Pentru a aduga un subsol pentru grupul NrMatricol, deschidei fereastra Sorting and Grouping i dai proprietii Group Footer a acestui grup valoarea Yes. Access va crea subsolul NrMatricol Footer i l va plasa ntre seciunea Detail i seciunea Page Footer. Acum nu mai trebuie dect s plasai n acest subsol o caset de text i s dai proprietii RecordSource ca valore expresia: =Avg ([Nota]) Eventual, dai proprietii Caption a etichetei asociate valoarea Media: iar proprietii Name a casetei, valoarea txtMedia. Acum formularul deschis n modul Design View va arta ca n figura 9.12:

Pag. 188

Fig. 9.12 Cel mai important lucru, atunci cnd folosim funcii agregat n rapoarte, este acela c Access restrnge numrul de nregistrri pentru care se face agregarea numai la grupul curent. Astfel, dac includei o funcie agregat n cadrul antetului sau subsolului unui grup, vor fi luate n considerare numai nregistrrile care fac parte din acel grup. Dac o includei la seciunea Page Header sau Page Footer, funcia va lua n considerare numai nregistrrile din pagina respectiv, iar dac o includei la seciunea Report Header sau Report Footer, funcia va calcula totalul pentru toate nregistrrile raportului. Astfel, putei crea attea sub-totaluri cte grupuri are raportul. Alte funcii agregat pe care le vei folosi frecvent sunt: Sum([cmp_numeric]) (pentru calcularea sumelor), Count([cmp_numeric]) (pentru a numra nregistrrile), Min([cmp_numeric]) (pentru a afla minimul) i Max([cmp_numeric]) (pentru a afla maximul). Putei, de asemenea, s creai expresii n care s folosii funcii agregat i s le afiai drept totaluri: =Sum([Nota]) / Count([Denumire]) 9.7. Editarea rapoartelor Am creat mai devreme raportul Student_Cursuri folosind Report Wizard i, apoi, i-am adugat o caset de text a crei surs de date este o funcie agregat. Dei raportul ne ofer multe informaii utile, aspectul su ar mai putea fi mbuntit:
Pag. 189

titlurile coloanelor ar putea fi schimbate (Access a folosit numele cmpurilor, care nu sunt ntotdeauna intuitive i prezentabile); formatul n care sunt afiate mediile ar trebui modificat astfel nct s aib numai dou zecimale; am putea evidenia anumite texte i, eventual, am putea introduce numere de ordine. Bineneles c toate aceste modificri nu vor putea fi fcute dect n modul Design View. Pentru a schimba titlurile coloanelor, selectai etichetele corespunztoare de la seciunea Page Header i, n pagina lor de proprieti, modificai proprietatea Caption: n loc de NumeSt i PrenumeSt, introducei, de exemplu, doar Nume i Prenume, iar n loc de Denumire, introducei Cursuri. Chiar i titlul raportului ar putea fi mbuntit, din Student_Cursuri n Studenti si Cursuri. Probleme de aspect ar mai putea ridica i alinierea textului n controale. Dac proprietatea Text Align (alinierea textului) a unei etichete are valoarea General, textul va fi aliniat la stnga controlului, iar dac aceeai proprietate a unei casete de text are aceast valoare, textele vor fi aliniate la stnga iar valorile numerice sau de tip date/time vor fi aliniate la dreapta. Pentru a schimba aceste valori, alegei explicit una dintre celelalte valori ale proprietii Text Align: Left (la stnga), Center (centrat) i Right (la dreapta). Pentru ca mediile s fie afiate cu exact dou zecimale, selectai cutia de text txtMedia adugat la seciunea anterioar i dai proprietii Format valoarea Fixed iar proprietii Decimal Places, valoarea 2. De asemenea, media fiind o informaie important, ar fi bine s o evideniem ntr-un fel. Pentru aceasta, dai proprietii Font Weight a casetei de text valoarea Bold i, astfel, mediile vor fi scrise ngroat. Un alt element des ntlnit n rapoarte l reprezint numerele de ordine. S presupunem c n dreptul fiecrui student dorim s apar al ctelea este n cadrul raportului. Pentru aceasta, adugai la seciunea NrMatricol Header o nou caset de text (tergei eticheta asociat, deoarece nu ne trebuie), a crei proprietate Control Source s fie =1. Pentru ca numrul de ordine s fie incrementat cu unu la fiecare student, dai proprietii Running Sum a acestei casete de text valoarea Over All. Dac am fi dorit ca numerotarea s renceap pentru fiecare grup, valoarea proprietii Running Sum ar fi trebuit s fie Over Group. Dac observai c pentru anumite valori ale nregistrrilor textul care trebuie s apar ntr-un control nu se vede n ntregime deoarece controlul nu este suficient de mare, dai proprietii Can Grow a controlului respectiv valoarea Yes. Astfel, controlul va fi redimensionat automat, ca s poat afia textul n ntregime. Acesta poate fi i cazul casetei de text care afieaz denumirile cursurilor.

Pag. 190

CAP:10. FOLOSIREA DATELOR EXTERNE Rolul principal al unei baze de date este stocarea informaiilor. Pn acum, ai nvat cum sunt stocate datele n Access i cum s le manipulai dup ce acestea se gsesc n baze de date. Mai trebuie s aflai cum putei transfera date n i din Access i cum s folosii date din alte baze de date. n acest capitol, se va prezenta: S importai date n Access S exportai date din Access S expediai date prin pota electronic S folosii date din baze de date externe 10.1 Copierea n sau din alte aplicaii Desigur, exist mii de aplicaii care stocheaz informaii i ar fi util s putei schimba date cu acestea. Deoarece fiecare aplicaie stocheaz datele ntr-un format propriu, pentru a face schimb de date ar trebui s cunoatei formatul respectiv. Din fericire, nu trebui s cunoatei detalii despre toate aplicaiile, ci doar despre cele mai importante. Dac vrei s schimbai date cu un program care nu apare n list, putei alege un format standard, care s poat fi citit att de programul respectiv, ct i de aplicaia dumneavoastr. Access poate schimba date cu patru tipuri de aplicaii: Fiiere de tip text Mesaje potale Baze de date Foi de calcul tabelar De obicei, vei lucra cu baze de date sau foi de calcul mai vechi, ori cu sisteme private motenite, pe care dorii s le nlocuii cu Access. n oricare dintre cazuri, v vei da seama c facilitile de import i export sunt extrem de simple i flexibile. 10.1.1 Baze de date Bazele de date difer de la sisteme desktop mici, din care face parte Access, la baze de date stocate pe servere de dimensiuni medii i pn la baze de date stocate pe calculatoare mainframe de dimensiuni foarte mari. n Access, pentru transferul datelor ntre baze de date se folosete metoda TranferDatabase a obiectului DoCmd. DoCmd.TransferDatabase [TransferType], DatabaseType, DatabaseName_ [, ObjectTye], Source, Destination [, StructureOnly][, SaveLoginID]
Pag. 191

Parantezele ptrate indic un argument opional. S analizm n detaliu argumentele acestei metode: Argument TransferType Descriere Aciunea pe care dorii s o executai, care poate fi una dintre urmtoarele: acImport pentru a importa date acExport pentru a exporta date acLink pentru a lega date Dac lsai acest argument necompletat, se folosete valoarea implicit acImport. Tipul bazei de date n care sau din care dorii s efectuai transferul. Poate fi una din urmtoarele: Microsoft Access FoxPro 3.0 Paradox 3.x FoxPro DBC Paradox 4.x dBase III Paradox 5.x dBase IV FoxPro 2.0 dBase 5.0 FoxPro 2.5 Jet 2.x FoxPro 2.6 ODBC Numele complet al bazei de date respective, inclusiv calea. Tipul de obiect implicat n operaie, care poate fi unul din urmtoarele: acTable acQuery acForm acReport acMacro acModule Dac argumentul nu este completat, se folosete valoarea implicit acTable. Numele obiectului din care provin datele. Numele obiectului n care sunt transferate datele. Trebuie s fie True dac obiectul este un tabel i se transfer doar structura. Dac este False, vor fi copiate i datele. Valoarea implicit este False. Se folosete numai pentru surse de date ODBC. Dac este True, numele de conectare (login) i parola vor fi memorate pentru conexiunile urmtoare. Dac este False, va trebui s parcurgei procesul de conectare de fiecare dat cnd accesai sursa de date. Valoarea implicit este False.

DatabaseType

DatabaseName ObjectType

Source Destination StructureOnly SaveLoginID

Exerciiu:- Comanda TransferDatabase


Pag. 192

La fel ca majoritatea magazinelor, Whisky Shop trebui s tipreasc o brour de prezentare a ofertei, iar editurile cer ca lista de buturi s fie transmis n format de baz de date. n continuare, vom crea aceast baz de date. 1. nchidei orice baz de date pe care ai deschis-o anterior i alegei New Database (o nou baz de date) din meniul File. 2. n pagina etichetei General, selectai opiunea Blank Database (Baz de date goal) i executai clic pe OK. Denumii noua baz de date Brochure (Brour) i salvai-o n directorul BegVBA (sau n directorul care conine bazele de date de exemplificare). 3. Acum nchidei aceast baz de date i deschidei fiierul Student.mdb. Deoarece n viitor vom executa operaiunea de export la intervale regulate, vom crea acum un formular i l vom configura ca pe o component permanent. 4. Deschidei formularul Outside World, frmOutsideWorld, n modul de afiare Form. Vei vedea c exist deja un grup de opiuni, fiind creat prima intrare. 5. Trebuie s activm butonul Export astfel nct, dac se execut clic asupra lui atunci cnd opiunea de deasupra este selectat, lista de buturi s fie exportat automat n baza de date Brochure.mdb. Pentru aceasta, adugm comanda TransferDatabase n procedura de tratare a evenimentului clic. Trecei n modul de afiare Design i alegei evenimentul On Click din foaia de proprieti. Adugai comanda TransferDatabase n forma urmtoare: Private Sub cmdExport_Click() Select Case fraExportType Case 1 DoCmd.TransferDatabase acExport, "Microsoft Access", _ "C:\BegVBA\Brochure.MDB", acTable, "Curs", "Lista Cursuri" End Select End Sub Am folosit o instruciune Select Case care ne permite s adugm ulterior n formular i alte butoane de opiune. 6. nchidei fereastra modulului i trecei n modul de afiare Form. Selectai opiunea Export to Brochure Database i executai clic pe butonul Export din formular. Aceast aciune va lansa n execuie noua procedur, determinnd exportul listei de buturi din tabelul Curs n noua baz de date, ntr-un tabel numit Lista Cursuri. Dac efectum exportul ntr-o baz de date existent, iar tabelul este deja inclus, acesta va fi nlocuit.
Pag. 193

nchidei fiierul Student.mdb, salvnd modificrile efectuate n formular, i deschidei Brochure.mdb, care conine acum noul tabel. Deschidei tabelul pentru a vedea datele. 8. Tabelul poate fi vizualizat i editat, iar dumneavoastr avei posibilitatea s modificai cmpul CursID.
7. 9.

Trecei formularul n modul de afiare Design i executai clic pe butonul Export. nainte de a deschide fiierul Brochure.mdb, anticipai ceea ce vei vedea pe ecran.

Dei comanda TransferDatabase este foarte flexibil, nu vei lucra prea mult cu ea. De obicei, este folosit pentru a converti baze de date din sisteme mai vechi n Access 97 sau pentru a face copii de siguran, complete sau pariale, ale unei baze de date. De exemplu, putei folosi aceast comand pentru a implementa o procedur automat de salvare de siguran (backup). n acest scop, creai un tabel care s cuprind elementele care trebuie salvate i momentul declarii acestei operaii, astfel nct aplicaia s poat verifica periodic acest tabel i s execute o comand TransferDatabase pentru obiectele i n momentele specificate. 10.1.2 Foi de calcul tabelar Transferul datelor n foi de calcul este una dintre cele mai apreciate faciliti de transfer. Access 97 este ideal pentru interogarea datelor i realizarea de rapoarte, ns atunci cnd dorii s analizai date numerice, cel mai bine este s folosii o foaie de calcul tabelar. Putei analiza numere i n Access, ns nu are nici un rost, din moment ce exist instrumentul numit Microsoft Excel, care este foarte puternic, iar transferul datelor se realizeaz foarte uor. Pentru a transfera date n sau dintr-o foaie de calcul tabelar, folosii metoda TransferSpreadsheet a obiectului DoCmd: DoCmd.TransferSpreadsheet [TransferType] [, SpreadsheetType], _ TableName, FileName [, HasFieldName] [, Range] Argumentele sunt similare cu cele ale comenzii TransferDatabase, pe care am analizat-o n seciunea precedent.

Argument TransferType

Descriere Aciunea pe care dorii s o executai, care poate fi una dintre urmtoarele: acImport pentru a importa date
Pag. 194

SpreadsheetType

TableName FileName HasFieldName

Range

acExport pentru a exporta date acLink pentru a lega date Dac lsai acest argument necompletat, se folosete valoarea implicit acImport. Un numr reprezentnd tipul de foaie de calcul n sau din care efectuai transferul. Constantele pe care le putei folosi sunt urmtoarele: acSpreadsheetTypeExcel13 acSpreadsheetTypeExcel14 acSpreadsheetTypeExcel15 acSpreadsheetTypeExcel17 acSpreadsheetTypeExcel97 acSpreadsheetTypeExcelLotusWK1 acSpreadsheetTypeExcelLotusWK3 acSpreadsheetTypeExcelLotusWK4 acSpreadsheetTypeExcelLotusWJ2 (doar versiunea japonez) Numele tabelului sau interogrii implicate n transfer. Numele fiierului care conine foaia de calcul, inclusiv calea. Dac dorii s folosii primul rnd al tabelului surs sau al foii de calcul pentru numele cmpurilor din tabelul sau foaia de calcul destinaie, argumentul trebuie s aib valoarea True; dac dorii s tratai primul rnd ca pe nite date obinuite, valoarea trebuie s fie False. n mod implicit, se folosete valoarea False. Se aplic numai la operaiile de import. Trebuie s conin domeniul de celule sau numele domeniului care va fi importat. Dac este lsat necompletat, va fi importat ntreaga foaie de calcul.

Importul datelor din foile de calcul se realizeaz la fel de simplu. Muli utilizatori ncearc s evite bazele de date, avnd impresia c sunt prea complexe. Totui, la un moment dat, datele devin prea complicate pentru a fi stocate ntr-o foaie de calcul tabelar i va trebui s le importai ntr-o baz de date, mprindu-le n tabele. n acest caz, folosii metoda TransferSpreadsheet aproape n acelai format ca mai sus. n capitolele urmtoare, vei ntlni i alte exemple de transfer al datelor n Excel.

Pag. 195

10.1.3 Fiiere de text Exist dou modaliti de a importa i exporta date de tip text. Prima folosete fiiere de text cu caractere delimitatoare, n care un anumit caracter determin unde se termin un cmp i ncepe altul. A doua metod folosete fiiere de text cu lime fix, care necesit ca toate cmpurile i nregistrrile s aib poziii prestabilite n cadrul fiierului - fiecare nregistrare (i cmp pe care l conine) are acelai numr de caractere ca toate celelalte nregistrri. Ambele tehnici de lucru folosesc metoda TransferText a obiectului DoCmd:

DoCmd.TransferText [TransferType] [, SpecificationName], _ TableName, FileName [, HasFieldNames] [, HTMLTableName] Argumentele sunt similare cu cele ale metodelor prezentate anterior:

Argument TransferType

Descriere Aciunea pe care dorii s o executai, care poate fi una dintre urmtoarele: acExportDelim acExportFixed acExportHTML acExportMerge acImportDelim acImportFixed acImportHTML acLinkDelim acLinkFixed
Pag. 196

SpecificationName

TableName FileName HasFieldName HTMLTableName

acLinkHTML Dac lsai acest argument necompletat, se folosete valoarea implicit acImportDelim. Numele specificaiei de import/export. Este obligatorie pentru fiierele cu lime fix, dar nu i pentru fiierele cu caractere delimitatoare. (Deoarece cnd lucrai cu fiiere de text rebuie s furnizai multe valori de configurare, acestea sunt stocate de obicei pe disc ca o specificaie, iar numele acestui grup de informaii este folosit apoi ca argument pentru metoda TransferText. Altfel, va trebui s transmitei de fiecare dat valori pentru o mulime de argumente. Vom mai vorbi despre specificaii n cele ce urmeaz). Numele tabelului pe care dorii s l importai, exportai sau legai, ori numele interogrii ale crei rezultate dorii s le exportai. Numele fiierului de text, inclusiv calea. Este True dac primul rnd al fiierului de text conine numele de cmpuri i False n caz contrar. Dac argumentul este lsat necompletat, se folosete valoarea implicit False. Numele tabelului (sau listei) din documentul HTML pe care dorii s le importai sau s l exportai. Aceast opiune este ignorat, mai puin n cazul n care ai specificat un transfer HTML (acExportHTML sau acImportHTML). Dac lsai argumentul necompletat, este folosit primul tabel (sau prima list). Vom detalia acest argument n seciunea despre Internet.

10.1.4 Fiiere de text cu caractere delimitatoare Fiierele de text cu caractere delimitatoare folosesc un caracter special pentru a separa cmpurile nregistrrilor. n majoritatea cazurilor, acest caracter este o virgul, deci fiierul de text va conine linii de cod de genul: camp 1, camp 2, camp 3, camp 4 ncercai singur - Comanda TransferText Magazinul Whisky Shop a fost inclus recent n ancheta unei reviste care ncearc s determine tendinele n cumprarea de whisky. Ziaritii s-au artat interesai mai ales de tipurile de whisky vndute i de perioada calendaristic. Pentru a-i ajuta, le transmitem o list n format text cu caractere delimitatoare. Adugai un nou buton de opiune n formularul Outside World. Acesta va avea valoarea 3. Etichetai acest buton ca n figura alturat: Adugai urmtoarea secevn de cod la instruciunea Select Case din procedura care trateaz acionarea butonului Export.
Pag. 197

Case 3 DoCmd.TransferText acExportDelim, , "qryMonthlyWhiskyCount", _ "C:\BegVBA\Survey.txt", True

1. Trecei formularul n modul de afiare Form, selectai al treilea buton de opiune i executai clic pe Export. Deschidei n programul Notepad fiierul C:\BegVBA\Survey.txt. Ar trebui s arate ca n figura alturat. Observai c specificaia implicit cuprinde o virgul ca separator de cmpuri i ghilimele pentru text. Acest tip de fiier este numit Comma Separated Value (sau CSV) (adic fiier cu valori separate prin virgule) i reprezint cea mai sigur form de transfer, fiind folosit i recunoscut pe scar larg. Utilizarea ghilimelelor n jurul textului este important, pentru c astfel, o virgul dintr-un ir de text nu mai poate fi confundat cu un separator de cmpuri. Oricum, trebuie s fii foarte atent la ghilimelele care apar n cadrul textului. De exemplu, apostroful este un caracter valabil ntr-un ir, iar dac un cmp conine un apostrof, nu dorii ca acesta s marcheze sfritul cmpului. Este bine s verificai coninutul datelor nainte s aplicai aceast metod, pentru c utilizarea necorespunztoare a virgulelor i ghilimelelor poate avea rezulate imprevizibile. 10.1.5 Fiiere de text cu lime fix Cealalt metod pentru transferul datelor prin fiiere de text evit orice posibil confuzie creat de ghilimele, separatoare de cmpuri i nume de cmpuri. Este necesar utilizarea unei specificaii care s detalieze numele de cmpuri, locul unde ncepe fiecare cmp i dimensiunea acestora. Cea mai simpl metod de a crea specificaii este oferit de aplicaia Wizard Text Export. 10.2 Compunerea mesajelor potale innd cont de cantitile mari de informaii care sunt nregistrate n bazele de date, este foarte important s putei compune (combina) datele n cadrul unor documente obinute n editoare de text. De exemplu, aceast tehnic ar permite expedierea unor mesaje potale ctre toi clienii magazinului Whisky Shop, pentru a-i anuna despre oferte speciale sau promoinale, dar i despre operaii curente i facturi. ncercai singur - Crearea unui fiier de compunere a mesajelor potale Putei folosi facilitile de export din Access 97 pentru a crea un fiier de compunere a mesajelor potale n programul Microsoft Word. Adugai n formularul Outside World un alt buton de opiune, de data aceasta cu valoarea 4, i etichetai-l ca n figura alturat: 1. Completai instruciunea Select Case cu urmtoarea secven de cod:
Pag. 198

Case 4 DoCmd.TransferText acExportMerge, , "qryCompanyAddress", _ "C:\BegVBA\Customers.DOC" Acum trecei formularul n modul de afiare Form, selectai opiunea de compunere a mesajelor potale (Mail Merge) i executai clic pe butonul Export. Va fi creat un fiier Microsoft Word cu numele Customers.doc, care poate fi folosit ca surs de date pentru compunerea mesajelor potale. Sgeile care apar n figura anterioar indic faptul c ntr-un fiier Word de compunere a mesajelor potale sunt folosite caractere Tab pentru a separa cmpurile nregistrrilor. irurile de text sunt ncadrate de ghilimele. n capitolele urmtoare, vei ntlni i alte exemple referitoare la transferul datelor din Access n Word.
2.

10.3 Exportul altor obiecte Pn acum, ai aflat cum s exportai date din tabele sau rezultate n urma unor interogri, ns vor aprea i situaii n care va trebui s exportai date din alte obiecte Access. n aceste cazuri, putei folosi metoda OutputTo a obiectului DoCmd: DoCmd.OutputTo ObjectType [, ObjectName] [ OutputFormat] _ [, OutputFile] [, AutoStart] [, TemplateFile] Argumentele sunt prezentate n tabelul urmtor: Argument ObjectType Descriere Obiectul pe care dorii s l exportai. Poate fi: acOutputForm acOutputModule acOutputQuery acOutputReport acOutputTable Numele obiectului Access. Formatul n care va fi exportat obiectul. Trebuie s fie una dintre urmtoarele constante:
Pag. 199

ObjectName OutputFormat

OutputFile AutoStart TemplateFile

acFormatActiveXServer pentru Microsoft Active Server Pages. acFormatHTML pentru un document HTML. acFormatIIS pentru Microsoft Internet Information Server. acFormatRTF Rich Text Format. acFormatTXT pentru format text Notepad. acFormatXLS pentru format Microsoft Excel. Numele fiierului (inclusiv calea) n care trebuie transferat obiectul. Folosii valoarea True pentru a porni automat aplicaia asociat cu tipul de format extern i False n celelalte cazuri. Dac argumentul nu este indicat, se folosete valoarea implicit False. Numele ablonului pentru fiiere HTML, HTX sau ASP. Vom discuta despre acestea n Capitolul 17, Internet. ncercai singur - Comanda OutputTo

Din pagina etichetei Report, deschidei raportul rptWhiskyTotal. Observai c acest raport conine i text formatat. Vom transfera raportul ntr-un fiier de tip RTF (Rich Text Format). 2. Deschidei formualrul Outside World i adugai al cincilea buton de opiune. Acesta va avea valoarea 5: 3. Adugai codul urmtor la instruciunea Select Case:
1.

Case 5 DoCmd.OutputTo acReport, , "rptWhiskyTotal", _ acFormatRTF, "C:\BegVBA\WhiskyTotal.RTF", True


4.

Dup ce deschidei formularul frmOutsideWorld, alegei aceast opiune i executai clic pe butonul Export; programul World este lansat automat i afieaz acest document.

Not: Observai c numele de fiier conine sufixul RTF, astfel ca Windows 95 sau Windows NT s poat identifica tipul de fiier. RTF provine de la Rich Text Format (text cu format mbuntit), care permite includerea formatului n documentul de text i este standardul Microsoft pentru formatarea documentelor. Utilizarea acestui standard asigur lansarea n execuie a programului Word. n mod similar, dac folosii constanta acFormatXLS, ar trebui s adugai extensia XLS la sfritul numelui de fiier. Chiar dac Access 97 cunoate tipul de fiier pe care l creai, nu adaug sufixul n locul dumneavoastr. Fiind vorba de un fiier RTF, s-au pstrat toate elementele de formatare. Totui, observai c linia de deasupra totalului pe regiune nu a fost transferat. inei cont de acest comportament dac folosii n rapoarte elemente grafice, pentru c
Pag. 200

acestea nu sunt salvate ntr-un fiier RTF. Este o opiune util atunci cnd dorii s distribuii rapoarte simple, fr s le tiprii la imprimant. 10. 4 Pota electronic O alt modalitate de distribuire a datelor este prin pota electronic. Marele avantaj al utilizrii sistemului de pot electronic (e-mail) este uurina cu care putei transmite date, nu numai n reele locale, ci n ntreaga lume. Rspndirea reelelor globale (MicrosoftNetwork, CompuServe, America On Line, Internet etc.) a redus timpul necesar utilizatorilor pentru a obine informaiile de care au nevoie - nu mai suntei nevoii s tiprii un raport la imprimant, s facei cinci copii xerox pe care s le expediai la filialele companiei. Acum, alegei numele destinatarilor din agenda electronic i transmitei raportul respectiv ntr-un minut. Putei transmitei mesaje de pot electronic printr-o diversitate de programe client, cum ar fi Microsoft Exchange i Outlook, Eudora, Pegasus etc. n exemplele din carte am folosit Microsoft Outlook, ns i alte programe client lucreaz la fel de bine. Marele avantaj al programului Microsoft Outlook este faptul c poate fi utilizat ca un client unic de pot electronic pentru diferite tipuri de reele i, din moment ce Outlook se ocup de toate problememle de adresare, nu trebuie s tii ce tip de reea folosii. Dumneavostr nu facei dect s specificai adresele, iar Outlook se ocup de distribuirea mesajelor. Pentru a transfera date prin pota electronic, se folosete metoda SendObject a obiectului DoCmd:
DoCmd.SendObject [ObjectType [, ObjectName] [, OutputFormat] [, To] _ [, CC] [, BCC] [, Subject] [, MessageText] [, EditMessage], _ [TemplateFile]

Dei exist mai multe argumente dect n exemplele anterioare, acestea sunt toate foarte simple: Argument ObjectType Descriere Obiectul pe care dorii s l transferai. Poate fi: acSendForm acSendModule acSendNoObject (doar pentru expedierea unui mesaj potal) acSendQuery acSendReport acSendTable Dac lsai acest argument necompletat, se folosete n mod implicit acSendNoObject. Numele obiectului Access. Formatul n care se transfer obiectul. Poate fi:
Pag. 201

ObjectName OutputFormat

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 lsai acest argument necompletat, Access v cere s alegei un format. O list de destinatari pentru pota electronic. Dac sunt mai muli, trebuie s folosii ca separator caracterul punct i virgul (;) (sau caracterul List Separator prezentat n eticheta Number a foii de proprieti Regional Settings din panoul de control Windows). Dac lsai acest argument necompletat, Access v cere s introducei recipientele. O list de destinatari pentru linia cc. O list de destinatari pentru linia bcc. Un ir care conine linia de subiect a mesajului. Un ir care conine textul mesajului. Este plasat dup obiectul ataat. Pentru a deschide aplicaia de pot electronic imediat (i a permite editarea), trebuie s folosii valoarea True. Pentru a transmite direct un mesaj, trebuie s folosii valoarea False. Dac lsai argumentul necompletat, se folosete valoarea implicit False. Numele unui fiier (inclusiv calea) care va fi folosit ca ablon pentru documentele HTML.

n exemplul urmtor, un raport este transmis mai multor persoane, una dintre ele folosete CompuServe, alta InternetMail, iar a treia Microsoft Exchange. n Access, trebuie doar s specificai numele. Nu este necesar s tii ce sistem de pot electronic folosete destinatarul. ncercai singur - Pota electronic Este evident c pentru acest exemplu, avei nevoie de o conexiune la un sistem de pot electronic. ns, chiar n lipsa acesteia, putei s parcurgei procedura fr a o implementa efectiv, pentru a vedea ct de uor poate fi adugat aceast facilitate n aplicaiile Access. Adugai n grupul de opiuni un alt buton - de data aceasta, va avea valoarea 6. Deoarece acest formular este destinat exportului de date, nu trebuie s l aglomerai cu detalii referitoare la pota electronic, aa nct este bine s lsai toate adresele necompletate. Adugai urmtoarea secven de cod la instruciunea Select Case:
Case 6 DoCmd.SendObject acQuery, "qryWhiskyAndPrices", acFormatXLS, _ , , , "Price List", "Here's our latest price list", True

Pag. 202

Prin aceast instruciune, transmitem interogarea referitoare la vnzrile lunare n format Microsoft Excel. Rulai acest fragment de cod selectnd al aselea buton de opiune n modul de afiare Form i executnd clic pe butonul Export. Cmpurile To, cc i bcc sunt necompletate, aa nct sistemul de pot electronic se va deschide normal i v va permite s selectai destinatarul (sau destinatarii) din lista de adrese. Observai c linia Subject a fost completat cu textul din instruciune, iar textul suplimentar a fost adugat dup obiect. n cazul n care completai linia To n cadrul codului i apoi configurai argumentul EditMessage la valoarea False, pota electronic este distribuit direct, fr vreo intervenie din partea dumneavoastr. Mai simplu de att nu se poate. Prin urmare, dac cineva v spune c este dificil s comunicai prin pota electronic din Access, punei-l la punct fr nici o jen. 10.5 Date externe n seciunile anterioare ale acestui capitol, am artat cum pot fi transferate date n i din Access, ns exist situaii cnd trebuie s folosim date externe fr s le importm. Access poate accesa (nu este un joc de cuvinte!) date din alte surse i acestea apar n aplicaiile dumneavoastr ca i cum ar fi tabele Access, permindu-v astfel s stocai datele ntr-o varietate de formate, dar s le folosii numai din Access. n astfel de situaii, putei lega datele n baza dumneavoastr de date. Aceast tehnic funcioneaz n mod similar cu comenzile rapide (shortcuts) din Windows 95 - datele rmn acolo unde sunt, ns dumneavoastr avei o legtur rapid la ele. Dac datele se modific, putei vizualiza modificrile aprute. Dac dumneavoastr modificai datele din cadrul legturii, i datele originale se modific. Deci, care este utlitatea legrii dateor externe n Access? Ei bine, pentru nceput, trebuie spus c Access v ofer posibilitatea dezvoltrii unor sisteme noi de baze de date, ns de multe ori, avei deja cantiti mari de date. Legarea permite accesul la informaiile din bazele de date i foile de calcul mai vechi, n timp ce un sistem nou trebuie dezvoltat de la zero. Exist i varianta folosirii facilitilor de interogare i de crearea a rapoartelor din Access, pstrnd ns aplicaia existent. De asemenea, putei s separai componentele back-end i front-end ale aplicaiei. Componenta back-end cuprinde datele propriu-zise, n timp ce componenta front-end este interfaa cu utilizatorul. Aceasta din urm include formularele, rapoartele, interogrile, macroconstruciile i modulele. Astfel, aplicaia dumneavoastr va fi divizat n dou baze de date Access:

Pag. 203

Este o tehnic uzual, care v permite s actualizai componenta front-end fr s afecteze componenta back-end. V amintii ce dificil este s distribuii aplicaiile la utilizator. Recent le-ai dat o copie cu ultima versiune a bazei de date, iar acum doresc s operai modificri - ns au nceput deja s introduc date. Prin urmare, trebuie s efectuai modificrile, dar i s oprii toi utilizatorii s foloseasc vechea baz de date i s copiai datele n una nou. ns dac separai componentele front-end i backend, partea care conine datele nu va trebui modificat niciodat - putei s nlocuii componenta front-end i apoi s refacei legtura cu tabelele. Dac decidei s aplicai aceast metod dup ce ai creat o aplicaie, alegei subcomanda Database Splitter din comanda Add-ins a meniului Tools. Programul wizard ataat acestei comenzi v va ghida prin etapele procesului de separare a tabelelor de restul obiectelor din baza de date. i tehnica de legare este foarte util, dat fiind popularitatea sistemelor clientserver. n acest caz, componenta back-end a bazei de date este, de obicei, un server puternic de baze de date, cum ar fi Microsoft SQL Server, care v pune la dispoziie facilitile unei baze de date relaionale mari. Putei s avei toate datele pe server, pentru a-l folosi la capacitate maxim, dar n acelai timp s continuai utilizarea facilitilor sistemului Access, cum sunt formularele, interogrile i rapoartele. n majoritatea cazurilor, putei chiar s mutai interogrile pe server i s le executai acolo, nu pe propriul calculator. Aceast tehnic poate mbunti viteza de lucru i, n plus, are avantajul de a minimiza traficul de reea. Singurele informaii care trec prin reea sunt instruciunile dumneavoastr pentru lansarea interogrilor i tabelul cu rezultate returnate de server. Este o abordare care face parte din modelul client-server i garanteaz c att clientul, ct i serverul (de exemplu, SQL Server) lucreaz la parametrii optimi - lsnd serverul s ruleze interogrile lungi i folosind tabelele Access pentru a accesa rapid informaii care nu se modific frecvent. Este un domeniu prea vast pentru a fi prezentat aici n detaliu, dar exist numeroase cri dedicate acestui subiect. n Access 2.0 i n versiunile anterioare, tabelele legate erau numite tabele ataate. 10.6 Tabele legate n mod sigur ai folosit i pn acum tabele legate. Acestea sunt marcate n foaia Tables a ferestrei bazei de date cu o sgeat: Figura alturat prezint un tabel din baza de date model Northwind (distribuit mpreun cu programul Access), care a fost legat la aplicaia Whisky. Putei terge oricnd o legtur, fr s afectai n vreun fel tabelul cu date. ncercai singur - Legarea unui obiect n acest exemplu, vom folosi argumentul acLink al metodei Transfer Spreadsheet a obiectului DoCmd. Putei folosi acest argument i cu metodele
Pag. 204

TransferDatabase i TransferText. Vom lega o foaie de calcul n aplicaia noastr, ns, nedorind s o definim ca o component permanent a aplicaiei, vom lucra n fereastra de depanare. 1. Deschidei un modul nou i introducei n fereastra Debug urmtoarea secven de cod: DoCmd.TransferSpreadsheet acLink, 5, "WhiskySales", _ "C:\BegVBA\WhiskySales.XLS" 2. Aceast instruciune va face legtura cu foaia de calcul creat ntr-un exemplu anterior. Al doilea argument indic faptul c realizm o legtur cu un fiier Excel versinea 5.0 sau 7.0.

Acum examinai pagina Tables a ferestrei bazei de date. Ar trebui s vedei un obiect nou, legat, care este o foaie de calcul (pentru a-l vizualiza, trebui s comutai n alt pagin i apoi s revenii). Rezult c aceast pagin poate conine nu numai tabele, ci i alte surse de date. Din moment ce sursele de date pot fi legate la Access, le putei edita ca i cnd ar fi tabele Access.
3.

Acum putei deschide foaia de calcul WhiskySales ca i cnd ar fi un tabel normal. Orice modificri pe care le operai aici se vor reflecta n foaia de calcul, ns fii foarte atent la coloanele care conin date incomplete sau confuze. Access a detectat c n a treia coloan apar numere, dar primul rnd conine titlurile coloanelor, care sunt format text. Dac intenionai s legai foile de calcul n acest fel, ar trebui s eliminai titlurile de coloane sau s folosii n legtur argumentul Range (Domeniu), pentru a include doar datele corecte. ncercai singur - Remprosptarea legturilor Dac intenionai s separai o baz de date n componentele back-end i frontend, este evident c avei nevoie de o modalitate de remprosptare a legturii dintre tabele. Aceast operaie este util nu numai pentru a distribui o nou copie a bazei de date front-end, ci i dac aplicaia back-end este instalat n alt parte dect se ateapt Access s o gseasc. 1. Creai o nou baz de date (denumii-o BackEnd) i executai clic pe Create. Pentru a importa tabelele din baza de date model, selectai din meniu File/Get External Data i executai clic pe opiunea Import. n continuare, selectai fiierul Whisky8.mdb n caseta de dialog Import, executai clic pe butonul Select All i apoi pe butonul OK n caseta de dialog Import Objects.

Pag. 205

nchidei aceast baz de date, apoi creai o alt baz de date (FrontEnd) i legai tabelele din baza de date BackEnd, selectnd opiunea Link Tables din meniul File/Get External Data. Repetai procesul de mai sus. 3. Schimbai numele bazei de date BackEnd cu NewBackEnd i ncercai s deschidei unul dintre tabelele legate: Tabelele de aici sunt doar legate. Ele nu exist, de fapt, n baza de date FrontEnd. De aceea, dac ncercai s deschidei unul dintre tabele dup mutarea bazei de date back-end, vei obine un mesaj de eroare. Acum vom reface legtura cu tabelele. 4. Creai un modul nou i adugai o funcie numit RefreshTableLinks. Introducei urmtoarea secven de cod:
2.

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.TableDefs If tblLinked.Connect <> " " Then
tblLinked.Connect = ";DATABASE=" & strDB tblLinked.RefreshLink

End If Next
RefreshTableLinks = True RefreshTableLinks_Exit:

Exit Function
RefreshTableLinks_Err:

MsgBox Error$
RefreshTableLinks = False Resume RefreshTableLinks_Exit End Function

5. Acum deschidei fereastra de depanare i apelai funcia n felul urmtor: RefreshTableLinks("C:\BegVBA\NewBackEnd.mdb") 6. nchidei fereastra modulului i ncercai din nou s deschidei un tabel. De data aceasta, nu ar trebui s mai apar un mesaj de eroare - ai refcut legturile cu tabelele, aa c Access poate gsi uor sursele de date. Cum funcioneaz?
Pag. 206

Funcia parcurge ciclic tabelele i le modific proprietatea Connect. Aceast proprietate definete irul de conectare pentru un tabel legat. Apoi, folosim metoda RefreshLink pentru a ne asigura c legtura este mprosptat. Haidei s analizm codul n detaliu: Set dbCurrent = CurrentDb() For Each tblLinked In dbCurrent.TableDefs ncepem prin deschiderea bazei de date curente i parcurgerea ciclic a coleciei TableDefs. If tblLinked.Connect <> " " Then tblLinked.Connect = ";DATABASE=" & strDB Apoi, cutm un ir nevid n proprietatea Connect. n cazul tabelelor locale, nu va exista nici o valoare - nu dorim s facem actualizarea pentru aceste tabele. Dac exist, totui, o valoare, aceasta trebuie s fie actualizat cu numele noii baze de date (transmis funciei prin argumentul strDB). Proprietatea Connect conine calea i numele bazei de date din care sunt legate tabelele. Ea are urmtoarea form: object.Connect = [databasetype; [parameters] ] Ca argument object, folosim tabelul pe care l-am gsit n structura ciclic, tblLinked. Argumentul databasetype este un ir care identific tipul de fiier - pentru Access, acest argument este lsat necompletat, ns trebuie s introducem un caracter punct i virgul ca marcaj de rezervare. Dac dorii s realizai conectarea la un tabel Paradox, argumentul trebuie s fie "Paradox 5.x" sau unul similar. n fiierul de asisten (Help) din Access, gsii o list complet a identificatorilor - cutai subiectul Connect Property. n fine, parameters reprezint calea complet i numle de fiier la bazei de date, precedat de expresia DATABASE=, n cazul nostru "DATABASE=" & strDB. tblLinked.RefreshLink End If Next Terminm structura ciclic cu o instruciune de mprosptare a legturii. Acest lucru este necesar pentru c simpla configurare a proprietii Connect nu determin restabilirea automat a legturii. Trebuie s folosim metoda Refresh. Desigur, putei s extindei procedura i s solicitai noul nume al bazei de date (n loc s-l acceptai ca parametru). n acest fel, vei spori flexibilitatea funciei. Diferene ntre tabelele legate i cele locale Tabelele legate au o serie de avantaje fa de cele locale ns, ca n orice domeniu, exist i dezavantaje. Iat care sunt acestea: Deoarece tabelele legate nu fac parte din baza dumneavoastr de date, iar nregistrrile trebuie s fie extrase din alt fiier de fiecare dat cnd
Pag. 207

ncercai s le accesai, apar probleme de vitez - n special dac tabelul legat se gsete pe un alt calculator din reea Tabelele legate trebuie s fie deschise ca seturi de nregistrri de tip dynaset sau instantaneu (snapshot) i, din acest motiv, ele nu accept metoda Seek, care poate fi aplicat doar seturilor de nregistrri de tip tabel. Trebuie s fii atent la asocierea unor tabele stocate n locuri diferite (de exemplu, unul pe calculatorul local i unul pe calculatorul situat la distan), pentru c s-ar putea ca tipurile de cmpuri s nu fie complet compatibile. De exemplu, pot aprea probleme dac asociai dou cmpuri de date, dintre care unul are formatul US, iar cellalt formatul British. Trebuie s fii atent atunci cnd asociai tabele legate de mari dimensiuni cu tabele locale mici. Dac ambele tabele sunt locale, Access poate optimiza asocierea, ns dac este legat un tabel mare de pe un calculator situat la distan, toate datele trebuie s fie trasferate nainte de asocierea efectiv. i, desigur, va trebui s luai n calcul suprancrcarea cauzat de transferul datelor la executarea interogrii. Cu toate aceste neajunsuri, nu ar trebui s renunai. Soluia back-end/frontend este extrem de util n activitatea firmelor, n condiiile n care o aplicaie de baze de date este modificat constant sau este distribuit n etape. 10.7 ODBC ODBC este abrevierea expresiei Open DataBase Connectivity (Conectivita-tea bazelor de date deschise), care reprezint o alt modalitate de acces la date externe. Bazele de date stocheaz informaiile n diferite formate i folosesc metode diferite de acces. Aa cum ai vzut deja, putei lega la o baz de date Access tabele din alte tipuri de baze de date. Tendina este ns de a include doar sistemele desktop, cum ar fi dBase i Paradox. Pentru a permite tuturor sistemelor de baze de date s schimbe date n mod liber, trebuie s existe o metod comun de acces - utilizarea unor drivere software adecvate, care se interpun ntre mecanismul bazei de date i datele celuilalt sistem. ODBC este o metod standard de implementare a acestui tip de conectivitate un singur sistem cu o interfa larg rspndit, pentru care ali creatori de sisteme de baze de date produc propriile lor programe driver. Microsoft a nceput procesul de standardizare acum civa ani, ns acesta este controlat n prezent de grupurile internaionale de standardizare, astfel c aproape toate tipurile de baze de date suport acum ODBC, inclusiv Oracle, IBM DB/2, Ingres i Informix. Marele avantaj este c programele pot fi scrise folosind interfaa standard ODBC i vor funciona cu orice baz de date pentru care exist drivere disponibile. Putei observa c mecanismul Jet accept cteva 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 continuare, gestionarul ODBC poate suporta
Pag. 208

oricte baze de date, fiecare prin propriul su sistem de driver. Majoritatea bazelor de date importante, cum sunt Oracle, DB2 i alte sisteme pentru minicalculatoare i calculatoare mainframe, suport ODBC, asigurnd un grad nalt de flexibilitate. Dac nevoile dumneavoastr se schimb, se pot schimba i bazele de date.

CAP: 11.TRATAREA ERORILOR, DEPANAREA I TESTAREA Ai nvat multe lucruri despre programarea n Access 97, inclusiv cum putei crea aplicaii sofisticate. Ceea ce nu ai nvat pn acum este cum s evitai apariia problemelor i cum s le detectai atunci cnd (i nu dac) acestea totui apar. Termenul depanare (debug) are sensul de "eliminare a erorilor din". Nimeni nu poate scrie de la nceput programe fr erori; ntotdeauna mai exist ceva la care nu v-ai gndit. De aceea, este bine s tii cum s prevenii apariia erorilor i ce trebuie s facei atunci cnd acestea apar totui n program. n acest capitol vei nva: Cum s prevenii apariia erorilor Diferite tipuri de erori Metode de tratare a erorilor Cum s folosii evenimentele de eroare 11.1 Anticiparea erorilor Una dintre legile lui Murphy spune: "Dac ntrezrii ase posibiliti ca un lucru s mearg prost i le prentmpinai, atunci va aprea n mod sigur o a aptea, la care nu v-i gndit". Alta: "Este imposibil de construit ceva care s reziste la orice intervenie neavizat, pentru c prostia are resurse nebnuite". n ciuda adevrului amar al acestor observaii, exist posibilitatea planificrii (anticiprii) erorilor. Utilizatorilor nu le pas de dimensiunea codului. Nu i intereseaz nici dac ai creat cel mai bun i mai rapid algoritm de calcul al constantei Pi (). Tot ce i doresc este ca aplicaia s arate bine i s funcioneze corect. Detectarea i eliminarea unei erori este ntotdeauna un proces care consum mult timp i, ca urmare, mult mai scump dect anticiparea erorilor. Proiectul

Pag. 209

Dac tocmai ai ntrebat "Ce proiect?", nseamn c trebuie s mergei direct la nchisoare, fr s trecei prin start i fr s ncasai suma de 200$ (v amintii de Monopoly?). proiectul este partea cea mai important a aplicaiei - fundaia pe baza creia sunt construite toate celelalte obiecte. Etapa de proiectare este cea n care stabilii exact ce trebuie s fac aplicaia . una dintre cele mai frecvente cauze de apariie a erorilor o reprezint modificrile. De multe ori, aplicaiile nu rspund cerinelor utilizatorului i trebuie modificate. Ca urmare, ncepei s adugai un fragment de cod aici, altul dincolo, iar erorile i fac apariia. Rezervai-v timpul necesar pentru a discuta cu utilizatorii i a afla tot ce doresc acetia de la aplicaie. i nu v mirai dac, dup mai multe sptmni de analiz exhaustiv a cerinelor, dumneavoastr furnizai aplicaia "la cheie", iar utilizatorul v spune: "Este foarte bine, dar nu mai putei aduga ceva aici?" Este inevitabil s se ntmple aa, pentru c utilizatorii nu sunt foarte siguri de ceea ce vor pn cnd nu vd ceva concret. Nu v repezii s rezolvai pe loc noile solicitri. n primul rnd, analizai problema i toate implicaiile pe care le presupune rezolvarea acesteia. Vei economisii astfel o mulime de timp i efort. Dac inei cont de la nceput de aceste principii, exist toate ansele s realizai o aplicaie care s poat fi modificat uor. Aceast abordare determin i reducerea numrului de erori. n continuare, sunt prezentate cteva aspecte generale la care trebuie s v gndii nainte de a ncepe programarea propriu-zis. Tabele Probabil c ai nceput s v plictisii de attea sfaturi, ns este bine s planificai tabelele. ncercai s anticipai cmpurile care ar putea fi necesare, dar la care utilizatorul nu s-a gndit. De exemplu, s-ar putea ca utilizatorii s solicite doar o adres pentru tabelul firmelor, ns cum procedai dac trebuie s sortai firmele dup zon sau dup regiunea de vnzare? Avei nevoie de mai multe cmpuri - Ora, Stat (Jude) etc. ne-am confruntat cu aceast problem chiar la nceputul crii i am vzut cum putem mpri un nume n elementele sale componente. Interogri Pentru fiecare tabel, ar trebui s creai o interogare care s afieze toate cmpurile, n felul urmtor: Este de preferat s folosii modul de afiare cu asterisc dect s specificai explicit fiecare cmp, pentru c astfel, putei s adugai cmpuri n tabel fr s modificai interogarea. Ar trebui s realizai toate formularele i rapoartele pe baza acestor interogri, i nu direct din tabele. Avantajul acestei metode este c permite modificarea detaliilor din tabele fr a afecta formularul sau raportul, exceptnd, desigur, faptul c noile cmpuri nu sunt afiate automat n formular sau raport. De exemplu, s creai un pseudonim (alias) pentru aceast interogare. Nici un formular bazat pe interogarea respectiv nu va trebui modificat.

Pag. 210

Formulare i rapoarte Aici, principiul de baz este simplitatea. S-ar putea s v plac la nebunie s creai formulare sofisticate, ns chiar sunt necesare? Aplicaia devine mai performant? Ajut ele utilizatorii s foloseasc aplicaia? Aceasta ar trebui s vin n sprijinul utilizatorului i s i uureze munca. Dac elementul pe care l adugai la interfa nu are acest rol, mai bine renunai la el. Se spune c 80% dintre utilizatori folosesc doar 20% din funcionalitatea unei aplicaii. Reinei acest aspect i nu ncrcai formularele cu prea multe informaii. Dac dorii un singur formular, dar avei multe date care trebuie afiate, ncercai s folosii Tab Control, care permite mprirea cmpurilor n pagini logice. Gruparea funciilor Gruparea funciilor nseamn pstrarea mpreun a elementelor similare. Dac scriei mai multe rutine de lucru cu iruri, plasai-le pe toate ntr-un singur modul. Astfel, vei fi sigur c nu dublai nici o procedur, din moment ce toate rutinele de acelai tip sunt grupate. n plus, dup ce toate procedurile dintr-un modul au fost depanate, putei importa modulul n alte baze de date n care avei nevoie de rutinele respective, fr s v mai preocupe depanarea acestora. 11.3 Tehnici orientate pe obiect pentru prevenirea apariiei erorilor Pentru a elimina erorile dintr-o aplicaie, putei folosi o serie de tehnici orientate pe obiect. ncapsularea ncapsularea este numit i "mascarea datelor", deoarece acest este, de fapt, rolul su. Ideea este c n loc de variabile publice, care pot fi accesate din orice funcia, folosii variabile private i creai proceduri publice pentru a le putea accesa. Aceast tehnic v asigur un control mai mare asupra datelor i v permite s modificai implementarea codului i variabilelor, fr a afecta alte rutine. Fiecare obiect ar trebui s tie totul despre el nsui i s nu se piard n momentul cnd trecei ntr-un alt mediu de lucru. Aa cum s-a artat i n capitolul precedent, noile caracteristici ale modulelor de clas din Access 97, precum i procedurile Property Get i Let care au fost introduse nc din Access95, asigur un alt nivel de ncapsulare n Access. Acestea permit mascarea datelor dintr-un formular sau modul (prin declararea lor de tip privat), ns i accesul public prin anumite rutine selectate. Astfel, putei opera modificri n codul de baz, n timp ce interfaa rmne neschimbat. De asemenea, avei posibilitatea de a aduga elemente le interfa prin folosirea argumentelor Opional - avantajul este c orice nou apel le poate folosi i, pentru c sunt opionale, vechile apeluri vor funciona n continuare corect.

Pag. 211

Refolosirea Tehnica de refolosire a modulelor de cod se potrivete foarte bine cu ncapsularea i poate fi rezumat prin dictonul: "Nu are rost s reinventai roata". Dac avei un fragment de cod care rezolv o anumit problem, refolosii-l. n afar de faptul c economisii un timp preios, n cazul n care codul respectiv nu conine erori, nu mai trebuie s l depanai. Nu ezitai s folosii un cod creat de altcineva, dac tii c funcioneaz corect i nu nclcai legile referitoare la drepturile de autor. Refolosirea nu este acelai lucru cu furtul. Cnd creai funcii noi, trebuie s v gndii dac este cazul s le implementai ca funcii generice. De exemplu, dac avei o secven de cod folosit n fiecare formular, putei transmite obiectul formular n procedur cu ajutorul obiectului Me. Astfel, orice modificare ulterioar a acestei rutine poate fi efectuat ntr-un singur loc, i nu n toate formularele. Desigur, metoda are dezavantajul c o eroare aprut n procedur va afecta mai multe zone ale aplicaiei. ns n cazul n acre efectuai o testare eficient i seciunile de cod sunt independente, le putei transfera fr team n diferite proiecte. Exist mari companii care pltesc programatorilor un bonus la fiecare refolosire a codului lor. Este o politic bun, care ncurajeaz eforturile de planificare i de identificare a altor domenii n care poate fi folosit programul respectiv. Comanda Option Explicit Este o comand extrem de util, care ar trebui s fie implicit pentru toate modulele dumneavoastr de cod. Putei configura aceast opiune n cadrul panoului Module al casetei de dialog Options, care poate fi deschis din meniul Tools: Aceast opiune iniializeaz comanda Option Explicit pentru toate procedurile. Cnd aceast opiune este validat, n toate modulele noi de cod va aprea instruciunea Option Explicit, motiv pentru care toate variabilele pe care le folosii trebuie s fie declarate explicit. Aceasta nseamn c putei evita erorile cauzate de tastarea incorect, care sunt greu de sesizat. De exemplu, citii secvena urmtoare de cod: Public Function Circumference (dblRadius As Double) Circumference = 2*3.1415926 * dblRadius End Function Ai sesizat greeala? Numele funciei a fost scris greit n instruciunea de calcul a valorii de rspuns, motiv pentru care rspunsul corect nu va fi returnat niciodat. Cu toate c aceast procedur conine o singur linie, s-ar putea s treac mult timp pn la detectarea erorii (pn cnd aceast funcie este apelat n program). Utilizarea instruciunii Option Explicit garanteaz c acest tip de eroare nu va aprea
Pag. 212

n aplicaie. Dac instruciunea Option Explicit este inclus n modul, cuvntul "Circumference" va fi marcat ca o variabil nedeclarat n momentul compilrii determinndu-v s corectai eroarea de tastare. Verificarea sintaxei Pagina Module a casetei de dialog Options include i opiunea Auto Syntax Check (Verificare automat a sintaxei). n cazul validrii acestei opiuni, Access verific sintaxa codului n timp ce scriei instruciunile, dar i la compilarea codului, i afieaz un mesaj de eroare n cazul n care gsete o linie incorect. Dac opiunea nu este validat, linia incorect va fi afiat cu alt culoare (stabilit prin meniul Tools, Options), iar codul va fi verificat doar la compilare. Opiunea Auto Syntax Check este important n special dac nu compilai codul nainte a furniza aplicaia utilizatorilor, deoarece erorile de sintax pot fi generate la rularea programului. S-ar putea ca, uneori, aceast opiune s v deranjeze, dar este preferabil s o selectai. Avantajele atrn mult mai greu n balan dect eventualele dezavantaje. Dac totui nu putei s lucrai cu aceast opiune validat (activat), nu uitai ca dup ce terminai o sesiune de editare s selectai opiunea Compile All Modules din meniul Debug (cnd avei deschis fereastra unui modul). Comentarii Exist controverse cu privire la acest subiect. Unii programatori nu insereaz nici un fel de comentarii n cod ("Dac a fost greu de scris, ar trebui s fie i greu de citi"); ali programatori comenteaz fiecare linie n parte. Ambele metode sunt greite. Trebuie s gsii o cale de mijloc. Iat cteva sugestii utile n acest sens: La nceputul fiecrei proceduri, introducei un comentariu n care descriei rolul acesteia, ce argumente primete i ce fel de valori returneaz. 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.1415926 * dblRadius End Function Comentai folosirea variabilelor. Plasai comentariile pe linii separate, cu excepia situaiilor n care descriei o variabil, cnd comentariul ar trebui s fie pe aceeai linie cu declaraia. Comentai seciuni de cod (funcionaliti), i nu linii individuale. Nu comentai ceea ce este evident. Dac atribuii o valoare unei variabile, nu este cazul s inserai un comentariu de genul: "Stabilete valoarea la". n astfel de situaii, introducei comentarii doar dac exist un motiv pentru a descrie de ce
Pag. 213

efectuai operaia respectiv, cum ar fi atribuirea unei valori Empty sau Null pe care o vei folosi ulterior n cod. Depanai codul, nu comentariile. Nu v bazai pe comentarii, pentru c, de multe ori, acestea nu sunt actualizat o dat cu codul. Ar trebui s v asigurai c orice modificare pe care o efectuai se reflect i n comentariile din cod. Cel mai important lucru pe care trebuie s l avei n vedere este consecvena. Ca i n restul aplicaiei, alegei stilul care v place i folosii-l doar pe acesta. 11.4 Testarea Multe companii mari au echipe speciale pentru testarea aplicaiilor. Altele prefer s lase utilizatorii s efectueze testarea (pentru aceasta se lanseaz de fapt versiunile beta!). oricum, indiferent de experiena pe care o avei n programare, nu este indicat s srii peste etapa de testare a codului. Fiecare programator trebuie s i asume responsabilitatea pentru codul pe care l-a creat. La urma urmei, tot dumneavoastr va trebui s eliminai erorile descoperite n aplicaie. Testarea poate avea mai multe forme i este bine s v rezervai timp pentru fiecare dintre ele. Considerai aceast etap din procesul de realizare a aplicaiei la fel de important ca i scrierea codului. n continuare, vom analiza diferite faze de testare. Testarea funcional Testarea funcional const n a verifica dac ntreaga aplicaie, sau o parte a acesteia ndeplinete funcia pentru care a fost scris. Exist trei ci de a obine un rspuns i acestea ar trebui s fie folosite n ordinea corect: Testai aplicaia personal, deoarece suntei cel care nelege cel mai bine cum ar trebui s funcioneze. Transmitei aplicaia la utilizatori. n fond, ei sunt cei care au stabilit cerinele. Transmitei aplicaia (pentru testare), mpreun cu specificaiile de utilizare, unor persoane neimplicate n proiect. Nedispunnd de alte informaii n afar de coninutul documentaiei, aceste persoane nu vor avea idei preconcepute. n plus, nici nu v vor deranja n cazul n care aplicaia nu li se pare complet. Testarea modului de utilizare Aceasta este etapa urmtoare, la care trecei dup ce v vei convinge c aplicaia rspunde cerinelor utilizatorilor. Testarea modului de utilizare se aplic n special poriunilor vizibile ale aplicaiei. Trebuie s apreciai dac interfaa este uor de folosit sau este confuz pentru utilizatori? Respect conveniile uzuale? De fapt, dac utilizatorilor nu le place cum se prezint aplicaia, nu mai conteaz ct de bine rspunde aceasta cerinelor iniiale. Dei dumneavoastr avei propriile criterii de apreciere, al sfritul zilei trebuie s realizai ceva care s mulumeasc beneficiarul. Vei lua n calcul i timpul necesar pentru realizarea unei anumite operaii. Dac o
Pag. 214

funcie este executat ntr-un timp care depete limita, va trebui s rescriei codul respectiv. Testarea distructiv Aceasta este etapa cea mai distractiv. Dai aplicaia altei persoane i rugai-o s o ncerce prin orice metode, chiar neconvenionale. Dac testai un formular, apelai la cineva care nu a mai lucrat cu formulare, sau nici mcar cu calculatoare. Dac testai secvene de cod., apelai la serviciile altui programator. Acesta va fi fericit s v purice programul. i putei fi sigur c, dup ce descoper cteva erori evidente, de care se bucur ca un copil, vei crete nivelul verificrilor pe cont propriu. Dei iniial s-ar putea s v simii frustrat, n timp, vei deveni un programator mai bun! (i vei avea ocazia s v rzbunai pe cei care, la rndul lor, v vor ruga s le testai programele). ntreinerea Se spune c un programator i petrece 60% din timp cu ntreinerea programelor vechi (se mai spune i c 85% dintre statistici sunt inventate, dar asta este o alt poveste). Cnd operai modificri n cod, indiferent dac este vorba despre un program vechi sau de unul nou, este bine s luai n considerare urmtoarele aspecte: Modificarea pe care o efectuai va avea impact asupra altor programatori? Dac este vorba de o rutin de bibliotec, discutai cu alte persoane care folosesc rutina respectiv nainte a efectua modificrile. n cazul n care este o eroare de cod i alii au tratat eroare a respectiv, dac dumneavoastr corectai codul, este posibil ca aplicaiile lor s nu mai funcioneze corect. Concentrai-v pe corectarea problemei curente. Efectuai o singur modificare la un moment dat. Imaginai-v c lucrai la corectarea ai multor probleme, iar cnd rulai programul, apar erori noi. Care dintre modificri a generat aceste erori? Dac rezolvai problemele pe rnd i le testai una cte una, timpul total de ntreinere a aplicaiei s-ar putea reduce considerabil. Nu v pierdei vremea cu "aranjarea" sau mbuntirea codului dect n cazul n care acesta este principalul motiv pentru care l modificai. Sugestiile prezentate mai sus sunt ntr-adevr de bun sim, ns vei fi surprins ct de repede uitai de ele atunci cnd suntei concentrat asupra codului. 11. 5 Tipuri de erori Putei (i ar trebui) s urmai toate sugestiile anterioare referitoare la prevenirea erorilor, ns, din pcate, este foarte probabil ca n codul dumneavoastr s apar totui erori. Acestea pot fi de mai multe feluri; este important s tii cu ce tip de
Pag. 215

eroare avei de-a face, pentru a putea alege cea mai bun metod de rezolvare. Am artat n Capitolul 2 care sunt cele trei tipuri de erori: Erori de sintax Erori de execuie Erori de semantic sau logice n cele ce urmeaz, vom analiza fiecare dintre aceste tipuri de erori i vom vedea cum le putem corecta. n aceast etap, este important s nelegei deosebirea dintre erorile obinuite i erorile de programare (bugs). O eroare poate fi un eveniment util, cum sunt erorile de acces la date (Data Access Errors), care v permit s rulai o secven de cod la apariia unei erori n tabel. De exemplu, dac un tabel nu permite valori null ntr-un anumit cmp, ar trebui s afiai pe ecran o caset de dialog personalizat care s descrie eroarea i locul n care utilizatorul poate gsi informaii de asisten n cazul n care problemele persist. Este o eroare detectabil, care poate fi tratat de programator. O eroare de programare (bug) este o eroare pe care programatorul nu a prevzut-o. Erori de sintax Sunt cele mai simple forme de erori, cauzate, n principal, de greelile de tastare. Cei care au depit stadiul de folosire a tastaturii cu dou degete, vor face, probabil, mai puine greeli, ns aa cum am menionat, exist o metod simpl de a le descoperi - lsai aceast sarcin mediului Access. Dac activai opiunea de verificare a sintaxei i v asigurai c toate variabilele sunt declarate, Access v va avertiza de fiecare dat cnd introducei instruciuni eronate. Oricum, vei ntlni i cazuri n care construcia folosit este greit. i acestea sunt semnalate de Access.

Fig. 11.1
Pag. 216

S presupunem ca ai tastat instruciunile ForNext sau instruciunile For Each . Access nu a gsit instruciunea Each i, ca urmare, ateapt apariia unei variabile. Deoarece acesta nu apare, cnd apsai tasta Return, linia este evideniat, iar pe ecran este afiat un mesaj de eroare. Putei s executai clic pe butonul OK pentru a anula mesajul de avertizare i s corectai eroarea sau s revenii la ea ulterior. Dac nu rezolvai problema, eroarea va fi semnalat din nou la compilarea modulului. Mai exist un tip de eroare de sintax, care nu poate fi descoperit imediat. Examinai figura urmtoare:

Fig. 11.2 Cnd executai clic pe butonul OK, funcia CurrentDatabase este evideniat, fie pentru c i-a scris greit numele (n loc de CurrentDB), fie pentru c este vorba de o funcie care nu exist sau care nu poate fi vizualizat. Aceasta se poate ntmpla n cazul n care creai ntr-un alt modul o procedur de tip Private, n loc de o procedur de tip Public. Erori de execuie Aa cum sugereaz i numele lor, erorile de execuie pot fi descoperite numai n timpul execuie programului. O eroare de execuie determin oprirea execuiei codului, cu toate c sintaxa este corect, iar codul poate fi compilat. De fapt, succesul compilrii indic doar faptul c instruciunile din cod sunt n ordinea corect i c nu s-au folosit funcii nedefinite. Codul poate conine ns multe alte tipuri de erori. Folosirea extins a caracteristicilor Auto Tips (sugestii automate) a permis evitarea multor erori de execuie, Access punnd la dispoziie parametri de proceduri, precum i proprieti i metode de obiecte. Totui, erorile sunt posibile. Una dintre cele mai frecvente erori de aceste tip este Type Mismatch (Nepotrivire de tip). Aceast eroare apare atunci cnd atribuii o valoare de un anumit tip unei variabile de tip diferit (incompatibile).
Pag. 217

Putei s oprii execuia programului i s evideniai linia de cod care a generat eroarea, executnd clic pe butonul Debug. n exemplul urmtor, unei variabile de tip Integer (ntreg) i-a fost atribuit o valoare de tip text - ceea ce, evident, este greit:

Fig. 11.3 Acest exemplu ilustreaz importana testrii i a aplicrii consecvente a unei convenii de nume, deoarece eroarea este dificil de detectat prin simpla trecere n revist a codului, chiar i de ctre cei mai experimentai programatori.

Erori de semantic Recent, n pres a aprut un articol despre o mic firm din Marea Britanie care a dezvoltat o metod de scriere a aplicaiilor software fr erori. nc nu s-a dovedit acest lucru, ns, dac este adevrat, proprietarii acelei firme se vor mbogi. Bill Gates, fii pe faz! Erorile de semantic sunt cel mai dificil de descoperit, deoarece reprezint erori n algoritmul logic al programului; chiar i firma Microsoft a furnizat produse cu astfel de erori, deci v dai seama ct de importante sunt. Uneori, aceste erori pot produce erori de execuie; n acest caz, pe ecran este afiat caseta de dialog prezentat ntr-un paragraf anterior, care v permite s identificai linia de cod ce a generat eroarea. Nu trebuie s considerai aceast informaie liter de lege, pentru c este posibil ca linia care a generat eroarea s nu fie i cauza problemei. Este cazul liniilor de cod care conin mai multe variabile. De exemplu, dac una dintre variabile are o valoare incorect, trebuie s gsii locul n care a fost atribuit valoarea respectiv. Dac ai scris un program modular, bine structurat, s-ar putea s parcurgei trei sau patru funcii diferite (pentru c o funcie a apelat alta, iar aceasta a apelat, la rndul su, alt funcie), astfel c trebuie s revedei toate procedurile implicate pentru a descoperi cauza real a problemei. ntr-o alt seciune din acest capitol vei nva cum s procedai.
Pag. 218

Testarea erorilor de semantic este dificil de efectuat, pentru c trebuie s testai ceea ce considerai c ar trebui s fac programul, i nu ceea ce face efectiv. Totui, testarea nu este imposibil, deoarece programatorii sunt persoane foarte atente. Un programator examineaz un fragment de cod i se gndete: "OK, tiu ce face" i trece mai departe. ncercai s nu v nsuii acest obicei. n procesele de testare i depanare, trebuie s renunai la ideile preconcepute i s analizai problemele plecnd de la zero. Uneori este dificil, dar merit s ncercai. Haidei s analizm o defeciune aprut n timpul execuiei unei aplicaii, care a fost generat o eroare semantic. Acest exemplu particular demonstreaz faptul c un mesaj de eroare poate s nu indice cauza real a erorii. ncercai singur - Erori de execuie i de semantic
1.

Creai un nou modul i adugai procedura urmtoare:

Public Function DivideNumbers (dblNum1 As Double, dbl1Num2 As Double) _ As Double DivideNumbers = dblNum1 / dblNum2 End Function

Aceast procedur mparte un numr la altul.


2.

Compilai codul executnd clic pe butonul Compile Loaded Modules i salvai modulul. n continuare, creai un formular nou, cu trei controale de text neasociate i un buton de comand. Modificai titlurile ca n figura alturat i schimbai proprietile Name ale casetelor de text cu txtNumber1, txtNumber2, i txtResult, iar a butonului de comand cu cmdDivide.

3.

4. Acum adugai urmtoarea linie de cod n procedura evenimentului On Click pentru butonul de comand: txtResult = DivideNumbers (txtNumber1, txtNumber2) 5. Comutai formularul n modul de afiare Form i introducei urmtoarele numere: 4 i 2
Pag. 219

Rezultatul este cel pe care l ateptai. 6. Acum ncercai din nou, dar introducei valoarea 0 pentru al doilea numr. i-a fcut apariia cunoscuta eroare Division by zero (mprire la zero). 7. Executai clic pe butonul Debug i ajungei direct la linia de cod din funcia DivideNumbers n care a aprut eroarea. Acum trebuie s decidei dac aceasta este linia cu probleme. Eroarea a fost generat de numrul introdus de utilizator - n mod evident, trebuie s verificm dac numrul introdus n caset nu este zero. Datele au fost transferate din alt procedur, deci unde verificm valorile introduse de utilizator (n procedura respectiv sau n aceasta)? n cazul de fa, verificarea ar trebui s fie efectuat n funcia DivideNumbers. O funcie trebuie s fie complet autonom - dac fiecare procedur care o apeleaz verific valorile, codul se extinde foarte mult. Prin urmare, este bine s adugai secvena de verificare aici (n funcie).
8.

Adugai urmtoarele linii de cod n funcia DivideNumbers. Nu uitai s salvai programul dup ce efectuai modificrile.

Public Function DivideNumbers (dblNum1 As Double, dbl1Num2 As Double) _ As Double If dbl1Num2 <> 0 Then DivideNumbers = dblNum1 / dblNum2 End If End Function
9.

Revenii n formular i reluai ultimul exemplu (cel cu 0). De data aceasta, nu mai apare nici un mesaj de eroare. Funcia nu mai ncearc s efectueze mprirea la zero. Oricum probleme nu este nc rezolvat. Matematicienii care vor analiza programul vor observa c, dei nu apare un mesaj de eroare, rspunsul nu este corect. Rezultatul mpririi unui numr la 0 nu este 0. i nc nu am analizat toate valorile eronate care ar putea fi introduse de un utilizator. De exemplu, ce se ntmpl dac un utilizator introduce o liter n loc de un numr? Vei primi un alt mesaj de eroare, de data aceasta Run-Time Error 13, Type Mismatch. Acest mesaj v
Pag. 220

comunic faptul c tipurile de variabile sunt incompatibile i c se ncearc mprirea printr-o liter sau printr-un ir de caractere. Trebuie s utilizm o funcie care se poate "apra" singur, garantnd astfel c nu va mai fi generat nici o eroare de execuie. 10. Modificai funcia DivideNumbers dup cum urmeaz:
Public Function DivideNumbers (dblNum1 As Variant, dbl1Num2 As _ Variant, 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. n continuare, modificai i procedura de tratare a evenimentului On Click pentru butonul de comand:
Dim bolErrorCheck Dim dblCalResult As Boolean As Double

bolErrorCheck = DivideNumbers (txtNumber1, txtNumber2, dbCalResult) If bolErrorCheck = True Then txtResult = dblCalcResult Else txtResult = "Semantic Error" End If

12. Rulai din nou exemplul. De data aceasta, nu ar mai trebui s apar nici o eroare, indiferent de valorile introduse. Cum funcioneaz? La terminarea exerciiului, funcia accept trei argumente. Primele dou sunt deja cunoscute - acestea transmit cele dou numere care trebuie mprite. Al treilea argument este folosit pentru a stoca rezultatul mpririi i a transfera acest rezultat n formular dup terminarea cu succes a operaiei. Deoarece numrul de parametri
Pag. 221

acceptai de funcie s-a modificat, a fost actualizat corespunztor i numrul de parametri cu care este apelat funcia. Rezultatul operaiei este transmis prin variabila boolean bolErrorCheck. Valoarea acesteia depinde de valoarea returnat de funcie. Dac aceasta este True, este afiat rezultatul calculului; dac valoarea este False, pe ecran este afiat mesajul Semantic Error. Dac n operaia de mprire apare o eroare, detecatrea acesteia, care a fost permis prin activarea opiunii On Error GoTo DivideNumbers_Err, redirecteaz execuia programului la eticheta DivideNumbers_Err. n acest punct, valoarea de rspuns a funciei este stabilit la False i se iese din funcie prin intermediul etichetei DivideNumbers_OK. Desigur, dac operaia este corect, valoarea de rspuns a funciei este configurat la True. n acest fel, sarcina de a verifica valorile introduse cade n sarcina procedurii apelante. Probabil c nu vei folosi niciodat o funcie doar pentru a mpri dou numere, ns acest exemplu a artat care sunt principiile de lucru. Procedura trebuie s fie capabil s reacioneze la datele de intrare incorecte, s nu ascund erorile i s le trateze corespunztor, dac sunt disponibile informaiile referitoare la codul erorii.

Localizarea erorilor n procesul de detectare a erorilor, trebuie s v amintii c mediul Access este dirijat de evenimente, iar codul poate fi activat n cale mai diverse zone. S lum ca exemplu deschiderea unui formular. Ce evenimente credei c sunt generate? n total, sunt cinci evenimente: Open Load Resize Activate Current nchiderea unui formular genereaz trei evenimente: Unload Deactivate Close Ca urmare, dac la deschiderea unui formular apare o problem, trebuie s verificai toate celelalte evenimente. O metod de a verifica toate procedurile dintr-un modul este selectarea opiunii Full Module View din pagina Module a ferestrei Options, accesibil din meniul Tools. Acelai rezultat se obine prin executarea unui clic pe butonul aflat n colul din stnga-jos al ferestrei modulului. Aceste aciuni determin afiarea tuturor procedurilor n fereastra modulului, separate prin cte o linie orizontal (dac este selectat opiunea Procedure Separator). n cazul n care nu ai selectat aceast opiune, putei trece de la o procedur la alta folosind tasta Ctrl mpreun cu sgeile de deplasare n sus i n jos.

Pag. 222

Alte erori Aceast seciune este dedicat tuturor celorlalte cauze care pot genera o eroare ntr-un modul VBA. Desigur, numrul erorilor posibile este direct proporional cu importana aplicaiei i invers proporional cu timpul necesar pentru depanare! Una dintre cauzele generatoare de erori poate fi folosirea unor aplicaii externe, cum ar fi bibliotecile cu legare dinamic (DLL) sau controalele personalizate. Dac programatorii care au scris aceste aplicaii le-au testat corespunztor, nu ar trebui s v confruntai cu defeciuni de funcionare, cu mici erori de programare (bugs). Exist i alte cauze, cum ar fi memoria insuficient sau o baz de date cu o nregistrare alterat, care pot provoca evenimente foarte neplcute. Depirea memoriei disponibile (care este posibil chiar i sub Windows 95) semnific faptul c Access nu are suficiente resurse pentru a afia toate elementele ecranului. Cu toate c n astfel de situaii nu prea avei ce s facei, este bine s tii ce tipuri de probleme care pot cauza erori inexplicabile. Dac vrei un rspuns, parcurgei urmtoarele etape: Verificai n detaliu codul scris de dumneavoastr ncercai s rulai aplicaia pe un alt calculator Dac funcioneaz corect, analizai diferenele dintre cele dou sisteme de calcul. S-au ntlnit cazuri n acre o astfel de eroare a fost acuzat de o bibliotec DLL mai veche, existent pe unul dintre calculatoare, cellalt dispunnd de o versiune actualizat a bibliotecii. Rugai pe altcineva s verifice codul sau parcurgei-l dumneavoastr pas cu pas, explicnd toate etapele i procedurile. Este uimitor ct de repede putem detecta o eroare atunci cnd explicm cuiva fiecare instruciune a programului. Intrai n panic! Nu ar trebui s ajungei niciodat la ultima etap, deoarece putei gsi ntotdeauna undeva sau la cineva rspunsul la problema dumneavoastr. Dac este posibil, folosii reeaua dezvoltatorilor de produse Microsoft (Microsoft Developer Network) sau alte servicii on-line, cum sunt Microsoft Network, CompuServe i Internet. Vei intra ntro alt lume de dimensiuni foarte mari, unde toi (sau majoritatea) sunt dispui s v ajute. 11.6. Depanarea Dup ce ai aflat care sunt metodele de prevenire a erorilor i tipurile de erori care pot aprea, trebuie s tii i cum s detectai erorile. Pe msur ce ctigai experien n programarea cu VBA, vei vedea c instinctul v va ajuta tot mai mult i vei descoperi erorile doar pe baza intuiiei. Pn atunci, v vom indica direcia n care trebuie s cutai.
Pag. 223

Execuia programului Access v pune la dispoziie ,mai multe metode care permit navigarea prin codul aflat n execuie. Astfel, putei s ncepei dintr-un loc n care s tii c programul funcioneaz corect i s avansai pas cu pas spre zona n care se manifest eroarea. Exist dou locuri n care gsii toate facilitile pentru depanare. Primul este bara cu instrumente Visual Basic Al doilea este meniul Debug Prin combinarea acestora, obinei controlul complet asupra modului de execuie al programului. n urmtoarele seciuni vor fi explicate i funciile tuturor butoanelor, precum i utilizrile acestora; apoi vom trece la o aplicaie practic. Puncte de ntrerupere Punctele de ntrerupere (breakpoints) sunt eseniale n depanare, pentru c v permit s marcai liniile la care dorii ca execuia programului s fie oprit temporar. Putei stabili punctele de ntrerupere n patru feluri: Executai clic pe butonul Toggle Breakpoint. Selectai opiunea Toggle Breakpoint din meniul Debug. Apsai tasta F9. Executai clic pe marginea din stnga a ferestrei modulului, n dreptul instruciunii corespunztoare. Toate aceste aciuni sunt de comutare, adic stabilesc un punct de ntrerupere acolo unde nu exist i elimin unul existent. Nu exist o limit pentru numrul de puncte de ntrerupere care pot exista la un moment dat ntr-un program. Cnd Access ntlnete o linie cu punct de ntrerupere, programul este oprit, pe ecran este afiat fereastra cu codul rulat n momentul respectiv, n cadrul creia este evideniat linia cu punctul de ntrerupere. Putei folosi fereastra de depanare pentru a inspecta sau a stabili valorile variabilelor, sau chiar pentru a schimba codul n fereastra modulului. Programul va rmne activ pn cnd l oprii. Execuia programului poate fi oprit i apsnd tasta Ctrl+Break n timpul rulrii codului. Aceast combinaie de taste are acelai efect cu un punct de ntrerupere, permindu-v inspectarea variabilelor i chiar modificarea codului. Continuarea execuiei Putei folosi butonul Go/Continue pentru a continua execuia unui program oprit temporar. Execuia va ncepe de la linia curent i va continua pn la introducerea unei date de ctre utilizator sau pn ce se ajunge la un alt punct de ntrerupere. Stoparea execuiei Putei aciona oricnd butonul End pentru a opri execuia programului.
Pag. 224

Reiniializarea execuiei Butonul Reset oprete execuia programului i reiniializeaz toate varibilele. Este cel mai util instrument n cazul n care folosii variabile statice pentru memorarea valorilor. De asemenea, putei folosi acest buton atunci cnd depanai module de formulare sau de rapoarte. Cnd execuia se oprete, nu putei accesa formularul sau raportul respectiv dac nu executai clic pe butonul Continue sau Reset. Execuia codului pas cu pas Oprirea ntr-un punct de ntrerupere este foarte util, ns cum procedai dac dorii s analizai liniile de cod n timpul execuiei? Stabilirea unui punct de ntrerupere la fiecare linie de cod ar fi un proces foarte laborios; de aceea, a fost introdus posibilitatea de execuie a codului pas cu pas. Dup oprirea unui program, putei rula o singur instruciune la un moment dat, avnd astfel posibilitatea s aflai care linii de cod sunt corecte i care conine erori. Exist mai multe posibiliti de a executa codul pas cu pas: Butonul Step Into execut doar linia pe care este plasat cursorul. Dac aceast linie conine apelul unei proceduri, va determina intrarea n codul procedurii i continuarea execuiei pas cu pas. Butonul Step Over execut tot linia pe care este plasat cursorul. Dac linia curent conine o procedur, codul acesteia este executat normal fr a fi parcurs pas cu pas. Ulterior, la revenirea din procedur, se trece automat la execuia pas cu pas a programului. Butonul Step Out continu execuia programului de la procedura curent i oprete execuia la linia care urmeaz dup procedura apelant. Este un fel de combinaie ntre Step Out i Step Over.

Dac avei nevoie de mai mult flexibilitate, putei folosi opiunea Run To Cursor din meniul Debug. Plasai cursorul pe linia la care dorii s se opreasc execuia programului i apoi selectai Run To Cursor. Toate liniile pn la cea cu cursorul vor fi parcurse normal (nu pas cu pas), ca i cum pe aceast linie a fot plasat un punct de ntrerupere temporar. Avantajul metodei Step Into este c putei verifica fiecare linie de cod din toate procedurile ntlnite n timpul execuiei. ns exist i dezavantajul c este o metod mare consumatoare de timp, n special dac procedurile conin bucle. Metoda Step Over v permite s executai rapid procedurile despre care tii c sunt corecte. i, desigur, dac folosii proceduri care au fost deja testate i depanate, putei trece peste ele pentru a v concentra asupra codului nou, unde v ateptai s apar erori. Opiunea Run To Cursor este extrem de util n cazul n care codul conine bucle (structuri ciclice) pentru c v permite s srii rapid la instruciunea de dup bucl, economisind astfel mult timp.

Pag. 225

Repetarea execuiei liniei de cod Posibilitatea de a repeta execuia anumitor linii de cod a fost introdus nc din Access 95, ns a fost mult simplificat n Access 97. Acest lucru poate reprezenta un avantaj real n cazul n care v-ai oprit la un punct de ntrerupere i observai c o linie de cod care a fost deja executat conine o eroare. n aceast situaie, putei s revenii la linia respectiv i s repetai execuia codului (dup corectarea erorii). n acest scop, tragei sgeata de pe marginea ferestrei modului n noua locaie. Executai clic pe linia la care s-a oprit execuia codului i apoi, innd apsat butonul mouse-ului, tragei cursorul pe o alt linie. Observai transformarea cursorului ntr-o sgeat care indic noua linie. Cnd ajungei pe linia urmtoare celei pe care vrei s poziionai cursorul, eliberai butonul stng al mouse-ului: Cnd continuai execuia programului, acest va fi reluat de la noua linie de cod. O alt metod de efectuare a acestei operaii este s plasai cursorul pe noua linie i s apsai combinaia de taste Ctrl+F9. Saltul peste liniile de cod Saltul peste liniile de cod poate fi util, ns presupune mult atenie. Dup plasarea cursorului pe o linie care nu a fost nc executat, putei folosi opiunea Set Next Statement din meniul Debug pentru a comunica mediului Access c aceasta este linia pe care dorii s o executai n continuare. Toate liniile de cod anterioare sunt ignorate.

Opiunea Show Next Statement v va informa ce linie de cod urmeaz s fie executat. Este o informaie util n cazul n care ai analizat alte proceduri i ai pierdut poziia curent din fereastra de cod. Modificarea codului Access permite modificarea codului n timp ce execuia este oprit, astfel nct dumneavoastr s putei corecta eventualele erori descoperite. Pentru a continua execuia programului de la linia corectat, executai clic pe butonul Continue. De fapt, chiar dac rescriei seciuni ntregi de cod, putei continua execuia programului. Totui, Access nu v va permite s modificai o declaraie. Procednd astfel, nseamn c ntreaga structur a codului se modific (nu numai cteva linii) i vei primi un mesaj prin care suntei ntrebat dac dorii s abandonai modificrile sau s reiniializai programul. Selectarea opiunii de reiniializare are acelai efect cu executarea unui clic pe butonul Reset - se oprete execuia codului, sunt reiniializate toate variabilele, iar punctul urmtor de execuie se mut pe prima linie de cod, pregtind o nou pornire.

Pag. 226

Dac dorii s modificai anumite variabile, fr s reiniializai programul, putei s ieii din aceast procedur, s modificai variabilele locale i apoi s stabilii urmtoarea instruciune pentru ca procedura s poat fi rulat din nou. Stiva de apeluri Cnd depanai programe mari sau complexe, ori programe bine modularizate, putei s pierdei punctul curent din program. Dac executai clic pe butonul Call Stack (Stiva de apeluri), vei vedea pe ecran o list cu procedurile active: Observai c acestea nu sunt procedurile care au fost rulate, ci procedurile care sunt executate n momentul respectiv. De exemplu, dac procedura A apeleaz procedura B i B apeleaz C, iar dumneavoastr oprii execuia programului n C, executnd un clic pe butonul Calls, vei vedea pe ecran C, B, A, adic procedura executat n mod curent i cele care au apelat-o. Dac ai terminat execuia procedurii C i apoi ai continuat execuia procedurii B, n fereastra de apeluri vor fi afiate doar B i A. Este una dintre situaiile n care se recomand folosirea opiunii Show Next Statement, pentru c s-ar putea s uitai de unde ai nceput analiza procedurilor chiar n mijlocul procesului de depanare. Fereastra de depanare (Debug) Ai vzut deja mai multe exemple de utilizare a ferestrei de depanare, unde putei introduce comenzi care sunt executate imediat - n versiunile anterioare de Access, aceasta era numit fereastra imediat. Oricum, este fereastra folosit cel mai frecvent n depanare. n cadrul ei, putei afia datele, putei executa codul i putei chiar analiza variabilele. De asemenea, putei folosi fereastra de depanare pentru a schimba coninutul variabilelor, astfel nct s corectai valorile care pot genera erori. Dac bnuii c o anumit valoare va determina apariia unor probleme n cod, putei s modificai valoarea respectiv i s continuai apoi lucrul. Este o metod foarte util n timpul testrii, permindu-v s introducei valori eronate n variabile pentru a testa rspunsul procedurilor. Dac ai folosit versiuni anterioare de Access, vei observa c fereastra de depanare a fost considerabil modificat; haidei s vedem cum arat noua fereastr:

Pag. 227

Fig. 11.4 Panoul Locals afieaz variabilele i valorile coninute de acestea n cadrul procedurii active la momentul respectiv. Panoul Watch afieaz variabilele pe care dorii s le urmrii n cadrul execuiei codului. n dreapta exist o caset de text, care afieaz starea procedurii, i butonului de construcie, care afieaz fereastra Call Stack. Panoul de jos, Immediate Pane, a fost folosit pn acum pentru apelurile de proceduri. Elemente de urmrire Butonul Instant Watch (Urmrire imediat) v permite s stabilii un element de urmrire pentru variabile sau expresii. Putei folosi elementele de urmrire i ca puncte de ntrerupere condiionale. Dac specificai un element de urmrire (watch) cu opiunile Break When Expression Is True (oprete execuia cnd expresia este adevrat) sau Break When Expression has Changed (oprete execuia la modificarea expresiei), codul va fi oprit la execuie, permindu-v s analizai att elementul de urmrire, ct i valorile variabilelor. Este o metod util, mai ales cnd avei o variabil care provoac probleme, dar nu tii unde a fost valoarea respectiv. n acest caz, putei s adugai o opiune de ntrerupere pentru elementul de urmrire, iar execuia programului va fi oprit imediat ce valoarea este adevrat sau se modific. Prin utilizarea acestei variante de punct de ntrerupere, execuia programului este ncetinit, ceea ce nu reprezint o problem la depanare. ncercai singur - Depanarea codului Pentru acest exemplu, trebuie s deschidei modulul Chapter 11 Debugging din fiierul Whisky11.mdb n modul de afiare pentru proiectare (Design). Modulul conine urmtoarele trei proceduri: DisplayWhisky, care afieaz toate tipurile de whisky pentru un nume de regiune. GetWhisky, care ncearc toate tipurile de whisky pentru o regiune dintr-o matrice global. DisplayWhiskies, care afieaz coninutul matricei globale. DisplayWhisky accept ca intrare o matrice cu nume de regiuni, astrRegions(), i apeleaz funcia GetWhisky o dat pentru fiecare regiune din matrice. Apoi apeleaz procedura DisplayWhiskies, care afieaz n fereastra de depanare valorile existente n matricea global. Pentru a gsi toate nregistrrile corespunztoare regiunii selectate, GetWhisky creeaz o instruciune SQL i apoi
Pag. 228

adaug fiecare tip de whisky n matricea global. Exist i un argument opional, care permite includerea sau excluderea preului produsului dup preferine. Vom experimenta fiecare dintre aceste funcii i vom vedea cum le putem depana atunci cnd descoperim o eroare; n plus, vom analiza variabilele pe care le conin. Deoarece vei controla execuia funciilor din fereastra de depanare, este necesar s deschidei i aceast fereastr.
1.

n primul rnd trebuie s stabilii un punct de ntrerupere i, deoarece dorii s executai codul pas cu pas, s l plasai pe prima linie executabil din funcia DisplayWhisky:

2. Apoi apelai procedura din fereastra de depanare: DisplayWhisky "Islay", "Highland" Ar trebui s observai oprirea execuiei codului. Executai clic pe Debug Window pentru a aduce aceast fereastr n prim-plan:
3.

Haidei s analizm n detaliu panoul Locals:

Acest panou afieaz toate variabilele care sunt active sau care se gsesc n domeniu. Prima linie este pentru modul, iar semnul plus indic posibilitatea expandrii pentru a afia elementele componente. A doua linie afieaz atrRegions, o matrice local care nu are nc atribuite valori. A treia linie conine strRegion, o variabil local cu valoarea Empty, care are valoarea atribuit automat la crearea variabilelor Variant.
4.

Executai clic pe semnul plus (sau executai dublu-clic pe linie) pentru a expanda linia Chapter 11 Debugging:

Pe ecran sunt afiate cele dou variabile globale, mpreun cu tipurile i valorile lor. Putei vedea c mastrWhiskies este o matrice de tip typWhisky i c strSQL este un ir (string). Expandai i astrRegions pentru a vedea ce conine. Deoarece astrRegions este o matrice, pe ecran va fi afiat fiecare element al matricei, mpreun cu valoarea coninut. 5. Haidei s ncercm o alt metod de analiz a variabilelor. n fereastra de depanare, putei introduce un semn de ntrebare urmat de numele variabilei

Pag. 229

Pe ecran va fi afiat numele regiunii pe care l-ai transmis ca prim argument al procedurii. Putei analiza i variabila strRegion, ns aceasta nu conine nimic, pentru c linia nu a fost nc executat i, ca urmare, nu a primit nici o valoare.
6.

Acum executai clic pe butonul Step Into pentru a rula aceast linie de cod. Poziionai cursorul pe linia strRegion din bucl, pentru a vedea o alt metod de analiz a variabilelor.

Pe ecran apare o caset explicativ (etichet ToolTip) n care este afiat valoarea variabilei.
7.

Punctul de ntrerupere este n continuare pe linia For Each, ns linia curent este urmtoarea, care apare evideniat. Acum, s vedem ultima metod de analiz a variabilelor, Quick Watch (Urmrire rapid). Poziionai cursorul pe strRegion i executai clic pe butonul Quick Watch (sau folosii combinaia de taste Shift+F9):

Prin aceast metod, pe ecran este afiat aceeai informaie ca n panoul Locals, ns ntr-un format puin diferit. n plus, avei posibilitatea de a aduga acest element de urmrire n lista Watch. Vom arta imediat cum se procedeaz, ns deocamdat, executai clic pe butonul Cancel i ieii din fereastr.
8.

Folosii butonul Step Into pentru a trece la procedura GetWhiskies i executai clic pe Debug Window pentru a duce aceast fereastr n prim plan.

Observai c variabilele pentru procedura GetWhiskies sunt afiate acum n fereastra Locals. Argumentele au valori, ns nu i variabilele locale, pentru c nu leam configurat nc.
9.

Acum este momentul s analizm stiva de proceduri, aa nct executai clic pe butonul Calls pentru a vedea unde ne aflm.

n fereastr putei vedea ordinea n care ai executat procedurile. Procedura curent (activ) este afiat n fruntea listei, iar procedura pe care ai apelat-o apare imediat dedesubt. Prima procedur este la sfritul listei. Chiar i din acest exemplu simplu, v putei da seama ce se ntmpl n cazul programelor mari. 10. S spunem c dorii s executai codul pas cu pas, pn la linia care citete urmtoarea nregistrare din setul de nregistrri. Plasai cursorul pe linia recR.MoveNext

Pag. 230

i alegei Run To Cursor din meniul Debug. Execuia continu pn la linia selectat. Acum suntei n etapa n care ai completat deja un element al matricei, iar execuia s-a oprit pe linia selectat de dumneavoastr; trecei n fereastra de depanare. n primul rnd, expandai variabila recR pentru a vedea setul de nregistrri: Remarcai c sunt disponibile toate proprietile pentru seturi de nregistrri. Unele nu au valori sau nu pot fi aplicate n cazul acestui tip de set de nregistrri, ns toate au fost afiate instantaneu. Derulai coninutul ferestrei. Vei vedea coleciile setului de nregistrri. Observai c acest set de nregistrri conine ase cmpuri care pot fi expandate pentru a analiza detaliile corespunztoare fiecruia. Vei avea posibilitatea s examinai aceste detalii mai trziu; deocamdat, s continum exerciiul.
11.

Derulai fereastra pn n partea superioar i expandai Chapter 11 Debugging, apoi mastrWhiskies:

Fiind prima iniializare a datelor, a fost creat numai primul membru al matricei, iar cele trei elemente ale acestuia conin valorile corecte. Este mult mai simplu dect prin vechea metod, care presupunea introducerea fiecrui element n fereastra de depanare pentru a-i vedea coninutul.
12.

Plasai cursorul pe linia recR.Close i selectai opiunea Run To Cursor. Execuia codului va continua pn la linia solicitat. Metoda este util mai ales la depanarea unui cod cu structuri ciclice, cnd putei s plasai cursorul pe instruciunea de dup bucl i apoi s srii peste bucla respectiv fr s mai stabilii un punct de ntrerupere. Executai de dou ori clic pe butonul Step Into pentru a reveni la procedura DisplayWhisky, adic la funcia apelant. Parcurgei cteva instruciuni pn cnd ajungei la urmtoarea linie de cod din procedura GetWhiskies:

13.

.strName = recR("WhiskyName") Ai ajuns din nou la bucla n care este completat matricea global. Vrei s vedei numele de whisky fr ca acesta s fie tiprit n fereastra de depanare i fr s comutai panoul Locals - astfel c stabilii un element de urmrire (watch) pe aceast variabil pentru a o vedea permanent.
14.

Evideniai recR("WhiskyName") i executai clic pe butonul Quick Watch. Pe ecran este afiat fereastra Quick Watch, care conine variabila
Pag. 231

selectat i valoarea acesteia la momentul curent. Acum executai clic pe butonul Add. n urma acestei comenzi, trecei n panoul Watch Aici apar aceleai informaii ca n panoul Locals, ns numai pentru variabilele care v intereseaz. Dac avei variabile din mai multe proceduri, este afiat i contextul. n acest caz, contextul este pentru modulul curent. Poziionai ferestrele astfel nct s vedei att variabila urmrit ct i codul, apoi parcurgei pas cu pas programul pn ajungei la instruciunea recR.MoveNext. urmrii modificarea valorii variabilei n timpul execuiei. 16. Putei aduga i alte elemente de urmrire executnd clic cu butonul drept al mouse-ului n fereastra de urmrire i selectnd opiunea Add Watch Pe ecran apare urmtoarea caset de dialog:
15. 17.

Acum putei alege nu numai ceea ce dorii s urmrii, dar i modul n care se face urmrirea. Tipul de urmrire (Watch Type) al unei expresii de urmrire (Watch Expression) este similar cu cel ape care tocmai l-ai vzut: afieaz valoarea expresiei pe care o urmrii. Opiunea Break When Value Is True (Oprete execuia cnd valoarea este adevrat) va aduga o expresie de urmrire i va opri execuia programului atunci cnd valoarea expresiei este adevrat. Opiunea Break When Value Changes (Oprete execuia la modificarea valorii) va opri execuia programului atunci cnd valoarea expresiei se modific. Aceast metod poate fi foarte util dac avei o variabil global a crei valoare este modificat de o alt procedur, dar nu suntei sigur unde are loc modificarea. n acest caz, putei s stabilii un element de urmrire i s rulai programul n mod normal; la fiecare modificare a expresiei, execuia codului va fi oprit.

18.

Haidei s experimentm opiunea Break When Value Is True, pentru a opri execuia programului atunci cnd preul unei sticle de whisky depete 30 de lire.

Executai clic pe butonul OK i observai c elementul de urmrire a fost adugat n list: Valoarea curent este fals.
19.

Executai clic pe butonul Go/Continue i fereastra Watch va fi afiat n prim-plan, indicnd faptul c valoarea expresiei este acum adevrat (True):
Pag. 232

Programul i-a continuat execuia pn cnd a gsit un pre mai mare de 30 de lire. Corectitudinea opririi programului poate fi verificat n fereastra Locals sau n panoul Debug:
20.

S presupunem c preul nu este corect. Nu putei modifica valoarea n expresia recR("Price") fr a executa o instruciune recR.Edit sau recR.Update, ns putei schimba valoarea n matrice. Introducei noua valoare n panoul de depanare i apsai tasta Return:

Este o operaie similar cu configurarea unei variabile n cadrul codului.


21.

Acum acionai butonul Continue pentru a continua execuia, dar nu pas cu pas. Procedura va fi finalizat, iar detaliile corespunztoare vor fi afiate pe ecran. Dac derulai puin coninutul ferestrei, gsii sortimentul Glengoyne, vechi de 12 ani, adic valoarea pe care tocmai ai modificat-o.

Observai c noul panou Locals ofer un mar avantaj programatorului. n plus, este util ca instrument de instruire, pentru examinarea proprietilor obiectelor pe msur ce sunt folosite n program. Merit s facei un efort pentru a nva s l folosii, deoarece pe termen lung, vei economisi foarte mult timp. 11.7 Utilizarea sistemului de asisten (Help) Executarea programelor pas cu pas v poate ajuta s descoperii erorile, ns nu cazul s ncepei direct cu aceast metod. n primul rnd, ar trebui s consultai fiierul de asisten (Help), deoarece conine o list cu cele mai frecvente tipuri de erori i descrierea cauzelor care le-au generat. n general, casetele de dialog pentru mesajele de eroare, care apar suprtor de des n procesul de depanare a codului, include un buton Help. Dac poziionai cursorul pe un cuvnt cheie din fereastra de cod i apsai tasta F1, pe ecran este afiat textul de asisten contextual pentru cuvntul respectiv. De asemenea, putei selecta opiunea Contents and Index din meniul Help pentru a gsi informaii despre un anumit subiect - desigur, Access accept opiunea Answer Wizard (n acelai meniu), care v permite s introducei ntrebri ntre-un limbaj natural. n plus, putei folosi noul Office Assistant, care rspunde solicitrilor dumneavoastr:

Pag. 233

Executai clic pe butonul de cutare (Search), iar Clipit va afia pe ecran o list de subiecte:

Fig.11. 5
Pag. 234

Fiierul de asisten (Help) este cu adevrat util n situaiile n care mesajul de eroare returnat de sistem nu descrie cauza erorii. S lum 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 cmpul din dreapta al tabelului Bottling. ncercai s rulai procedura cu parametrul urmtor: Call ErrorHelp ("DistillationDate") i vei primi o list cu toate datele la care au fost distilate buturile. ncercai i cu parametrul urmtor: Call ErrorHelp ("DateDistilled")

Pag. 235

Vei primi acest mesaj de eroare:

Fig.11.6 Nu v spune prea mult, nu-i aa? Executai clic pe butonul Help i vei vedea pe ecran o fereastr de asisten cu un coninut mult mai edificator:

Fig.11.7

Al doilea paragraf este important, indicnd faptul c ncercai s selectai un nume de cmp necunoscut. Tratarea erorilor Acum, dup ce ai aflat cum putei s prevenii greelile i cum s le detectai pe cele care nu pot fi anticipate, trebuie s nvai cum s tratai erorile ntr-un mod ct mai elegant. Reinei c greelile i erorile sunt lucruri diferite. Un proiect bun, o testare i o depanare corespunztoare ar trebui s elimine toate greelile din codul dumneavoastr. ns acesta nu nseamn c nu vor aprea erori. De exemplu, s ne imaginm c programul pe care l-ai scris acceseaz un anumit fiier de pe disc - s presupunem c este vorba de un fiier legat. tii c n cod
Pag. 236

nu exist greeli, aa nct va accesa ntotdeauna corect fiierul respectiv i va prelucra datele fr nici o problem. ns erori pot aprea n continuare - dac cineva mut fiierul n alt locaie pe disc sau l terge, vei primi un mesaj de eroare. Exist situaii n care dorii s ignorai o anumit eroare sau s declanai o alt aciune dect cea prevzut de Access 97 pentru eroarea respectiv. n acest caz, este necesar s mpiedicai mediul Access s opreasc execuia codului i s afieze mesajul standard de eroare - trebuie s tratai personal erorile, pe msur ce apar. Erori n Visual Basic Probabil ai ntlnit secvene de cod pentru tratarea erorilor, n special dac ai folosit la crearea formularelor programul asistent (wizard) Command Button. Dac nu includei o rutin proprie de tratare a erorilor, Access folosete o rutin prestabilit, care afieaz un mesaj de eroare i oprete execuia codului. Prin introducerea instruciunii On Error, comunicai mediului Access c vei folosi o rutin proprie pentru afiarea erorilor. De exemplu, citii urmtoarea 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. Instruciunea On Error specific o etichet la care trece automat execuia codului n cazul apariiei unei erori. Etichetele sunt simple marcaje existente n cod i respect aceleai convenii de nume ca i variabilele, exceptnd faptul c la sfrit au semnul dou puncte (:). Prin convenie, pentru numele etichetelor de erori folosii numele procedurii, la care adugai _Err. Prin comanda Resume, comunicai mediului Access c tratarea erorilor s-a terminat i c ar trebui s continue execuia din rutina principal. Dup procesarea codului pentru rutina de eroare, efectuai una dintre aciunile urmtoare: ncercai din nou instruciunea care a produs eroarea, folosind comanda Resume. Aceasta comunic mediului Access c trebuie s revin la instruciunea care a cauzat eroarea i s o ruleze din nou. Folosii aceast metod numai dac suntei 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 dorete s repete o anumit aciune. Dac eroarea poate fi tratat fr oprirea execuiei, continuai cu linia urmtoare procedurii principale. n acest caz, folosii comanda Resume Next; procesarea rutinei continu de la linia care urmeaz celei n care a aprut eroarea. Aceast metod ar trebuie folosit numai dac eroarea nu va acuza probleme ulterioare n aplicaie. Dac procesarea rutinei nu mai poate continua, ieii din procedur. n acest caz, ar trebui s folosii comanda Resume ErrorHandling_Exit pentru a comunica rutinei s treac la eticheta de ieire. Dac eroarea a fost att de grav nct a oprit execuia ntregului program, ieii din program folosind comanda End. Acum putei s ncepei 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 numr i apoi se mparte valoarea 10 la numrul respectiv. ncercai singur - Crearea unei proceduri de tratare a erorilor
1.

Creai urmtoarea 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.

Rulai subrutina n fereastra de depanare. Procedura afieaz pe ecran un mesaj n care se cere introducerea unui numr. Apoi atribuie variabilei dblResult valoarea obinut mprind 10 la numrul introdus de utilizator i afieaz rezultatul. Introducei cteva numere pentru a testa subrutina.

Fig.11.9

Pag. 239

Fig.11.10
3.

Introducei cifra 0 - vei vedea mesajul de eroare Divide By Zero (mprire la zero). Apoi lsai caseta de intrare necompletat - va fi afiat mesajul de eroare Type mismatch.

Fig.11.11 Eroarea Type mismatch apare din cauz c este returnat un ir - funcia InputBox returneaz un ir vid (empty) dac nu introducei nici o valoare n caset. Cnd Access ncearc s mpart 10 la acest ir, realizeaz c tipurile de variabile sunt incompatibile. Avem nevoie de o rutin de tratare a erorii. 4. Modificai 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.Descrition & " - " & Err.Number Resume ErrorHandling_Exit End Sub

Pag. 240

ntr-un exerciiu anterior, am filtrat erorile cu ajutorul unor variabile booleene, ns nu am fcut deosebire ntre tipurile de erori, numindu-le pe toate erori semantice. Aceast rutin de tratare a erorilor afieaz mesajul de eroare i numrul erorii i apoi face saltul la instruciunea de ieire. n anumite circumstane, este o metod preferabil celei care afieaz mesajul de eroare prestabilit, pentru c v permite editarea textului mesajului. Acum, dorim s detectm dou erori distincte i s declanm n fiecare caz o aciune specific. Obiectul Err a fost introdus n Access 95. Dac dorii, putei continua s folosii Error$ i Err pentru descrierea i numrul erorii, ns noul obiect conine mai multe informaii i este mult mai clar. Ar fi bine s folosii obiectul Err n toate programele pe care le scriei de acum nainte. 5. Modificai din nou codul de tratare a erorilor, astfel nct s fie ceva mai "inteligent" dect nainte:
ErrorHandling_Err: Select Case Err.Number Case 13 ' Type mismatch - empty entry (Incompatibilitate - sir vid) Resume Case 11 ' Divide by zero (Impartire la zero) dblResult = 0 Resume Next Case Else MsgBox Err.Description & " - " & Err.Number Resume ErrorHandling_Exit End Select

6. ncercai s introducei 0 sau o liter i vedei ce se ntmpl. Dac dorii s ieii din aceast procedur, introducei un numr diferit de 0. Cum funcioneaz?
Pag. 241

n loc s lsai mediul Access s afieze meniul standard de eroare, putei s specificai mult mai clar aciunea care va avea loc. Select Case Err.Number Prima instruciune verific dac Err.Number conine numrul de eroare. Case 13 ' Type mismatch - empty entry (Incompatibilitate - sir vid) Resume Eroarea indic o nepotrivire a tipurilor de variabile: fie caseta de intrare a rmas necompletat, fie a fost introdus un ir de caractere ce nu reprezint un numr. n acest caz, caseta este afiat din nou pe ecran - instruciunea Resume cere revenirea la linia care a cauzat eroarea. Dac ncercai s apsai butonul Escape, v vei da seama c nu are nici un efect. Acelai lucru este valabil i pentru butonul Cancel din caseta de intrare. Funcia InputBox returneaz un ir vid dac nu se introduce nici o valoare, aa nct este generat aceeai eroare. Din acest motiv, nu se recomand s folosii rezultatele unei funcii cum este InputBox direct n expresii numerice, fr o verificare preliminar a coninutului acestora. 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, situaie n care putem ignora pur i simplu eroarea. Atribuii rezultatului valoarea 0 i introducei instruciunea Resume Next, care cere continuarea execuiei programului de la linia aflat imediat dup cea care a generat eroarea. Aceasta este linia ce conine MsgBox. Case Else MsgBox Err.Description & " - " & Err.Number Resume ErrorHandling_Exit Chiar dac nu ne ateptm s apar alte tipuri de erori, este bine s avem n vedere i tratarea acestora. n astfel de cazuri, pe ecran este afiat un mesaj i se iese din procedur. Adevrata problem din acest exemplu este faptul c va fi returnat valoarea 0 pentru o eroare de mprire la 0, fr a fi afiat un mesaj de eroare. Amintii-v c am menionat aceast problem ceva mai devreme n cadrul capitolului de fa. Ar trebui s modificai secvena de cod astfel nct toate erorile s fie returnate, sau mcar semnalate prin afiarea unor mesaje pe ecran,

Pag. 242

deoarece forma actual este evident greit i poate indica o eroare anterioar de program. Cu toate c este un exemplu foarte simplu, vei vedea ct de uor poate fi personalizat rutina de tratare a erorilor, conferindu-i un grad mai mare de flexibilitate. Utilizarea instruciunilor Exit Function i Exit Sub n rutinele de tratare a erorilor n rutinele de tratare a erorilor, putei include alte dou instruciuni Access Exit Function i Exit Sub. Acestea v permit s renunai la folosirea etichetelor, astfel c rutinele devin mai uor de citit i de depanat. De exemplu, am putea rescrie funcia 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.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.Description & " - " & Err.Number
Exit Sub

End Select End Sub Aceast metod permite i folosirea butonului Cancel, care, n versiunea anterioar a rutinei, nu a funcionat. Cnd este detectat numrul de eroare 13, folosim instruciunea Exit Sub pentru a determina ieirea din subrutin. Dei pare o procedur simpl, deoarece sunt mai puine etichete n cod, v recomand prima metod dintr-un motiv foarte important - exist un singur punct de ieire din
Pag. 243

procedur. Aceasta nseamn c putei introduce instruciuni de cod nainte de procedura de ieire, tiind sigur c acestea vor fi rulate, ceea ce nu se ntmpl n cazul inserrii instruciunilor Exit Sub n diverse poriuni ale codului. Erori n formulare i rapoarte n Access, exist erori care sunt asociate cu formularele - formularele au un eveniment Error asociat. n mod normal, acesta este gol (nu are cod scris) i, n cazul apariiei erorii este executat rutina prestabilit; ns, la fel ca n procedurile normale, putei aduga propria dumneavoastr secven de cod. Evenimentul de eroare preia dou argumente:

Fig.11.12 Primul argument, DataErr, reprezint numrul erorii i este folosit n acelai fel ca Err n exemplul anterior. Al doilea argument, Response, indic dac dorii sau nu ca mesajul de eroare prestabilit s fie afiat pe ecran. Dac atribuii acestui argument valoarea acDataErrContinue, Access va ignora eroarea i va continua execuia codului - ceea ce v permite s afiai pe ecran propriul dumneavoastr mesaj de eroare. Dac atribuii argumentului valoarea implicit, acDataErrDisplay, pe ecran este afiat mesajul prestabilit pentru eroarea respectiv. Haidei s vedem cum a fost implementat acest procedeu n baza de date i s schimbm mesajul afiat pe ecran la apariia unei anumite erori. Erori DAO Aa cum am artat n capitolele anterioare, colecia Errors (care a fost introdus n versiunea Access95) conine toate erorile referitoare la obiectele de acces la date. Dac bnuii c eroarea provine de la un obiect de acces la date, verificai mesajele de eroare din toat colecia, dar i obiectul eroare.

Pag. 244

Erori definite de utilizator S-au spus multe lucruri despre erorile din Access, ns putei defini propriile dumneavoastr erori. Este o metod foarte util, pentru c permite crearea unei erori specifice ntr-o procedur atunci cnd se ntmpl un anumit lucru, apoi o trateaz la fel ca pe erorile interne. De asemenea, permite declanarea rutinelor pentru erori prestabilite, chiar fr apariia efectiv a unei erori. Prin utilizarea metodei Raise a obiectului Err, sunt generate erori definite de utilizator. Obiectul va raporta eroarea n modul obinuit. Diferena este c dumneavoastr trebuie furnizai numrul de eroare. Acesta poate fi un numr de eroare standard din VBA, cum ar fi 13 pentru Type Mismatch (Incompatibilitatea tipurilor de date), sau un numr care nu face parte din gama celor utilizate n VBA. Numrul maxim este 65535, ns VBA nu folosete valori de peste 32000, ceea ce nseamn c avei de unde alege. ncercai singur - Definirea unor erori proprii
1.

Deschidei procedura ErrorHandling pe care ai analizat-o ceva mai devreme i modificai codul astfel:

Public Sub ErrorHandling() Dim dblResult As Double


Dim VarNumber As Variant On Error GoTo ErrorHandling_Err VarNumber = InputBox("Introducei un numr:") If Not IsNumeric(VarNumber) Then Err.Raise 32000 End If dblResult = 10 / VarNumber

MsgBox "rezultatul este " & str$(dblResult) ErrorHandling_Exit: Exit Sub ErrorHandling_Err: Select Case Err.Number Case 13 ' Type mismatch - empty entry Resume Case 11 ' Divide by zero
Pag. 245

dblResult = 0 Resume Next Case Else MsgBox Err.Description & " - " & Err.Number Resume ErrorHandling_Exit End Select End Sub Acum, dac valoarea de intrare nu este numeric, rutina de tratare a erorii este apelat cu numrul de eroare 32000. Pentru a preveni apariia unor conflicte cu mediul Access, folosii ntotdeauna n cod numere mai mari de 32000. 2. Modificai rutina de tratare a erorilor, adugnd o seciune suplimentar: Case 32000 MsgBox "Trebuie sa fie un numar" Resume ErrorHandling_Exit 3. Lansai n execuie procedura i introducei n caseta de intrare o liter. Noua rutin de tratare a erorilor proceseaz eroarea cu numrul 32000 la fel ca pe celelalte. Ca urmare, funcia va afia pe ecran propriul dumneavoastr mesaj. Dac nu tratai explicit erorile definite de utilizator i folosii o simpl caset de mesaj pentru a afia textul standard, vei obine mesajul de eroare Applicationdefined or object-defined error. MsgBox Err.Description & " - " & Err.Number De exemplu, n procedura anterioar ar fi afiat mesajul Application-defined or object-defined error - 32000. Stiva de erori Deoarece Access este un mediu dirijat de evenimente, proceseaz periodic mici secvene de cod care corespund evenimentelor. Pe msur ce este introdus fiecare procedur, rutina de tratare a erorilor este reiniializat i orice eroare este tratat independent. Access nu trebuie s pstreze o stiv de erori, rspunzndu-le pe msur ce apar. Dei acest mod de lucru este destul de simplu, trebuie s fii atent unde anume caut Access codul de tratare a erorilor.

Pag. 246

La apariia unei erori, Access parcurge n sens invers procedura activ curent n cutarea unei rutine de tratare a erorilor i o execut pe prima pe care o gsete. Dac nu gsete nici una, apeleaz rutina implicit de tratare a erorilor. De exemplu, s presupunem c avem trei proceduri: A, B i C. A apeleaz B i B, la rndul su apeleaz C. Dac C genereaz o eroare, Access va reveni la B i apoi la A n cutarea unei rutine de tratare a erorii. Dac nu gsete nimic n B sau A, apeleaz rutina prestabilit.

Reinei c acest mod de lucru nu afecteaz n nici un fel fluxul de control al programului n care procedura C este nc activ. Sgeile de revenire n procedurile apelante indic unde caut Access o rutin de tratare a erorii. S presupunem acum c v-ai hotrt s creai propria dumneavoastr rutin de tratare a erorii. Vei plasa cte o rutin n A, B i C sau v vei baza pe facilitatea de backtracking (revenire) i vei plasa rutina doar n procedura A? Dac avei de-a face cu erori similare, este foarte normal s creai o singur rutin i, datorit capacitii de backtracking, s o plasai la cel mai nalt nivel. De exemplu, putei avea urmtorul cod de tratare a erorilor doar n procedura A: A_Err: Select Case Err.Number
Case w ' Este periculos, 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, care va fi tratata de Access Err.Raise q

Pag. 247

End Select

Dei codul este foarte simplu, exist o problem serioas, care poate schimba fluxul programului. Nici Resume i nici Resume Next nu vor continua execuia cu procedura C, aa cum ai putea crede, cu linia curent din procedura care trateaz eroarea. Deci Resume va relua execuia de la linia care a apelat procedura B - aceasta este linia curent n procedura A. n mod similar, Resume Next va continua execuia cu linia care urmeaz dup apelul procedurii B. Observai c nici una dintre metode nu va returna execuia n procedura C. Haidei s examinm puin diagrama urmtoare pentru a vedea ce se ntmpl:

Diagrama ilustreaz riscul utilizrii unei singure rutine pentru tratarea erorilor. Totui, exist i situaii n care aceast metod este util - trebuie s cunoatei aceste aspecte i s facei o planificare (proiectare) corespunztoare. De exemplu, putei s
Pag. 248

plasai o rutin de plasare a erorilor n A i alta n C. Rutina din C trateaz erorile generate n procedura respectiv (C), permind continuarea execuiei programului n condiii normale, n timp ce rutina din A poate fi folosit pentru erorile din A i B. De asemenea, putei folosi instruciunea Err.Raise n procedura C pentru a fora Access s mute rutina de tratare a erorilor pe nivelul imediat superior. 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.Number Case 13 MsgBox "c: Error " & Err.Number & ": " & Err.Description Case Else Err.Raise Err.Number, "c", Err.Description End Select Resume c_Exit End Sub

Aceast procedur are o rutin care verific numrul erorii. Dac este vorba de eroarea 13 (Type Mismatch), mesajul de eroare este afiat aici, dar orice alt eroare este transmis napoi pe lanul de apeluri. Pentru aceasta se folosete metoda Raise obiectului Err, care are ca efect regenerarea erorii. Cele trei argumente sunt numrul de eroare, sursa (n acest caz, procedura "c") i descrierea. Codul propriu-zis este format doar din dou linii, ambele fiind generatoare de erori. Prima atribuie unei variabile ntregi o valoare foarte mare, care va acuza o depire (overflow) - nu este eroarea 13, deci vom genera eroarea din nou. A doua linie este eroarea 13, care poate fi tratat aici. Oricum, n acest exemplu ai putea comenta faptul c se atribuie o valoare mare variabilei nainte de generarea erorii, deoarece cele dou evenimente nu pot avea loc simultan. Haidei s vedem ce coninut ar avea o posibil procedur apelant:
Sub b() Dim intI As Integer Debug.Print "In b" Call c Debug.Print "In b: setting intI to 123456789" intI = 123456789 End Sub
Pag. 249

Aceast procedur nu conine dect apelul procedurii c i genereaz propria sa eroare - o depire. Deoarece nu are o rutin proprie de tratare a eroii, Access va cuta napoi n lanul de apeluri pentru a gsi o rutin corespunztoare; n exemplul nostru, aceast rutin se gsete n procedura a:
Sub a() On Error GoTo a_Err Debug.Print "In a" Call b Debug.Print "In a: 2 / 0 = " & 2 / 0 a_Exit: Exit Sub a_Err: MsgBox "a (" & Err.Source & "): Error " & Err.Number & ": " &_ Err.Description Resume a_Exit End Sub

Aceast procedur conine o rutin de tratare a erorilor, care afieaz sursa erorii, precum i numrul i descrierea acesteia. S facem o recapitulare a procedurilor: a apeleaz b, care apeleaz c. c are propria sa rutin de tratare a erorilor, dar se ocup doar de eroarea 13 - toate celelalte sunt retrimise procedurii b. b nu are o rutin proprie, deci transmite eroarea napoi la a. Rutina de tratare a erorilor din a afieaz pe ecran mesajul de eroare. Acest exemplu demonstreaz c putei trata anumite erori local, ns trebuie s avei i o procedur general, care s se ocupe de celelalte erori posibile. Proprietatea Source a obiectului Err v permite s identificai locul unde a fost generat eroarea.

Pag. 250

11.7 Depanarea codului de depanare Uneori, introducei n cod rutine de tratare a erorilor, dar chiar acestea sunt generatoare de erori. n astfel de cazuri, deschidei meniul Tools, alegei Options i apoi selectai panoul Advanced. n grupul Coding Options gsii opiunea Break on All Errors (Oprete execuia la orice eroare). Dac activai aceast opiune, Access va ignora rutinele de tratare a erorilor scrise de dumneavoastr i le va folosi ntotdeauna pe cele prestabilite. Astfel, putei s scriei rutinele de tratare a erorilor chiar la crearea aplicaiei, ns avei posibilitatea de a le dezactiva n etapa de depanare. Controlul de versiune Probabil v vei ntreba ce caut o seciune dedicat controlului de versiune ntr-o carte despre VBA, mai ales n seciunea referitoare la depanare i testare. Unii dintre dumneavoastr se vor ntreba ce este controlul de versiune. Pentru cei care nu tiu, controlul de versiune reprezint capacitatea de a marca aplicaiile modificate ca versiuni distincte. Astfel, avei posibilitatea de a pstra un istoric al modificrilor, fiecare cu un numr de versiune, de a analiza diferenele dintre versiunile succesive, i chiar de a anula modificrile. V vei ntreba la ce v folosesc toate acestea. Ei bine, acest control este foarte important. Ca dezvoltator de aplicaii, trebuie s efectuai deseori modificri n cod: corectarea unor erori de programare, mbuntiri, i chiar ncercri de genul "s vedem dac merge aa". n trecut, nu exista nici o posibilitate de identificare a modificrilor, n afar de comentarii, care nu ofer, totui, sigurana necesar. Dup apariia controlului de versiune, lucrurile au devenit mult mai simple. Poate c am exagerat puin, ns am vrut s v dai seama ce reprezint controlul de versiune i de ce vorbim despre el n prezentul capitol. Dac nu v-am convins nc, urmrii raionamentul urmtor. S ne imaginm o situaie de lucru obinuit. Ai realizat o aplicaie de baze de date care a fost bine primit de utilizatori. Totui, n cadrul procesului de modernizare, trebuie s mai parcurgei trei sau patru faze de lucru i s corectai erorile de programare. Cum procedai? Poate ar fi bine s facei cte o copie a bazei de date pentru fiecare faz n parte. Sau poate c trebuie s scriei codul cu funcionalitatea corect pentru fiecare faz. Ce facei cu erorile de programate? Cum separai o corectur de alta? i ce se va ntmpla dac implementai o corectur, dar apoi suntei nevoit s o tergei? V putei aminti cu exactitate ce ai modificat? Sunt locuri unde aceste evenimente au loc zilnic (nu numai n programare) i se aplic nu doar pentru departamentele IT, ci i pentru programatori individuali. Una dintre cele mai solicitate faciliti pentru noua versiune de Access a fost Version Control (controlul de versiune). Muli utilizatori au ateptat-o nc de la Access 95, ns nu au beneficiat de ea. Acum, n sfrit, aceast facilitate este disponibil.
Pag. 251

Haidei s aruncm o privire asupra noilor caracteristici de control de versiune din Access97 i s vedem cum v pot ajuta acestea n activitatea de programare.

Controlul de versiune n Access 97 Voi ncepe prin a spune c acest control de versiune nu este o caracteristic automat n Access, i nici o facilitate de care beneficiai gratuit. Pentru a putea folosi controlul de versiune, avei nevoie de produsele software Office Developer Edition Tools i Microsoft Visual SourceSafe. Visual SouceSafe este produsul care realizeaz efectiv controlul de versiune. A fost lansat pe pia de civa ani i este folosit n special de programatorii n Visual Basic. Office Developer Edition Tools v ofer, printre multe alte instrumente, programul de completare care conecteaz Access la Visual SourceSafe. Ambele produse sunt componente suplimentare, pe care trebuie s le cumprai, ns putei s le considerai o investiie. V vor ajuta s economisii mult timp. Garantat. Visual SourceSafe Visual SourceSafe efectueaz controlul de versiune pentru orice tip de fiier: fiiere Visual Basic, documente, fiiere binare etc. este un produs orientat pe proiect i permite organizarea i partajarea codului, ca i controlul asupra editrii. n figura urmtoare este prezentat ecranul principal: Prima observaie este asemnarea evident cu Windows Explorer. n panoul din stnga putei vedea o list de proiecte. $/ reprezint directorul rdcin, la fel ca C:\ pentru unitatea de disc. Sub directorul rdcin se afl o list de proiecte care, la rndul lor, conin subproiecte. Observai c aici apare cartea de fa, incluznd baza de date, documentele Word i imaginile grafice. Panoul din dreapta afieaz lista de fiiere asociate unui proiect, numele de utilizator i data ultimei modificri. Deci ce face Visual SourceSafe? Gndii-v la acest program ca la un bibliotecar. Putei s cutai crile pe care le are, s verificai dac numele dumneavoastr este scris pe ele, iar n cazul n care ai efectuat modificri, le putei anula. Observai n figura de mai sus c am gsit dou fiiere modificate. Fiecare modificare pe care o efectuai asupra unui fiier este adugat ca o versiune distinct. De exemplu, n figura anterioar exist trei versiuni ale fiierului ReadMe.txt. Putei vedea cine le-a cutat i cnd. Una dintre cele mai importante faciliti ale programului Visual SourceSafe este c v permite s vizualizai modificrile care au aprut de la o versiune la alta. Visual SourceSafe evideniaz liniile terse, liniile modificate i liniile nou introduse, astfel nct dumneavoastr putei vedea ce s-a modificat. Acest lucru este foarte util n situaiile n care nu v amintii exact ce ai modificat, sau dac lucrai n echip i dorii s vedei ce modificri au efectuat colegii dumneavoastr.
Pag. 252

Programul de completare Access SourceSafe Componenta Visual SourceSafe pentru Access este furnizat ca un program de completare, care este adugat la meniul Tools. Cnd adugai o baz de date n Visual SourceSafe, fiecare element al acesteia este blocat, nepermind nici o modificare. n imaginea alturat, putei vedea cum s-a modificat pictograma, indicnd faptul c elementul este blocat. Pentru a anula blocarea unui fiier, apsai butonul drept al mouse-ului i selectai opiunea Check Out din meniu. n acest fel, vei introduce n baza de date o copie editabil a obiectului. Din nou, pictograma asociat obiectului se modific, astfel nct s putei vedea starea n care se gsete acesta. Acum putei edita obiectul i, dup ce ai terminat, marcai-l din nou, tiind sigur c tot ce ai modificat se pstreaz separat de orice alt modificare. De asemenea, putei folosi Visual SourceSafe pentru a introduce observaii referitoare la versiune i o list de modificri. Cu aceasta, am ncheiat scruta prezentare a produsului Visual SourceSafe i a modului n care poate fi folosit n Access; dei nu este o component standard, merit s o achiziionai. Odat, am pierdut trei zile cutnd o greeal de programare ntr-un proiect de dimensiuni mari. Dac a fi avut la dispoziie controlul de versiune, probabil c a fi descoperit eroarea n cteva ore. Posibilitatea de a controla modificrile reprezint o latur important a dezvoltrii de aplicaii, aa nct lsai puin cartea i mergei repede s cumprai produsul prezentat. 11.9 Rezumat Chiar dac ai citi printre rnduri, v-ai dat seama c acest capitol se refer la planificare. Detectarea i rezolvarea problemelor software consum multe resurse, dar printr-un mic efort de planificare, putei economisi mult timp. La fel de important ca planificarea aplicaiei este i anticiparea cerinelor i nevoilor utilizatorului. ncercai s v punei n locul acestuia, s v imaginai ce va face, astfel nct s construii un program ct mai simplu de utilizat. Nu ar trebui s punei niciodat un utilizator n situaia de a primi un mesaj de eroare care i creeaz impresia c a greit ceva, deoarece poate deveni reticent fa de software, ajungnd chiar s refuze utilizarea programului. Alan Cooper, inventatorul limbajului Visual Basic, spunea: "Petrecem atta timp lucrnd cu calculatoarele, nct nu ne dm
Pag. 253

seama c, dei este plcut s umilim un calculator, nu ne putem permite s umilim un utilizator". n acest capitol au fost prezentate urmtoarele subiecte: Modul de proiectare a aplicaiei n scopul reducerii la minimum a numrului de erori Tehnici orientate pe obiect care pot fi folosite pentru prevenirea erorilor Testele pe care ar trebui s le efectuai pentru orice aplicaie nou Tipurile de erori i modul de corectare acestora Depanarea codului prin execuie pas cu pas, folosind punctele de ntrerupere i elementele de urmrire Scrierea propriilor rutine de tratare a erorilor Controlul de versiune Prin prevenirea i detectarea erorilor, vei mbunti cu siguran performanele oricrui program pe care l scriei. Putei atinge nivelul de aplicaie fr erori. Acest proces este cunoscut sub numele de optimizare i l vom prezenta n capitolul urmtor.

Pag. 254

CAP: 12.OPTIMIZAREA BAZEI DE DATE Chambers 20th Century English Dictionary definete optimizarea ca fiind: Pregtirea sau revizuirea unui sistem sau program de calculator n vederea obinerii eficienei maxime. Vom analiza diferite metode prin care un programator se poate asigura c aplicaia de baze de date funcioneaz cu eficien maxim. Vor fi prezente urmtoarele subiecte specifice: Eficiena unei secvene de cod Cum se msoar viteza unui program? Cteva sugestii de scriere a codului pentru a crea programe mai rapide Ce trebuie s avem n vedere cnd scriem aplicaii de reea? 12.1 Eficiena Instrumentul Performance Analyzer (care poate fi activat din bara de meniuri, executnd clic pe Tools/Analyze i selectnd opiunea Performance) este foarte util n cazul aplicaiilor de baze de date cu performane sczute. Totui, Performance Analyzer nu v ajut s rezolvai toate problemele, una dintre acestea fiind optimizarea codului VBA. Dac scopul nostru este s obinem o eficien maxim, se pune ntrebarea: "Prin ce se caracterizeaz eficiena?". Este o ntrebare mult mi complex dect pare la prima vedere. Iat care sunt cele mai importante criterii de evaluare a eficienei unei aplicaii de baze de date: Viteza real de execuie Viteza aparent Amprenta de memorie (adic dimensiunea) Traficul de reea Aproape ntotdeauna este posibil s optimizai o aplicaie potrivit unuia dintre aceste criterii de evaluare a performanelor, ns cum procedai pentru ca aplicaia s le respecte pe toate patru? Rspunsul este simplu: nu putei face acest lucru i nici nu ar trebui s ncercai.
Pag. 255

Una dintre sarcinile pe care le avei de rezolvat cnd ncepei un proiect de dezvoltare este s stabilii o list de prioriti. Care dintre cei patru factori menionai anterior sunt cei mai importani pentru implementarea cu succes a aplicaiei? Care sunt de dorit i care sunt lipsii de relevan? La criteriile de performan prezentate anterior putei aduga nc patru: Protabilitatea Robusteea Mentenabilitatea Refolosirea Nici unul dintre aceti factori nu conduc neaprat la creterea eficienei aplicaiei - optimizarea unei secvene de cod potrivit criteriilor de portabilitate sau robustee va determina micorarea vitezei de execuie a programului sau un consum mai mare de memorie. De fapt, aceti opt factori acioneaz n direcii diferite. S considerm urmtoarele secvene 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 acelai rezultat. Totui, primul dintre ele are un timp de execuie de patru ori mai mare dect al doilea. Dac optimizai codul n privina vitezei, ar trebui s alegei o a doua variant. Pe de alt parte, s-ar putea ca muli programatori, n special cei fr experien, s opteze pentru primul exemplu. Dac optimizai mentenabilitatea, alegei aceast variant (n special dac, pe un calculator obinuit, ambele secvene de cod sunt executate ntr-o fraciune de secund). n capitolul de fa, nu vei afla metoda optim de scriere a unui program. Aceasta va depinde de prioritile determinate pentru fiecare aplicaie n parte. n schimb, vom prezenta impactul fiecruia din cei patru factori de optimizare menionai anterior. 12.2 Reducerea suprancrcrii memoriei

Pag. 256

Un calculator desktop modern care ruleaz Access 97 are, de obicei, ntre 16 i 64 M de memorie (RAM). n acest spaiu de memorie este executat codul aplicaiei dumneavoastr. Cu ct calculatorul are mai mult memorie, cu att scade frecvena de citire i de scriere pe disc (procese relativ lente) i, ca urmare, programul are o vitez mai mare de execuie. Ca regul general, mai mult memorie nseamn performane mai bune. n trecut, calculatoarele erau limitate la 32 sau 64 kilooctei de memorie. Pentru a face o comparaie, aceasta reprezint de aproximativ 2000 de ori mai puin dect memoria calculatorului pe care l folosesc eu pentru a scrie acest capitol. n acele timpuri, chiar dac nu ai fi avut un sistem de operare sau un program capabil s foloseasc 96 M de RAM - ceea ce depete cu mult capacitatea calculatoarelor mainframe - costul memoriei ar fi reprezentat o avere. De aceea, nu este surprinztor faptul c, avnd la dispoziie o cantitate de memorie limitat, programatorii consumau foarte mult timp pentru a face ca aplicaiile s ncap (i s lucreze) pe minusculele resurse ale calculatoarelor lor. Sintagma la mod era "programare disciplinat"; limbajul folosit de obicei era limbajul de asamblare sau codul main (aproape ilizibil pentru un nespecialist), iar rezultatele obinute constituiau o dovad de ingeniozitate i de perseveren. Astzi, aceste probleme au disprut. Dac un program este prea lent, nu avei dect s adugai 16 M de RAM pe calculator! Preurile sunt modice. Oricum, ar costa mult mai mult s rescriei codul programului astfel nct 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 construii aplicaii dezordonate. Memoria, dei relativ ieftin, este preioas. Cu ct consum mai puin memorie, programul este mai rapid i permite execuia simultan a altor programe. n plus, dac scriei o aplicaie care va fi folosit de o mie de utilizatori, fiecare megaoctet suplimentar de memorie necesar aplicaiei echivaleaz cu 1000 M de memorie pe toate calculatoarele pe care va rula programul. Cu alte cuvinte, pentru majoritatea proiectelor, scrierea unei aplicaii cu o amprent mic de memorie constituie n continuare o prioritate esenial n programare. Ca urmare, la dezvoltarea unei aplicaii, ar trebui s inei cont de urmtoarele recomandri: Alegei corect tipurile de date. Grupai procedurile pe module. Eliminai comentariile i secvenele de cod inutile. Eliberai memoria ori de cte ori este posibil. Nu ncrcai n memorie module / biblioteci care nu sunt necesare. Salvai baza de date ca fiier MDE.

Pag. 257

12.2.1 Alegerea corect a tipurilor de date Diverse tipuri de date ocup spaii diferite de memorie. Dimensiunile spaiului de memorie ocupat de fiecare tip de date sunt prezentate n tabelul urmtor: Tipul de date Dimensiunea de Domeniul de valori stocare Byte (Octet) 1 octet 0 pn la 255 Boolean 2 octei True sau False Integer (ntregi) 2 octei -32.768 pn la 32.767 Long (Lungi) 4 octei -2.147.483.648 pn la 2.147.483.647 Single (Simple) 4 octei -3,403E38 pn la -1,401E-45; 0; 1,401E-45 pn la 3,403E38 Double (Duble) 8 octei -1,798E308 pn la -4,941E-324; 0; 4,941E-324 pn la 1,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 octei -922.337.203.685.477,5808 la 922.337.203.685.477,5807 14 octei -7,923E28 pn la 7,923E28 (variaz n funcie de numrul de zecimale din numr) 8 octei Ianuarie 1, 10 pn la Decembrie 31, 9999 4 octei O referin la orice tip de obiect 1 octet pentru Pn la aproximativ 65.400 caractere fiecare caracter 10 octei + Pn la aproximativ 2 miliarde de lungimea irului caractere 16 octei Acelai domeniu ca pentru variabilele de tip Double 22 octei + Acelai domeniu ca pentru irurile de lungimea irului lungime variabil

Aa cum putei vedea, variabilele de tip Double ocup de patru ori mai mult memorie dect variabilele de tip ntreg. ns, i aici, optimizarea este o chestiune de compromis - variabilele duble i simple pot pstra valori dintr-un domeniu mult mai mare dect variabilele ntregi. Problema utilizrii memoriei devine i mai important cnd se lucreaz cu matrice. Linia de cod: ReDim adb1 (9, 9) As Double ocup aproximativ 800 de octei de memorie, n timp ce linia urmtoare ocup n jur de 200 de octei: ReDim aint (9, 9) As Integer
Pag. 258

Ca regul general, dac dimensiunea amprentei de memorie este o prioritate de programare - i de obicei este - alegei cele mai mici variabile care pot memora valorile respective. Pentru a nu uita s atribuii explicit tipuri de variabile, ar trebui s selectai opiunea Require Variable Declaration din caseta de dialog Tools/Option Am mai spus acest lucru - dar merit s l repetm - folosii cu pruden tipul de date Variant. 12.2.2 Gruparea procedurilor n module VBA ncarc modulele numai cnd este apelat o procedur din modulul respectiv. Acest procedeu se numete ncrcare la cerere. Rin urmare, dac avei o rutin care apeleaz trei proceduri acestea se gsesc n module separate, n memorie vor fi ncrcate toate cele trei module. Prin gruparea judicioas a procedurilor cu funii nrudite n acelai modul, putei reduce la minimum numrul de module ncrcate simultan n memorie. 12.2.3 Eliminarea comentariilor i secvenelor de cod inutile Aa cum am artat, este bine s comentai codul pe care l scriei. Chiar dac nelegei instruciunile n momentul n care le scriei, s-ar putea ca peste ase luni s nu v mai amintii rolul fiecreia. n plus, comentarea liniilor de cod ajut la nelegerea acestuia de ctre alte persoane. Inserarea comentariilor n momentul scrierii codului nu necesit prea mult timp, ns v poate scuti de un efort mult mai mare n viitor (de exemplu, n cazul depanrii). Desigur, i comentariile au preul lor. Fiecare comentariu inserat n cod este ncrcat n memorie mpreun cu procedura la care se refer. Pentru a evita suprancrcarea memoriei de ctre aplicaia dumneavoastr, putei lua n considerare i varianta copierii fiierului cu baza de date original i eliminrii tuturor comentariilor din copia destinat clienilor. Astfel, vei obine o versiune de dimensiuni reduse pe care o putei folosi i distribui utilizatorilor, i o versiune comentat, cu care putei lucra atunci cnd suntei nevoit s modificai ceva n aplicaie. O soluie i mai bun o constituie salvarea bazei de date n format MDE. Acest proces asigur eliminarea tuturor comentariilor din cod i compilarea automat a acestuia. Fiierele MDE vor fi prezentate n Capitolul 18. Oricum, nu justificai lipsa comentariilor din cod prin argumentul: "Nu este suficient memorie" atunci cnd adevratul motiv este c nu avei chef s le introducei. Lsai lenea la o parte! Acelai principiu se aplic i n cazul procedurilor nefolosite, sau aa-numitul "cod mort". Procesul de dezvoltare a aplicaiilor presupune o mulime de experimente i, uneori, v vei da seama c programul este plin de proceduri inutile sau de proceduri pe care le-ai pstrat pentru orice eventualitate. tergei i aceste poriuni de cod din versiunea de aplicaie care va fi distribuit clienilor.

Pag. 259

12.2.4. Eliberarea memoriei ori de cte ori este posibil Pentru a elibera memoria folosit de o matrice dinamic, putei folosi instruciunea Erase. Dup terminarea lucrului cu matricea, instruciunea Erase va elimina datele din matrice i va elibera memoria folosit de aceasta. Instruciunea Erase nu elibereaz spaiul folosit de matricele statice (cum sunt cele de dimensiune fix). n schimb, le reiniializeaz. Putei elibera i memoria folosit de variabilele obiect de care nu mai avei nevoie. Aceast operaie se realizeaz prin configurarea tuturor variabilelor la o valoarea special, numit Nothing. Set objExcel = Nothing

Reinei c memoria folosit de un obiect nu poate fi eliberat dac mai exist o referin la obiectul respectiv n cod. ntr-un exemplu din capitolul precedent, am folosit aceast proprietate pentru a mpiedica distrugerea unei instane a unui formular pop-up, prin plasarea unei referine la acesta n colecia declarat la nivelul modulului unui alt formular. Referina respectiv a mpiedicat distrugerea primului formular nainte de nchiderea celui de-al doilea i de ieirea coleciei din domeniu. 12.2.5 Nu ncrcai n memorie module / biblioteci care nu sunt necesare Vom vedea n capitolul urmtor c bazele de date biblioteci pot reprezenta o soluie util pentru stocarea i refolosirea procedurilor de care avei nevoie frecvent. Aceste biblioteci pot fi folosite i pentru a pstra aplicaii wizard i programe de completare, cum ar fi aplicaiile wizard de control i de proiectare a formularului, care sunt distribuite mpreun cu produsul Access. Fiecare dintre aceste baze de date biblioteci trebuie s fie ncrcat n memorie atunci cnd este folosit, ceea ce mrete substanial spaiul necesar de memorie. Ca urmare, pentru a reduce cantitatea de memorie necesar instalrii aplicaiei, ar trebui s nu ncrcai bazele de date biblioteci sau programele de completare care nu sunt absolut necesare. 12.2.6 Salvarea bazei de date ca fiier MDE Ctre sfritul cursului, vom analiza ultimele retuuri pe care ar trebui s le efectuai asupra aplicaiei nainte de a o distribui utilizatorilor finali ai bazei de date. Unul dintre acestea const n conversia bazei de date ntr-un fiier MDE. Prin operaia de conversie, se compileaz toate modulele din baza de date i se elimin comentariile, instruciunile inutile etc. din codul surs. Rezult dou avantaje majore: crete sigurana bazei de date i scade cantitatea de memorie necesar pentru rularea aplicaiei. Reinei faptul c nu putei modifica formatul fiierelor MDE i c este bine s pstrai ntotdeauna o versiune original a bazei de date n format MDB.
Pag. 260

12.2.7 O ultim recomandare - cumprai mai mult memorie Nu este nici o pcleal! Pentru a rula, Access 97 are nevoie de minimum 12 M de RAM ntr-un sistem Windows 95 i de 16 M de RAM pe o staie de lucru Windows NT. Am fcut experimente pe sisteme cu 12 M, 16 M, 24 M i 32 M i pot s afirm c pentru a obine performane acceptabile, limita inferioar de memorie este de 16 M pentru rularea independent sub Windows 95 i de 24 M pentru Windows NT. Dac lucrai ntr-o reea sau dac folosii i alte aplicaii Windows simultan, v vei da seama c merit s cheltuii nite bani pentru a suplimenta memoria cu 8 M de RAM (n ambele cazuri).

12.3 Creterea vitezei de execuie Reducerea cantitii de memorie ocupat de baza de date Access i codul acesteia poate avea ca rezultat creterea vitezei de lucru, att a aplicaiei dumneavoastr, ct i a altor aplicaii Windows. Dac viteza de execuie este o prioritate de programare, exist i alte metode pe care putei s le luai n considerare: Folosii constante Folosii tipuri specifice de obiecte (asociere iniial) Folosii tranzacii acolo unde este cazul Folosii variabile, i nu proprieti Evitai structurile lente Folosii funcii ir

Evitai instruciunea IIf

Folosii operaii aritmetice cu ntregi ori de cte ori este posibil Folosii cod in-line

Folosii judicios instruciunea DoEvents Folosii cicluri For Each Folosii metoda Requery, nu aciunea Requery Folosii cuvntul cheie Me

Creai formularele pe baza unor interogri salvate


Pag. 261

Cretei viteza operaiilor cu baza de date Vom analiza n detaliu aceste procedee i vom prezenta cteva secvene de cod demonstrative. Exemplele de cod v vor ajuta s evaluai impactul acestor tehnici de lucru (asupra performanei). Calculatoarele difer foarte mult n privina dimensiunii memoriei RAM, a vitezei procesorului, a dimensiunii memoriei cache, a vitezei discului etc. Aceste diferene se reflect n performanele codului VBA rulat pe fiecare main n parte. Nu m credei pe cuvnt; parcurgei singur toate aceste exemple. Analiznd rezultatele de mai jos, s-ar putea s v ntrebai dac are rost s v pierdei vremea pentru a implementa unele dintre aceste mbuntiri. Dac o operaie nu dureaz dect trei milisecunde, de ce v-ai strdui s optimizai codul pentru ca durata operaiei respective s se reduc la o milisecund? Cine va observa acest lucru? Ei bine, trebuie s spunem c, dei s-ar putea ca diferena s nu fie sesizabil pentru o singur linie de cod, n cazul executrii repetate a codului, diferena devine evident. De exemplu, s presupunem c parcurgei ciclic toate controalele unui formular pentru verificarea unei anumite condiii; sau s parcurgei ciclic toate nregistrrile dintr-un set de nregistrri. Obinuii-v s scriei ntotdeauna un cod eficient - astfel, vei putea depi fr nici o problem i situaiile n care acest aspect este cu adevrat important.

12.3.1 Cronometrarea execuiei codului Pentru a testa viteza de execuie a unei secvene de cod, exist mai multe opiuni disponibile. O metod foarte simpl este folosirea funciei Timer. De exemplu, am putea utiliza secvena urmtoare de cod pentru a afla ct dureaz parcurgerea unei structuri ciclice For...Next...pentru 32.000 de valori.
Option Compare Database Option Explicit Dim lngStart As Long Dim lngEnd As Long Sub ShowTime() MsgBox lngEnd - 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. 262

Funcia Timer returneaz numrul de secunde care s-au scurs de la miezul nopii (de la ora 0). n exemplul de mai sus, am salvat valoarea funciei Timer n variabila lngStart nainte de nceperea ciclului de instruciuni: lngStart = Timer Dup terminarea ciclului, am salvat valoarea funciei Timer n variabila lngEnd: lngEnd = Timer Prin scderea primei valori din a doua, putem determina durata procesului de ciclare: MsgBox lngEnd - lndStart & " secunde" n cazul n care ncercai singur acest exemplu, vei observa repede o limitare evident. Deoarece funcia Timer face rotunjirea la nivel de secund, pe ecran va aprea, probabil, urmtoarea caset de mesaj la rularea codului.

Fig.12.1
Pag. 263

Deci exemplul nu este relevant dac testai un cod a crui execuie dureaz mai puin de o secund! . Adugai nc trei de zero la 32000 si s rulm codul .

Fig.12.2 O alt soluie este s apelai pentru cronometrare o funcie API. Biblioteca winmm.dll conine o funcie numit timeGetTime, care returneaz numrul de milisecunde trecute de la pornirea sistemului Windows. Am vzut aceast funcie la lucru n capitolul dedicat tehnicilor de programare avansat. Funcia returneaz o valoare cu precizia de o milisecund (1/1000 dintr-o secund), fiind mult mai adecvat pentru cronometrarea execuiei unei secvene de cod. n plus, este uor de implementat. Urmtorul exemplu de convenii de denumire v arat cum putei declara i folosi funcia pentru a determina durata de execuie a aceluiai cod: Option Compare Database Option Explicit
Declare Function TimeIt Lib "winmm.dll" Alias "timeGetTime" ()_ As Long

Dim lngStart As Long Dim lngEnd As Long Sub ShowTime() End Sub
Function UseTimeIt() MsgBox (lngEnd - lngStart) & " milisecunde"

Dim i As Integer
lngStart = TimeIt

For i = 0 to 32000 Next i


lngEnd = TimeIt

ShowTime
Pag. 264

End Function Modificarea semnificativ este adugarea declaraiei funciei timeGetTime, ceea ce permite apelarea acesteia direct din Access ca funcie TimeIt: Declare Function TimeIt Lib "winmm.dll" Alias "timeGetTime" ()_ As Long De data aceasta, rezultatul va fi ceva mai clar: 20 miliseconds. 12.3.2 Folosirea constante Dac folosii n cod valori care nu se modific, ar trebui s le atribuii unor constante, nu unor variabile. Cnd ntlnete o variabil ntr-o linie de cod VBA, Access trebuie s acceseze locaia de memorie care conine variabila pentru a determina valoarea acesteia. Pe de alt parte, valoarea unei constate este determinat i trecut n cod n etapa de compilare. Astfel, citirea valorilor din constante dureaz mult mai puin dect a celor din variabile: Procedura VarsAndConstants (Partea 1) VarsAndConstants (Partea 2) Comentarii Utiliznd variabile locale Utiliznd constante locale Numr de Rezultate (ms) iteraii Total Pe iteraie 100000 67,8 0,0007 100000 50,0 0,0005

12.3.3 Folosii tipuri specifice de obiecte (asociere iniial) n versiunile anterioare de Access, puteai ntlni frecvent linii de cod ca acestea: Dim frm As Object Set frm = Forms!frmSwtchboard Dei codul poate fi executat, nu este eficient. Datorit faptului c variabila obiect frm a fost declarat As Object, Access nu tie cu ce tip de obiect are de-a face. Aceasta nseamn c ori de cte ori ncercm s inspectm sau s configurm valoarea unei proprieti, ori s apelm n timpul execuiei o metod a acelui obiect, Access trebuie s verifice mai nti dac proprietatea sau metoda respectiv corespund obiectului. Aceast tehnic este cunoscut sub numele de asociere ulterioar. O metod mai bun de scriere a acestui cod este:
Pag. 265

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 proprieti i metode corespund obiectului. Aceast tehnic este numit asociere iniial. Deoarece Access trebuie s fac verificarea o singur dat, nainte de rulare, diferena dintre vitezele de execuie ale secvenelor de cod prin cele dou metode poate fi semnificativ. Un alt avantaj al tehnicii de asociere iniial este faptul c Access poate determina nc din faza de compilare ce proprieti i metode corespund obiectului. Orice eroare cauzat de scrierea greit a unor nume de proprieti sau metode este detectat n etapa de compilare i nu apare ca eroare de execuie.

Procedura SpecificObjects (Partea 1) SpecificObjects (Partea 2)

Comentarii Utiliznd sintaxa As Object Utiliznd variabile obiect specifice

Numr de Rezultate (ms) iteraii Total Pe iteraie 100000 35796,5 0,3580 100000 7507,1 0,0751

12.3.4 Folosii variabile, nu proprieti Putei obine performane similare folosind variabile pentru a face referire la formulare, controale i proprieti. Dac urmeaz s includei ntr-o procedur mai multe referine la un formular, raport sau control, este indicat s creai pentru obiectul respectiv o variabil obiect i apoi s facei 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 dect codul care folosete sintaxa lung.
sTemp1 = Forms!frmSwitchboard!imgLogo.Picture sTemp2 = Forms!frmSwitchboard!imgLogo.PictureAlignment sTemp3 = Forms!frmSwitchboard!imgLogo.SizeMode

n aceast situaie, sintaxa WithEnd With este rulat mai ncet dect prima metod, care folosete variabile obiect. Aceasta se datoreaz suprancrcrii pe care o presupune configurarea structurii With. Totui, dac vei aduga ntre instruciunile With i End With din ce n ce mai multe referine la obiectul specificat, aceast structur poate deveni mai eficient. 12.3.5 Folosii funcii ir Utilizarea funciilor ir este un alt domeniu n care se poate manifesta imprecizia. Majoritatea funciilor ir au versiuni de tip Variant. De exemplu, funcia Format returneaz pentru un anumit format o valoare Variant. varTemp = Format ("abcdef", ">") Pe de alt parte, funcia Format$ returneaz un ir formatat. strTemp = Format$ ("abcdef", ">") De fapt, orice funcie care are ca sufix caracterul $ returneaz o valoare String. Dac formatai o variabil sau un grup de caractere ce vor fi atribuite unei variabile ir, vei obine rezultate mai bune folosind versiunea ir a funciei (n loc de versiunea Variant). Procedura StringFunctions (Partea 1) StringFunctions (Partea 2) Comentarii Utiliznd funcia Format Utiliznd funcia Format$ Numr de Rezultate (ms) iteraii Total Pe iteraie 100000 7141,3 0,0714 100000 6749,9 0,0675

Pag. 267

12.3.6 Evitai folosirea structurilor lente O alt modalitate de a mri viteza de execuie a codului VBA este evitarea structurilor lente. Ce nseamn aceasta? Majoritatea limbajelor ofer programatorului mai multe metode de a efectua o anumit operaie. Dac viteza real de execuie este o prioritate de programare, ar trebui s testai viteza obinut prin aplicarea fiecreia dintre aceste metode i s o alegei pe cea corespunztoare (adic pe cea mai rapid). n practic s-ar putea s v dai seama c metoda cea mai rapid intr n conflict cu o alt prioritate de programare, aa nct trebuie s recurgei la un compromis. Chiar i ntr-o astfel de situaie, cronometrarea secvenelor de cod este util, pentru c vei putea folosi informaiile obinute n proiectele viitoare. 12.3.7 Funcia Immediate If (IIf) Funcia Immediate If (IIf) este considerat, de obicei, o metod rapid i simpl de a returna una din dou valori, ca urmare a evalurii unei expresii ca adevrat sau fals. value = IIf (Expression, TruePart, FalsePart) Dac Expression are valoarea True, se returneaz TruePart, iar dac Expression este False, se returneaz FalsePart. Instruciunea este echivalent cu secvena de cod urmtoare: If Expression Then value = TruePart Else value = FalsePart End If Principala diferen ntre cele dou formate este c funcia IIf va evalua ntotdeauna att TruePart, ct i FalsePart, n timp ce structura If normal va evalua doar partea care este returnat. Pentru a vedea ce implicaii au aceste metode, s lum n considerare urmtoarele secvene 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 acelai lucru: evalueaz variabila lngNumber. Dac aceasta are valoare 5, procedura atribuie variabilei lngRetVal valoarea 10. Altfel, procedura atribuie variabilei lngRetVal o valoare cutat n tabelul Order. Deosebirea dintre proceduri este c a doua va cuta 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 Numr de Rezultate (ms) iteraii Total Pe iteraie 100 4918,5 49,185 100 100 100 1,0 4634,3 4596,4 0,01 46,343 45,9638

12.3.8.Folosii operaii aritmetice cu ntregi ori de cte ori este posibil Viteza cu care se efectueaz operaiile aritmetice depinde de tipul de date al variabilelor folosite n calcul i de tipul operaiei efectuate. n general, calculele cu variabile Integer i Long sunt mai rapide dect cele cu variabile Single i Double. Acestea, la rndul lor, sunt mai rapide dect calculele cu variabile Currency. Majoritatea operaiilor cu variabile de tip Variant dureaz de dou ori mai mult dect cele n care sunt folosite alte tipuri de variabile. Cu toate c timpii de execuie pentru o singur operaie difer foarte puin, n cazul operaiilor repetitive (cum ar fi n ciclurile de mari dimensiuni), diferena devine semnificativ. 12.3.9 Folosii cod in-line Ceva mai devreme, am artat c variabilele pot fi transmise ca argumente n proceduri fie prin referin, fie prin valoare. Cnd o variabil este transmis prin referin (cazul implicit), procedura apelat transfer un pointer ctre locaia de
Pag. 269

memorie a variabilei transmise. n schimb, cnd o variabil este transmis prin valoare, se face o copie a variabilei i aceasta este transmis procedurii. Dei transferul variabilelor prin valoare are cteva avantaje, este mai lent dect transferul prin referin. Oricum, ambele metode sunt mai lente dect plasarea secvenei de cod corespunztoare in-line i renunarea la apelul unei proceduri. Dezavantajul principal al folosirii codului in-line este dificultatea de ntreinere n cazul n care aceeai secven de cod apare in-line n mai multe proceduri. ns dac principala prioritate de programare este viteza de execuie, ar trebui ca utilizarea codului in-line s constituie o opiune serioas.

12.3.10 Folosii structura For Each Visual Basic include o structur de ciclare numit For EachNext, care permite parcurgerea succesiv a tuturor elementelor unei matrice sau unei colecii 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 numrului de elemente din colecie sau matrice i utilizarea structurii ForNext pentru a inspecta fiecare element cu ajutorul unui contor de ciclare pe post de index al coleciei.
For iCounter = 0 To CurrentDb.QueryDefs.Count - 1 Set qdf = Current.Db.QueryDefs(iCounter) sTemp = qdf.SQL qdf.Close Next

Ori de cte ori este posibil, folosii prima structur. Un ciclu For Each Next este mult mai rapid dect un ciclu obinuit care folosete un contor de ciclare ca index al coleciei sau al matricei.

Pag. 270

Procedura For Each (Partea 2) For Each (Partea 1)

Comentarii Utiliznd o structur ciclic tradiional Utiliznd structura For Each

Numr de iteraii 10 10

Rezultate (ms) Total Pe iteraie 592,3 59,2250 237,8 23,7750

12.3.11 Folosii judicios instruciunea DoEvents Dac nu schimbai condiiile implicite de lucru, o procedur VBA aflat n execuie acioneaz foarte egoist, acaparnd toate resursele Access. De exemplu, dac rulai urmtoarea secven de cod, v vei da seama rapid c Access este blocat pn la terminarea execuiei codului.
For lngCounter = 1 to 1000000 i = Rnd*12 Next lngCounter

Pe calculatorul meu, execuia acestei rutine dureaz aproximativ 2,8 secunde. Este bine s trecei controlul sistemului Windows ct mai des posibil. De exemplu, sar putea ca n timpul execuiei acestei rutine s dorii anularea ei, oprirea temporar sau chiar efectuarea unei alte operaii. Nu este prea plcut ca rutina respectiv s ignore toate solicitrile dumneavoastr. Avei nevoie de o modalitate de a permite i procesarea altor evenimente n timpul execuiei rutinei. Acest lucru este posibil prin utilizarea instruciunii DoEvents. Aceasta cere sistemului Windows s trateze toate mesajele sau apsrile de taste care se gsesc n coada de ateptare. n secvena urmtoare de cod, ori de cte ori ciclul ajunge la instruciunea DoEvents, sistemul Windows preia controlul execuiei i verific dac n alte aplicaii exist mesaje sau apsri de taste care ateapt s fie procesate. Dup tratarea acestora, sistemul de operare transfer din nou controlul procedurii.
For lngCounter = 1 to 1000000 i = Rnd*12 DoEvents Next lngCounter

Cu toate c este folositoare n programare, aceast metod consum mult timp. n condiiile n care se face o verificare a evenimentelor la fiecare parcurgere a ciclului, durata de execuie a rutinei depete 55 de minute! Dac dorii s folosii instruciunea DoEvents, fii ceva mai rezervat. Secvena anterioar de cod poate fi rescris astfel:
Pag. 271

For lngCounter = 1 to 1000000 i = Rnd*12 If lngCounter Mod 50000 = 0 Then DoEvents Next lngCounter

n acest caz, Windows preia controlul la fiecare 50.000 de cicluri, adic de 20 de ori n 4,13 secunde (durata de execuie a rutinei). Aceasta nseamn un comportament corespunztor al rutinei, dar i o vitez de execuie destul de mare. Instruciunea DoEvents adaug doar 1,34 secunde la timpul de execuie al secvenei de cod. n tabelul urmtor sunt prezentate rezultatele obinute rulnd cele trei variante de cod pe un calculator din clasa Pentium. Le putei testa i dumneavoastr cu ajutorul procedurii DoEventsTest din baza de date Whisky14.mdb de pe CD-ul ataat crii, ns nu uitai c efectuarea testului cu cte o instruciune DoEvents la fiecare iteraie va fi foarte lent. Procedura DoEventsTest (Partea 1) DoEventsTest (Partea 2) DoEventsTest (Partea 3) Comentarii Fr DoEvents 20 de apeluri DoEvents 100000 de apeluri DoEvents Numr de Rezultate (ms) iteraii Total Pe iteraie 100000 2785,0 0,0279 100000 100000 4127,0 3348986,0 0,0413 33,4899

12.3.12 Folosii metoda Requery, nu aciunea Requery O alt metod de accelerare a execuiei procedurilor este evitarea utilizrii aciunii Requery pentru afiarea unor valori actualizate ntr-un formular sau control i folosirea, n schimb, a metodei Requery. Aceasta este mai rapid, deoarece nu efectueaz dect o simpl repetare a execuiei interogrii pe care se bazeaz formularul sau controlul respectiv (deci nu reface setul de operaii pe care le presupune aciunea Requery - nchiderea formularului, redeschiderea acestuia i apoi repetarea execuiei).

DoCmd Requery ctlText.Name ctlText.Requery

'Aceasta instructiune este lenta 'Aceasta instructiune este mult mai rapida
Pag. 272

Trebuie s tii c, uneori, metoda Requery i aciunea Requery pot genera rezultate diferite. Metoda Requery extrage din memorie valorile actualizate, fr cheie, n setul de nregistrri al formularului, pe baza setului de chei existent, sau a setului de valori cheie. n schimb, aciunea Requery reface setul de chei i apoi extrage din memorie valorile fr cheie. 12.3.13 Folosii cuvntul cheie Me n cazul n care folosii cuvntul cheie Me pentru a face referire la un formular n procedura unui eveniment, Access caut formularul respectiv n spaiul de nume local. Aceasta nseamn c formularul va fi gsit mult mai repede dect n cazul specificrii sale printr-o referin complet.
Forms!frmFoo.BackColor = QBColor(9) Me.BackColor = QBColor(9) 'Aceasta instructiune este lenta 'Aceasta instructiune este mai rapida

12.4 Creterea vitezei de execuie a operaiilor cu baza de date Dac optimizrile pe care le realizai prin modificarea sintaxei instruciunilor VBA sunt uneori insesizabile, optimizarea apelurilor bazei de date conduce aproape ntotdeauna la mbuntirea performanelor. Motivule este foarte simplu. Apelurile bazei de date sunt executate, de obicei, ntr-un timp mai lung dect instruciunile VBA normale, astfel c o cretere cu 10% a performanelor va fi mult mai uor vizibil n cazul apelului bazei de date. n continuare, vom analiza cteva modaliti prin care putei mbunti interaciunea codului VBA cu baza de date. 12.4.1 Folosii indexuri Adugarea unui index la un cmp reprezint o metod de mbuntire a performanelor de cutare n cmpul respectiv. Cu toate c adugarea indexurilor ncetinete actualizrile i mrete riscul apariiei conflictelor de blocare, aceast suprancrcare este de obicei compensat de performanele obinute la cutarea frecvent n cmpurile respective n cadrul interogrilor. Putei sesiza aceste avantaje rulnd procedura UsingIndexes. Procedura deschide de dou ori un set de nregistrri prin urmtoarea secven de cod:

Set rec = CurrentDb.OpenRecordset _ ("SELECT OrderID FROM [Order] WHERE OrderDate < #1/1/96#", _ dbOpenDynaset) rec.MoveLast Pag. 273 lngRetVal = rec(0) rec.Close

La prima deschidere a setului de nregistrri, cmpul OrderDate nu este indexat; a doua oar, este indexat. Tabelul urmtor prezint timpii de execuie pentru aceast funcie, ns dac dorii, putei testa rutina personal. Procedura UsingIndexes (Partea 1) UsingIndexes (Partea 2) Comentarii OrderDate nu este indexat OrderDate este indexat Numr de Rezultate (ms) iteraii Total Pe iteraie 100 4653,0 46,5300 100 2163,0 21,6300

12.4.2. Folosii semne de carte La deschiderea unui set de nregistrri, fiecrei nregistrri i este atribuit automat o proprietate Bookmark (semn de carte). Dac ai deschis un set de nregistrri i tii c vei reveni la nregistrarea curent, este bine s salvai ntr-o variabil semenul de carte (Bookmark) corespunztor nregistrrii respective. Atribuind proprietii Bookmark a obiectului Recordset valoarea pe care ai salvat-o n variabil, vei putea reveni la nregistrare mult mai rapid dect prin metodele Find sau Seek. Semnele de carte (Bookmark) sunt stocate ca matrice de octei i ar trebui s fie salvate n acest format, i nu ca iruri. Cu toate c putei salva proprietatea Bookmark ntr-o variabil ir, este posibil ca prin compararea valorii Bookmark a unei nregistrri cu o valoare Bookmark memorat de o variabil ir s nu obinei rezultate corecte (cu excepia cazului n care are loc o comparare binar).

12.4.3. Folosii ca surs pentru formulare interogri salvate Interogrile salvate sunt rulate mult mai rapid dect cele create dinamic cu ajutorul instruciunilor SQL, pentru c sunt deja compilate. De aceea, un formular care
Pag. 274

se bazeaz pe o interogare salavat va fi deschis mult mai repede dect unul care are ca surs de nregistrri (RecordSource) o instruciune SQL. Dezavantajul acestei metode este dificultatea ntreinerii. Dac exportai n alt baz de date un formular bazat pe o interogare salvat, trebuie s exportai i interogarea corespunztoare. Pe de alt parte, dac formularul are ca surs de nregistrri (RecordSource) o instruciune SQL, nu trebuie exportat dect formularul. 12.5. Creterea vitezei aparente Pn acum, ai aplicat diverse metode de cretere a vitezei reale de execuie a codului VBA i a apelurilor bazei de date. Cum procedai ns dac ai optimizat aplicaia pentru o vitez real de execuie, dar aceasta continu s fie lent? Una dintre opiunile posibile este creterea vitezei aparente a aplicaiei. Este vorba de viteza cu care crede utilizatorul c va fi rulat aplicaia, nu de viteza real de execuie. Pentru a face ca aplicaia s par mult mai rapid, avei la dispoziie urmtoarele modaliti de optimizare: Utilizarea unui formular de nceput Utilizarea indicatoarelor care ilustreaz progresul operaiei tergerea codului din modulele de formular Prencrcarea i ascunderea formularelor Memorarea local a datelor 12.5.1 Un formular simplu de nceput Una dintre cele mai sigure metode de a distrage atenia utilizatorilor atunci cnd o aplicaie efectueaz o operaie ntr-un interval de timp prea mare este afiarea unor imagini grafice atrgtoare. De fapt, aa procedeaz Microsoft. Ce se ntmpl cnd pornii Access, Word sau Excel? Vedei un formular de nceput sau un ecran de descriere cu meniunea de copyright: Cnd vedei imaginea respectiv, v spunei n gnd: "Arat bine. A vrea ca i aplicaia mea s aib un aspect att de profesional!". i pn s v trezii din reverie, aplicaia s-a i ncrcat. Dac nu ai vedea un ecran de deschidere, probabil c v-ai ntreba: "Oare ce se ntmpl? De ce dureaz aa de mult ncrcarea aplicaiei?". Ecranele de deschidere i ndeplinesc rolul pentru care au fost concepute. Vestea bun este c, n Access 97, putei realiza foarte uor ecrane de deschidere. Nu trebuie dect s creai un formular i s specificai numele su n rubrica Display Form din caseta de dialog Tools/Startup Un mic sfat: nu ncrcai formularul de nceput cu prea multe controale sau cu un cod prea complex pentru evenimentul Load, deoarece riscai ca afiarea formularului s dureze prea mult i nu v mai atingei scopul!
Pag. 275

12.5.2 Folosii indicatoare care ilustreaz progresul operaiei O alt modalitate de a distrage atenia utilizatorilor - i de a-i asigura c se ntmpl ceva - este afiarea pe ecran a unui indicator care prezint progresul operaiilor efectuate. Funcia SysCmd ofer o metod simpl de a realiza acest lucru. Pentru a afia un indicator de progres pe bara de stare a aplicaiei, trebuie parcurse trei etape: Iniializarea contorului (indicatorului) de progres, cu specificarea valorii maxime i a textului care trebuie afiat Actualizarea repetat a contorului pentru a ilustra progresul operaiei tergerea indicatorului de progres Urmtoarea secven de cod reprezint una dintre metodele de afiare 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, i) Next i 'Elimina indicatorul de progres de pe bara de stare varRetVal = SysCmd(acSysCmdRemoveMeter) End Sub

Aceast procedur determin afiarea unui indicator de progres, care se umple gradual, precum i a testului "Testing". Desigur, pentru actualizarea indicatorului, dumneavoastr nu trebuie s scriei un ciclu de instruciuni. V putei structura procedura astfel:
Pag. 276

Sub ShowProgress() Dim varRetVal As Variant 'Initializeaza indicatorul de progres si stabileste 'valoarea maxima 300 varRetVal = SysCmd(acSysCmdInitMeter, "Testing", 300) 'Executa o serie de operatii de prelucrare . 'Actualizeaza contorul pentru a ilustra progresul operatiei varRetVal = SysCmd(acSysCmdUpdateMeter, 5) 'Executa alte operatii de prelucrare . 'Actualizeaza contorul pentru a ilustra progresul operatiei varRetVal = SysCmd(acSysCmdUpdateMeter, 10) 'Alte operatii de prelucrare . 'Actualizeaza contorul pentru a ilustra progresul operatiei varRetVal = SysCmd(acSysCmdUpdateMeter, 15) Elimina indicatorul de progres de pe bara de stare varRetVal = SysCmd(acSysCmdRemoveMeter) End Sub

Cele trei constante, acSysCmdInitMeter, acSysCmdUpdateMeter i acSysCmdRemoveMeter, care sunt folosite pentru iniializarea, actualizarea i tergerea indicatorului de progres de pe bara de stare, sunt intrinsece mediului Access. Cu alte cuvinte, fac parte din limbaj i nu trebuie declarate nicieri. 12.5.3 tergei codul din modulele de formulare Utilizatorii ncep s se agite dac execut clic pe un buton pentru a deschide un formular i afiarea acestuia ntrzie. Aa se ntmpl de obicei cnd un formular are foarte mult cod n modulul su, care mrete durata de ncrcare. n acest caz, ar trebui s tergei codul din modulul de formular i s l plasai ntr-un modul de cod standard. Ca urmare, formularul va fi afiat mult mai repede, iar codul va fi ncrcat numai la cerere, dup deschiderea formularului. 12.5.4 Prencrcai i ascundei formularele Pe lng metoda prezentat anterior, dac folosii frecvent un anumit formular care necesit mult timp pentru ncrcare i descrcare, putei s ncrcai formularul n timpul lansrii n execuie a aplicaiei i apoi s l afiai i s l ascundei, n loc s l ncrcai i descrcai n memorie.
Pag. 277

Aceast tehnic va ncetini lansarea n execuie a aplicaiei, dar va crete substanial performana de ansamblu. Putei ntrzia ncrcarea formularului chiar i dup afiarea pe ecran a formularului principal al aplicaiei. n timp ce utilizatorul privete formularul principal, n fundal poate fi ncrcat al doilea formular. Metoda prezentat este util dac viteza aparent este o prioritate de programare, ns reinei c mai multe formulare ncrcate concomitent vor spori cantitatea de memorie necesar aplicaiei. 12.5.5. Stocai datele n memoria local O zon cache este o zon de memorie (sau spaiu pe hard-disc) utilizat pentru a stoca valori provenite din alt parte i pregtite pentru a fi refolosite. De exemplu, Windows 95 plaseaz datele provenite de pe hard-disc ntr-o zon cache reprezentat de o poriune din memorie. Sunt frecvente situaiile n care un program folosete n mod repetat aceleai date. Prin aceast metod, programul va citi datele direct din zona cache i nu va mai pierde timp cutndu-le de fiecare dat pe hard-disc. n plus, citirea din memorie este mai rapid i mai eficient dect citirea de pe hard-disc. Prin urmare, putei mbunti performanele unei aplicaii utiliznd zone cache pentru stocarea datelor. n ordinea descresctoare a vitezei, cele trei metode de obinere a datelor sunt: Citirea datelor din memorie (de exemplu, variabile, matrice) Citirea datelor din tabele stocate Citirea datelor din tabele stocate pe calculatoare legate ntr-o reea Dac dorii s cretei viteza aparent de rulare a aplicaiei, gndii-v la un nivel superior de stocare a datelor (adic la schimbarea tipului de memorie cache). Dac pstrai date accesate frecvent - dar care nu se modific des - ntr-un tabel de pe un sever de reea ar trebui s avei n vedere copierea datelor pe calculatorul client local pentru ca aplicaia s ruleze mai repede. Totui, va trebui s v asigurai c, ori de cte ori sunt actualizate pe server, datele vor fi actualizate i pe calculatoarele client (i invers). n mod similar, dac avei date ntr-un tabel de cutare (de exemplu, Region) pe care l accesai frecvent prin codul VBA, putei crea cu ajutorul metodei GetRows o matrice pentru stocarea datelor respective. Aceast tehnic poate mri semnificativ viteza de obinere a datelor. Bineneles, va crete i necesarul de memorie pentru aplicaia dumneavoastr.

12.5.6. Consideraii referitoare la lucrul n reea Pn acum, ne-am concentrat atenia asupra scrierii unui program care s ncap ntr-o zon redus de memorie i s poat fi executat ct mai repede posibil - sau mcar s
Pag. 278

creeze aceast impresie. ns unul din motivele eseniale pentru care aplicaiile de baze de date Access sunt lente nu are nici o legtur cu dimensiunea memoriei necesare sau cu viteza de execuie a codului. De cele mai multe ori, rularea lent este cauzat de cantitatea enorm de date care trebuie s fie citite de pe disc i apoi transferate prin reea. Lucrul n reea are dou neajunsuri importante. n primul rnd, performana obinut la transferul datelor - n special printr-o reea lent - poate fi mai slab dect n cazul folosirii tabelelor locale. n al doilea rnd, s-ar putea ca aplicaia dumneavoastr s genereze un intens trafic de reea. Acest fapt i va deranja pe ceilali utilizatori ai reelei, care vor observa c aplicaiile lor sunt ncetinite considerabil din cauza aglomerrii traficului. Dac unul dintre cele dou aspecte menionate reprezint o problem pentru dumneavoastr, putei aplica urmtoarele tehnici: Cutarea dup cmpuri indexate n tabele ataate Plasarea pe calculatorul local a obiectelor care nu sunt de tip tabel Dezactivarea opiunii AutoExpand

12.6. Ultimele retuuri Toate sugestiile de pn acum au fost analizate ca prioriti specifice de programare: creterea vitezei reale de execuie, reducerea traficului de reea sau micorarea amprentei de memorie a aplicaiei de baze de date. n unele cazuri, o singur msur de optimizare poate aduce mai multe avantaje. De exemplu, schimbarea tipului unei variabile de la Variant la ntreg va reduce considerabil necesarul de memorie i va crete viteza de execuie. Totui, exist i situaii n care o msur de optimizare are efecte antagonice: att pozitive, ct i negative. De exemplu, tehnica de ncrcare i ascundere a formularelor va mri viteza aparent de execuie a aplicaiei, dai i amprenta de memorie a acesteia. n aceast situaie, trebuie s v stabilii prioritile i s acionai n consecin. Seciunea final din acest capitol prezint cteva tehnici care mbuntesc ntotdeauna performanele aplicaiei dumneavoastr - indiferent de prioritile de programare. Acestea sunt: Compactarea bazei de date Compilarea tuturor modulelor Deschiderea bazelor de date n mod exclusiv

Pag. 279

12.6.1 Compactarea bazei de date Dup o perioad de timp, este posibil s constai c performanele aplicaiei dumneavoastr sunt n scdere. Cauza ar putea fi procesul de fragmentare a bazei de date. Fragmentarea se produce la tergerea unor obiecte din baza de date, n situaia n care spaiul folosit de aceste obiecte nu este recuperat. Baza de date va fi ca un vaier - cu o mulime de spaii goale - i, n acelai timp, va deveni mai lent. Dei nu este deteriorat n nici un fel, performanele scad. Aceasta pentru c citirea datelor necontigue (fragmentate) de pe disc este mai lent dect a datelor contigue. Prin compactarea unei baze de date, este eliminat tot spaiul nefolosit (gurile din vaier), iar paginile de date devin contigue. Aplicarea acestei tehnici prezint dou avantaje: mbuntirea performanelor bazei de date Reducerea dimensiunii fiierului bazei de date Compactarea unei baze de date se poate realiza cu ajutorul opiunii specifice din meniu, dar i prin cod VBA, folosind metoda CompacteDatabase a obiectului DBEngine: DBEngine.CompactDatabase "c:\myold.mdb","c:\mynew.mdb" Pentru a obine performane optime, nainte de compactarea bazei de date ar trebui s folosii un program de defragmentare a discului (de exemplu Disk Defragmenter, care este distribuit mpreun cu Windows 95). 12.6.2 Compilarea tuturor modulelor Ai lucrat cu nfrigurare tot weekend-ul pentru a termina aplicaia de baze de date, n vederea prezentrii de luni n faa consiliului. Ai testat aplicaia azi-noapte ntr-un mediu obinuit de lucru - i aceasta a funcionat bine. Mai avei la dispoziie o or i v gndii s rulai o mic rutin proprie de bibliotec pentru a aduga procedurilor nite anteturi de efect. Dureaz doar cteva minute i ai rulat-o de multe ori, aa nct tii sigur c nu conine erori de programare. Momentul ateptat a sosit; membrii consiliului se aeaz n jurul mesei, dumneavoastr executai clic pe pictograma aplicaiei i ateptai ateptai ateptai "Ce este asta?" v ntrebai n gnd. "Ce s-a ntmplat cu aplicaia mea? Se mic de parc ar fi un cine chiop aflat n com". Poate c ai uitat s recompilai aplicaia! Cnd efectuai modificri (de orice fel) ntr-un modul de cod standard sau ntrun modul de clas (inclusiv modulele de formulare i rapoarte), modulul respectiv trebuie s fie recompilat nainte de a fi lansat n execuie. Pentru a
Pag. 280

compila codul din toate modulele bazei de date, selectai opiunea Compile and Save All Modules din meniul Debug. Dac nu compilai explicit codul prin aceast metod, sistemul Access compileaz codul n timpul de execuie, ceea ce poate determina o ntrziere semnificativ, n special dac modulele compilate conin multe linii de cod. ntrzierea este limitat dac ai validat caseta Compile On Demand (Compilare la cerere) din pagina etichetei Module a casetei de dialog Tools/Options n acest caz, Access compileaz secvenele de cod apelate de procedura executat - prin arborele de apeluri. Ca urmare, ntrzierea este mai mic. Pentru siguran, ar trebui ca nainte de distribuirea aplicaiei, s compilai ntotdeauna ntregul cod. Prin compilare, vor fi detectate o serie de erori, cum ar fi o instruciune For care nu este urmat de instruciunea Next. 12.6.3 Deschiderea bazelor de date n mod exclusiv Dac suntei singura persoan care va folosi baza de date la un moment dat, ar trebui s o deschidei n mod exclusiv. Aplicaia va fi executat mai rapid, deoarece Access nu va mai pierde timpul cu monitorizarea altor utilizatori care doresc s blocheze nregistrri. Pentru a v asigura c baza de date va fi deschis n mod exclusiv, selectai opiunea Exclusive ca Defalut Open Mode n pagina etichetei Advanced a casetei de dialog Tools/Options Dac dorii s deschidei o singur baz de date n mod exclusiv atunci cnd este prestabilit modul partajat, executai clic n caseta de validare Exclusive din caseta de dialog Open Database. Dac lansai aplicaia din linia de comand, putei folosi opiunea /Excl pentru a obine acelai rezultat. c:\access\msaccess.exe c:\abwrox\code\wrox.mdb /Excl Dac deschidei baza de date n VBA, configurai argumentul Exclusive la valoarea True atunci cnd folosii metoda OpenDatabase:
Set db = DBEngine(0).OpenDatabse("c:\abwrox\code\wrox.mdb", True)

12.7 Rezumat
Pag. 281

Crearea unei aplicaii este o mare realizare. Construirea unei aplicaii care ruleaz rapid (sau mcar d aceast impresie) i u ocup toat memoria calculatorului nseamn ns cu totul altceva - este ceea ce va consacra sau va invalida aplicai. Utilizatorii sunt fiine nerbdtoare i, pentru ei, nimic nu este mai ru dect un program ineficient. Acest capitol a prezentat o serie de sugestii i trucuri pentru creterea vitezei generale de execuie a codului. nainte de a ncepe scrierea secvenelor de cod, ar trebui s stabilii care sunt prioritile de programare i apoi s urmai sugestiile prezentate n carte. Nu uitai c optimizarea unei prioriti, cum ar fi mentenabilitatea, poate afecta un obiectiv secundar, a de exemplu viteza de execuie a codului - numai dumneavoastr putei decide care prioritate este mai important. n capitolul de fa, s-a prezentat: Cum poate fi redus suprancrcarea memoriei prin alegerea

corespunztoare a tipurilor de date, recuperarea memoriei i renunarea la comentariile de prisos Tehnicile de programare prin care putei mri viteza de execuie Diverse trucuri, cum ar fi utilizarea unui ecran de nceput i a unor indicatoare care s ilustreze progresul unei operaii, pentru a distrage atenia utilizatorului i a crea impresia c aplicaia ruleaz mai rapid Cum s mrii eficiena unei aplicaii de reea n capitolul urmtor, vom discuta despre avantajele codului refolosibil, artnd cum putei folosi bibliotecile de rutine i programe de completare pentru a reduce timpul de dezvoltare i de testare a aplicaiei.

Pag. 282

CAP: 13 .INTERNET Iat subiectul cel mai fierbinte i controversat din lumea calculatoarelor. Muli vd n Internet salvatorul societii noastre - prin crearea unei comuniti globale, care are la dispoziie o abunden de informaii, 24 de ore pe zi. Alii vd n Internet un monstru care ateapt s ne nghit dup ce i vom cdea cu toii n capcanele ademenitoare. Indiferent de care parte v situai, realitatea este c reeaua Internet exist, va exista nc muli ani i, cel mai important, poate constitui un instrument de lucru foarte util. Acest capitol este dedicat modalitilor n care putei folosi facilitile Internet n Access 97. Vom prezenta urmtoarele subiecte: Ce este Internetul? Cum se utilizeaz hiperlegturile? Cum se pot publica date n Internet? Crearea unui browser Web 13.1 Ce este Internetul? Termenul Internet denumete o colecie de calculatoare legate ntre ele - o reea foarte mare, dat atta tot. nainte de a vedea cum putem folosi caracteristicile Access pentru a ne conecta n i din Internet, vom defini cteva noiuni: HyperText Markup Language, HTML, este formatul n care sunt stocate documentele Internet. Este un limbaj foarte simplu, care iniial, era destinat aranjrii textului pe ecran, formatrilor etc. caracteristica hipertext permite stabilirea unor legturi ntre documente, astfel nct dumneavoastr s putei trece uor de la un document la altul, urmrind legturile i referinele existente. HTML evolueaz continuu, incluznd din ce n ce mai multe faciliti; deocamdat, gndii-v la HTML ca la o posibilitate de formatare a documentelor. Un browser (program de navigare n Web) este un program care afieaz documente HTML. Cele mai cunoscute browsere sunt Microsoft Internet Explorer i Netscape. Un sit Web este un calculator (sau un grup de calculatoare) din Internet care pstreaz documente HTML. De exemplu, situl Web al editurii Wrox se gsete la adresa http://www.wrox.com. Expresia www provine de la World Wide Web, numit uneori doar Web; wrox este numele companiei, iar com prescurtarea de la companie sau sit comercial. Alte sufixe des ntlnite sunt .edu (pentru situri
Pag. 283

educaionale, cum sunt cele ale universitilor i colegiilor) i .gov (pentru situri guvernamentale). O adres URL (Uniform Resource Locator) este numele atribuit unui anumit sit Web sau a unui document din situl respectiv. Documentele sunt stocate la fel ca pe un hard-disc obinuit, ntr-o structur de directoare. Pentru pagina Access a firmei Microsoft, adresa URL ar fi http://www.microsoft.com/access. Un server Web este maina care controleaz un sit Web. Acest server primete cereri de la browserele Web i le pune la dispoziie documentele solicitate.

13.2 Protocoale Pentru a evita orice confuzie, haidei s vedem care sunt principalele protocoale folosite n Internet i cum funcioneaz. Un protocol este numele limbajului prin care calculatoarele comunic ntre ele. ntr-o reea sistemele componente se neleg prin intermediul unui protocol de reea. Cnd comunicai cu un calculator din Internet, folosii tot un protocol de reea. De cnd prin Internet se furnizeaz i alte materiale dect pagini HTML, au aprut i protocoale care indic activitatea pe care dorii s o desfurai. De exemplu: Cnd folosii un browser Web pentru a accesa documentele HTML, utilizai un protocol de transfer pentru hipertext (HxperText Transfer Protocol - HTTP). Este motivul pentru care adresele URL ncep cu http:. n acest fel, se comunic serverului Web tipul de serviciu pe care dorii s l folosii. Un alt protocol important este protocolul pentru transferul fiierelor (File Transfer Protocol - FTP). Acest v permite s transferai n i dintr-un server Web programe i documente. n acest caz, adresa URL va ncepe cu ftp:. Un alt protocol pe care l vei folosi, probabil, n Access este protocolul MailTo, care ajut programul dumneavoastr de pot electronic s transmit mesaje email. n acest caz, adresa va ncepe cu mailto:. Desigur, exist multe alte protocoale, ns acestea nu sunt folosite att de frecvent precum cele prezentate anterior.

13.3 Date de tip hiperlegtur (Hyperlink) Access 97 are un nou tip de date pentru lucrul n Internet - Hyperlink. Ca urmare, putei introduce o adres URL ca un cmp ntr-un tabel sau ntr-un formular. Hiperlegtura poate conine trei informaii: un text de afiare, o adres i o sub-adres. Textul de afiare este textul pe care dorii s l afiai pe ecran. Ai observat probabil n timpul navigrii prin Web c multe legturi sunt descrise prin text, i nu prin adrese URL. Adresa este URL-ul materialului care va fi vizualizat. Sub-adresa este seciunea din cadrul materialului.
Pag. 284

Cele trei pri sunt separate prin semnul diez (#); prin urmare, o hiperlegtur arat astfel: Display Text#Address#Sub Address Pentru clarificare vom prezenta cteva exemple:

Adresa URL Textul afiat pe ecran http://www.microsoft.com http://www.microsoft.com Microsoft on the Microsoft on the Web Web#www.microsoft.com # Hyperlinks#C:\Wrox\ Hyperlinks BegVBA97\Internet.doc# Hyperlinks Whiskies#C:\Wrox\ Whiskies BegVBA97\Whisky.mdb# Form frmMaintWhisky Whiskies## Form frmMaintWhisky Whiskies

Aciune Sare la pagina iniial Microsoft Sare la pagina iniial Microsoft Deschide documentul C:\Wrox\BegVBA97\ Internet.doc i sare la semnul de carte Hyperlinks Deschide formularul frmMaintWhisky din baza de date C:\Wrox\BegVBA97\ Whisky.mdb Deschide formularul frmMaintWhisky din baza de date curent

Observai c tipul de date hiperlegtur nu limiteaz adresele URL doar la documente HTML. Putei indica i documente Word, foi de calcul Excel, formulare Access etc. Beneficiind de posibilitatea de a deschide formulare, putei chiar s nlocuii codul butoanelor care deschid alte formulare cu o adres de hiperlegtur. Aceasta va deschide un formular nou fr a folosi vreo instruciune de cod. 13.4. Cum se utilizeaz hiperlegturile? Gndii-v ct de utile ar fi hiperlegturile n aplicaia dumneavoastr, pentru ca utilizatorii, cu un singur clic de mouse, s poat ajunge ntr-un sit Web. Din fericire, hiperlegturile sunt extrem de simplu de implementat, pentru c Access permite folosirea tipului de date Hyperlink n tabele i formulare.

Pag. 285

13.5 Hiperlegturi n VBA Dup ce ai vzut cte de uor este s adugai hiperlegturi n tabele i formulare, v ntrebai, probabil, cum putei implementa prin program aceste elemente. Ei bine, i tipul de date Hyperlink are cteva metode i proprieti, la fel ca toate celelalte obiecte. 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 hiperlegturi care face referire la obiectul hiperlegtur. Adresa principal a hiperlegturii. Sub-adresa hiperlegturii. Urmrete hiperlegtura pn la destinaie. Are o aciune similar cu executarea unui clic pe control. Adaug hiperlegtura n dosarul Favorites. Urmrete hiperlegatura direct prin adres. Este folosit pentru controalele care nu au proprietatea HyperlinkAddress. Desparte hiperlegtura n prile componente.

Datorit utilizrii simple a hiperlegturilor din tabele i formulare, s-ar putea s nu avei nevoie s folosii aceste funcii prin cod VBA. Aa cum ai vzut, executarea unui clic pe o hiperlegtura n Access este acelai lucru cu deschiderea de pagini Web cu ajutorul unei hiperlegturi. Totui, s-ar putea s existe situaii n care s dorii manipularea hiperlegturilor prin cod - n acest scop, putei folosi metodele din tabelul de mai sus, care sunt foarte simple. Exist o funcie care v uureaz munca; aceasta se numete HyperlinkPart. 13.6. Publicarea n Web Acum, dup ce ai vzut c datele pot fi legate i din surse externe, v ntrebai probabil cum s punei la dispoziia celor interesai datele din Access. Este foarte simplu, ns, i n acest caz, vom ncepe prin a prezenta cteva aspecte teoretice. 13.6.1 Documente HTML statice O pagin HTML static este un document HTML independent, care prezint datele din momentul n care a fost creat. Documentul nu este legat la o baz de date i nu reflect modificrile din cadrul acesteia. Pentru a actualiza datele dintr-un document HTML static, va trebui s l creai din nou. Documentele HTML statice sunt foarte bune pentru texte cu caracter general, ns nu i n cazul bazelor de date,
Pag. 286

deoarece nu afieaz cele mai recente informaii. Aceste documente au sufixul .html i pot fi folosite pe orice server Web. n documentele HTML statice putei salva tabele, interogri, formulare i rapoarte. n cazul rapoartelor, formatarea se pstreaz, astfel c documentul rezultat va arta exact ca un raport Access, ns pentru celelate tipuri de obiecte, documentul va avea aspectul unei foi de date. Exist dou metode de a salva datele ca document HTML. Prima metod este urmtoarea: selectai elementul dorit i alegei Save As/Exportdin meniul File. Apoi selectai opiunea To an External File or Database (ntr-un fiier extern sau ntr-o baz de date) din caseta de dialog afiat pe ecran. Pe ecran va fi afiat caseta de dialog Save standard. Schimbai opiunea Save as type n HTML Documents (Documente HTML). Introducei un nume de fiier i executai clic pe butonul de Export; cu aceasta, ai terminat. Acum putei deschide fiierul ntr-un browser Web. Trebuie remarcat c n cmpurile de cutare sunt afiate numele de identificare, i nu datele de cutare. 13.6.2 Aplicaia wizard HTML Export A doua metod de a exporta obiecte ale unei baze de date n documente HTML const n folosirea aplicaiei wizard HTML Export. Pentru a o lansa n execuie, alegei Save As HTML din meniul File. Aplicaia v va conduce prin etapele procesului de creare a documentului HTML, permindu-v s alegei obiectele pe care dorii s le salvai i tipul de export pe care dorii s l realizai. Exist i alte opiuni, care v permit s alegei abloane, o surs de date ODBC sau o baz de date Access, precum i locul unde dorii s salvai documentul. Nu vom studia toate aceste detalii; amintim doar c aplicaia wizard reunete trei metode de salvare a informaiilor n documente HTML. 13.6.3 Internet Data Connector Internet Data Connector - IDC permite afiarea unei pagini dinamice, create dintr-un document HTML, care interogheaz baza de date i afieaz informaiile cutate. La fiecare deschidere sau mprosptare a paginii, are loc o nou interogare a bazei de date. Aceast baz de date poate fi orice surs de date ODBC, ns serverul Web trebuie s fie Microsoft Internet Information server (IIS). Sunt necesare dou fiiere: un fiier .idc i unul .htx. n fiierele IDC putei exporta tabele, interogri i formulare, ns toate acestea vor arta ca nite foi de date. Urmai acelai algoritm ca n cazul documentelor HTML statice, ns de data aceasta selectai n cmpul Save as type opiunea Microsoft IIS 1-2.

Pag. 287

13.6.4.Active Server Pages Active Server Pages (pagini server active), succesorul lui IDC, este o tehnologie de creare a paginilor dinamice, care afieaz baza de date n starea sa curent. Spre deosebire de IDC, aceste pagini sunt similare cu formularele, permind introducerea, editarea i tergerea datelor dintr-o pagin Web. Datele pot proveni din orice surs ODBC, ns serverul Web trebuie s fie Internet Information Server, de data aceasta cel puin versiunea 3.0, avnd instalat opiunea Active Server Pages. Fiierele Active Server Pages sunt nregistrate cu extensia .asp. spre deosebire de metoda IDC, care creeaz dou fiiere, metoda Active Server Pages creeaz un singur fiier pentru fiecare foaie de date. n fiierele ASP putei exporta tabele, interogri i formulare. Tabelele i interogrile sunt afiate ca foi de date, iar formularele sunt afiate n format HTML, avnd un aspect similar cu formularele din Access. Controalele din formular sunt nlocuite cu controale ActiveX, ns codul VBA al formularului nu este convertit. Pentru a poziiona controalele n pagina HTML, Access folosete controlul Microsoft HTML Layout. Acest program este distribuit mpreun cu Internet Explorer 3.0 sau o versiune ulterioar (i este disponibil n situl Web Microsoft), ns nu poate rula independent. Prin urmare, pentru a crea pagini ASP avei nevoie de Internet Explorer, cel puin versiunea 3.0. Lista urmtoare prezint controalele Access care sunt nlocuite cu controale ActiveX.

Controlul Access Caset de text Caset de text asociat unui cmp cu o hiperlegtur Caset cu list Caset combinat

Controlul ActiveX corespunztor Caset de text Caset de text care afieaz textul hiperlegturii. Cu toate acestea, hiperlegtura nu poate fi urmrit. Caset cu list (cu o singur coloan) Caset combinat

Controlul Access

Controlul ActiveX corespunztor


Pag. 288

Etichet Buton de comand

Grup de opiuni Buton de opiune Caset de validare Buton comutator Control ActiveX

Etichet. Dac eticheta are configurate proprietile HyperlinkAddress i/sau HyperlinkSubAddress, este creat o hiperlegtur pentru etichet. Buton de comand, dar secvena de cod corespunztoare butonului nu este salvat. Dac butonul de comand are configurate proprietile HyperlinkAddress i/sau HyperlinkSubAddress, este creat o hiperlegtur pentru buton. Grup de opiuni, ns fr un cadru de grup Buton de opiune Caset de validare Buton comutator Control ActiveX, ns secvena de cod corespunztoare controlului este salvat.

Urmtoarele controale nu sunt convertite la salvarea unui formular ca fiier ASP i, de aceea, 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 proprietii Picture n ciuda acestor lipsuri, obinei un formular funcional. Pentru a salva datele ntr-un fiier ASP, folosii acceai metod ca mai nainte, ns de data aceasta, selectai n cmpul Save as type opiunea Microsoft Active Server Pages. i aici exist spaii speciale pentru introducerea ablonului HTML i a informaiilor despre sursa de date ODBC, ns apare i un cmp pentru adresa serverului, unde trebuie s introducei adresa complet la care va fi stocat documentul. n exemplul nostru, este o adres la care este instalat Personal Web Server, care accept i paginile server active (Active Server Pages). Dac ai salvat un formular, putei s deschidei fereastra aplicaiei Internet Explorer 3.0 pentru a-l vizualiza. Dei nu este perfect, aceast tehnic a permis parcurgerea unor pai importani n direcia realizrii unor aplicaii pentru Web.

Pag. 289

13.7. Crearea unui browser Pn acum, ai vzut ct de uor v putei publica datele din Access n sistemul Web; ns cum includei funcii Web n aplicaiile dumneavoastr? Este un proces la fel de simplu, deoarece firma Microsoft a realizat un control de navigare Web (Web Browser Control) care poate fi adugat n formularele dumneavoastr. Astfel, formularele vor avea propriul browser i nu vei mai fi nevoit s rulai unul separat. Oricum, pentru a folosi acest control, trebuie s avei instalat produsul Internet Explorer 3.0 sau o versiune ulterioar. ncercai singur - Un browser Web Deschidei tabelul Company n modul de afiare pentru proiectare (Design) i adugai un cmp nou, numit WebSite, de tip Hyperlink. Salvai i nchidei tabelul. 2. Deschidei formularul frmMaintCompany n modul de afiare pentru proiectare. Mrii puin dimensiunea formularului. 3. Selectai butonul More Controls (Alte controale) din caseta de instrumente. 4. Acum derulai lista de constroale plasnd cursorul pe sgeata din partea de jos a formularului i selectai opiunea Microsoft Web Browser Control. 5. Adugai acest control n formularul dumenavoastr, aa cum procedai cu orice alt control. S-ar putea s fie necesar redimensionarea formularului pentru a face loc noului control. Denumii controlul ctlBrowser. 6. Adugai un buton de comand, denumii-l cmdWeb i completai titlul (Caption) View Web Page (Vizualizare pagin Web). 7. Editai codul pentru evenimentul Click al noului buton, adugnd urmtoarea linie de cod: ctlBrowser.Navigate HyperlinkPart)Me!Website, acAddress)
1.

Aceast instruciune folosete metoda Navigate a controlului Browser pentru a naviga ctre hiperlegtur. 8. nchidei formularul i salvai-l. 9. Deschidei tabelul Company i adugai urmtoarea adres n cmpul WebSite pentru produsul Bacchanalia: file://C:\\BegVBA\\bacch.htm Aceast adres indic pagina iniial a produsului Bacchanalia, memorat local pe hard-discul calculatorului dumneavoastr. 10. Acum deschidei formularul frmMaintCompany n modul de afiare Form i selectai nregistarea Bacchanalia; executai clic pe butonul View Web Page. Browserul va afia imediat pagina Web corespunztoare. Din pcate, exist o serie de probleme legate de controlul Browser i de Internet Explorer 3.0. Probabil ai observat c dimensionarea este inadecvat, astfel c
Pag. 290

paginile Web au un aspect necorespunztor i nu execut corect operaia de mprosptare. Ar fi mult mai bine dac ai indica un sit Web prin http, i nu prin file. Aceste neajunsuri sunt cunoscute i sperm c vor fi rezolvate curnd. Totui, controlul Web Browser poate vizualiza documente HTML care includ: Elemente HTML standard i mbuntiri HTML, cum ar fi cadrele mobile i foile afiate n cascad Alte controale ActiveX Majoritatea produselor de completare Netscape Scripturi, cum sunt Microsoft Visual Basic Scripting Edition (VBScript) sau JavaScript Elemente multimedia, de exemplu secvene 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 aplicaiile intranet, care v ofer posibilitatea de combinare a coninutului. Pentru cei care au deja aplicaii Access, dar dezvolt aplicaii noi bazate pe Internet/intranet, controlul Browser poate constitui un sprijin important n trecerea la o aplicaie combinat. 13.8.Rezumat n acest capitol au fost prezentate cteva faciliti oferite de Access 97 pentru lucrul n Internet. Utilizarea pe scar larg a Internetului n viaa de zi cu zi i interesul public general constituie premise pentru dezvoltarea i mbuntirea unor astfel de caracteristici. Subiectele principale din acest capitol au fost: Hiperlegturile i utilizarea lor n Access Importul i exportul documentelor HTML Crearea unui browser Web n Access

Pag. 291

CAP: 1. NOIUNI GENERALE DESPRE BAZE DE DATE.............................................................6 1.1 BAZ DE DATE. BAZE DE DATE RELAIONALE........................................................................................6 1.1.1 Chei primare, chei secundare.................................................................................................6 1.1.2 Relaii.....................................................................................................................................7 1.1.3 Teoria normalizrii.................................................................................................................7 1.2 SISTEME DE GESTIUNE A BAZELOR DE DATE...........................................................................................8 1.2.1 Limbaje de interogare. SQL....................................................................................................9 1.3 MODELUL RELAIONAL....................................................................................................................10 1.3.1. Scurt descriere a modelului relaional...............................................................................10 1.3.2 Reguli de fidelitate ale bazelor de date................................................................................11 BIBLIOGRAFIE.......................................................................................................................................15 CAP:2. BAZE DE DATE, TABELE I RELAII ...............................................................................15 2.1 CREAREA UNEI BAZE DE DATE............................................................................................................16 2.2. CREAREA TABELELOR......................................................................................................................17 2.2.1 Crearea manual a tabelelor................................................................................................18 2.2.2 Datasheet View: avantaje.....................................................................................................18 2.2.3 Design View: .......................................................................................................................19 2.2.4 Definirea coloanelor.............................................................................................................20 2.2.5 Stabilirea proprietilor cmpurilor.....................................................................................21 2.2.6 Lookup wizard......................................................................................................................23 2.2.7 Value List..............................................................................................................................27 2.2.8 Definirea cheilor primare i a indecilor..............................................................................28 2.2.9 Crearea unei tabele folosind experii Access......................................................................30 2.3 STABILIREA RELAIILOR NTRE TABELE.............................................................................................30 2.3.1. Fereastra Relationships.......................................................................................................30 2.3.2 Crearea relaiilor dintre tabele............................................................................................32 2.3.3 Proprietile relaiilor..........................................................................................................34 2.3.4. Tipuri de asociere................................................................................................................34 2.3.5 Asigurarea integritii refereniale.......................................................................................36 2.3.6. Modificarea relaiilor existente...........................................................................................36 2.4.1 Importul datelor...................................................................................................................36 2.4.2 Exportul datelor....................................................................................................................37 2.4.3. Formate standard................................................................................................................38 CAP:3. INTEROGRI.............................................................................................................................39 3.1. FOLOSIREA FERESTREI QBE.............................................................................................................39 3.1.1. Specificarea surselor de date...............................................................................................40 3.1.2. Proprietile interogrilor...................................................................................................40 3.2. TIPURI DE INTEROGRI.....................................................................................................................43 3.2.1. Interogri agregat...............................................................................................................43 3.2.2. Interogri de tip totals ........................................................................................................43 3.2.2.1 Sortarea rezultatelor unei interogri de tip totals..............................................................46 3.2.2.2 Stabilirea criteriilor..........................................................................................................47 3.2.3. Interogri de tip Crosstab ...................................................................................................48 3.2.3.1 Crearea totalurilor pe linii................................................................................................49 3.2.3.2 Limitrile intergrilor Crosstab........................................................................................50 3.2.4. Interogri pentru definirea i modificarea datelor..............................................................51 3.2.4.1. Interogri de tip Make Table............................................................................................51 Pag. 292

3.2.5. Interogri de tip Append.....................................................................................................52 3.2.6 Interogri de tip Update.......................................................................................................52 3.2.7 Interogri de tip Delete.......................................................................................................53 3.2.8 Interogri cu parametri.......................................................................................................53 3.3. EXPRESII I FUNCII N INTEROGRI....................................................................................................53 3.3.1. Prile componente ale expresiilor......................................................................................54 Operatori.......................................................................................................................................54 Constante.......................................................................................................................................55 Funcii...........................................................................................................................................56 3.4. LUCRUL CU DATE I ORE..................................................................................................................56 3.5. FUNCIA IIF N EXPRESII.................................................................................................................58 3.6. STRATEGII DE PARCURGERE A TABELELOR DE BAZ..............................................................................58 3.7. GREELI FRECVENTE........................................................................................................................59 3.8. IMPORTANA COMPACTRII...............................................................................................................60 CAP: 4. CREAREA I LUCRUL CU FORMULARELE...................................................................61 4.1 SURSELE DE NREGISTRRI ALE FORMULARELOR ....................................................................................61 4.2. CREAREA UNUI FORMULAR SIMPLU.....................................................................................................62 4.3. SECIUNILE UNUI FORMULAR ...........................................................................................................64 4.4. LUCRUL CU FORMULARELE...............................................................................................................66 4.5. DESPRE CONTROALE........................................................................................................................68 4.5.1. Tipuri de controale..............................................................................................................69 Controale neataate.......................................................................................................................69 Controale ataate..........................................................................................................................69 Controale calculate.......................................................................................................................70 4.5.2. Casete combinate, casete list i grupuri de opiuni............................................................70 FIGURA IV.10 ...................................................................................................................................73 4.6. SUBFORMULARE..............................................................................................................................73 CAP: 5. MODELUL ORIENTAT PE EVENIMENTE........................................................................75 ...........................................................................................................................................................76 5.1. TIPURI DE EVENIMENTE N ACCESS....................................................................................................76 5.1.1. Evenimente generate de accesarea datelor..........................................................................76 5.1.2. Evenimente legate de focus..................................................................................................78 5.1.3. Evenimente legate de tastatur............................................................................................79 5.1.4. Evenimente legate de activitatea cu mouse-ul......................................................................79 5.1.5. Evenimente legate de tiprire..............................................................................................80 5.1.6. Evenimentele ferestrelor......................................................................................................81 5.1.7. Evenimente generate de erori..............................................................................................82 5.1.8. Evenimentele legate de timer...............................................................................................82 5.2. ORDINEA PRODUCERII EVENIMENTELOR N ACCESS...............................................................................82 5.2.1. Ordinea producerii evenimentelor legate de controale........................................................82 5.2.2. Ordinea producerii evenimentelor legate de lucrul cu negistrrile unui formular.............83 5.2.3 Ordinea producerii evenimentelor legate de formulare........................................................83 5.2.4. Ordinea producerii evenimentelor legate de tastatur i mouse..........................................84 5.2.5. Ordinea producerii evenimentelor rapoartelor....................................................................85 5.3. TRATAREA EVENIMENTELOR .............................................................................................................85 .....................................................................................................................................................................86 CAP:6. MACROCOMENZI....................................................................................................................86 6.1. CREAREA UNEI MACROCOMENZI.........................................................................................................87 Pag. 293

6.2. GRUPURI DE MACROCOMENZI............................................................................................................88 Grupurile de macrocomenzi sunt utile, de exemplu, atunci cnd dorii s pstrai toate macrocomenzile unui formular n acelai obiect, astfel nct numrul obiectelor din pagina Macro a ferestrei Database s fie mai mic. Pe de alt parte, o macrocomand poate apela alt macrocomand n cadrul unei condiii, caz n care vei prefera s le includei pe amndou n acelai obiect, pentru a fi mai simplu de depanat..........................................................................89 O macrocomand din grup poate fi executat utiliznd numele grupului, urmat de un punct i de numele macrocomenzii:.................................................................................................................89 6.3. MACROCOMENZI IMBRICATE.............................................................................................................89 6.3.1. Condiii n macrocomenzi....................................................................................................90 6.4. MACROCOMENZI SPECIALE................................................................................................................90 6.4.1. Macrocomanda AutoKeys....................................................................................................90 6.4.2. Macrocomanda AutoExec....................................................................................................92 6.5. Crearea meniurilor i a barelor cu instrumente personalizate...............................................93 6.6. Rularea i depanarea macrocomenzilor.................................................................................95 CAP:7. VISUAL BASIC FOR APPLICATIONS (VBA).....................................................................97 7.1 MEDIUL DE PROGRAMARE ACCESS.....................................................................................................97 Ce conin modulele........................................................................................................................97 (General).......................................................................................................................................98 Opiuni..........................................................................................................................................98 Declaraii (Declarations)..............................................................................................................99 Proceduri pentru tratarea evenimentelor......................................................................................99 7.2 PROCEDURI.....................................................................................................................................99 7.2.1 Declararea procedurilor.......................................................................................................99 7.2.2. Lucrul cu argumente opionale..........................................................................................101 7.2.3. Funcii predefinite.............................................................................................................101 7.3. VARIABILE...................................................................................................................................102 7.3.1 Tipuri de date.....................................................................................................................102 7.3.2 Declararea variabilelor......................................................................................................103 7.3.2.2 Option Explicit.................................................................................................................106 7.3.3 Constante............................................................................................................................107 7.3.4 Vizibilitatea i durata de via a variabilelor.....................................................................108 7.3.4.1 Variabile statice...............................................................................................................109 7.3.4.2 Variabile publice.............................................................................................................110 7.4. INSTRUCIUNI DE CONTROL.............................................................................................................113 7.4.1 Instruciunea IfThen........................................................................................................113 7.4.2 Instruciunea IfThenElse..............................................................................................114 7.4.3 Instruciunea ElseIf.............................................................................................................115 7.4.4 Instruciunea Select Case....................................................................................................115 7.4.5 Instruciunea IIf (Immediate If)...........................................................................................116 7.5 INSTRUCIUNI ITERATIVE.................................................................................................................117 7.5.1 Instruciunea ForNext.....................................................................................................117 7.5.2 Instruciunea DoLoop.....................................................................................................118 7.5.3 ntreruperea iterrii............................................................................................................119 7.6 MATRICE......................................................................................................................................119 7.6.1 Matrice statice....................................................................................................................119 Indici...........................................................................................................................................122 7.6.2 Matrice dinamice................................................................................................................122 7.6.3 Detectarea matricelor ........................................................................................................123 7.6.4 Matrice multidimensionale.................................................................................................125 7.6.4.1 Matrice multidimensionale dinamice...............................................................................125 7.6.4.2 Accesarea componentelor unei matrice multidimensionale ............................................126 Pag. 294

7.6.5 tergerea matricelor dinamice............................................................................................127 7.6.6 Folosirea matricelor ca parametri pentru proceduri..........................................................128 7.7 Lucrul cu biblioteci DLL i cu funcii Windows API..............................................................129 7.7.1 Declararea funciilor API...................................................................................................129 7.7.1.1 Domeniul de vizibilitate al funciei API...........................................................................130 7.7.1.2 Denumirea funciei API...................................................................................................130 7.7.1.3 Specificarea bibliotecii DLL............................................................................................130 7.7.1.4 Clauza Alias.....................................................................................................................130 7.7.1.5 Argumente........................................................................................................................131 iruri de caractere ca argumente................................................................................................131 Matrice ca argumente..................................................................................................................132 Transformarea tipurilor de date ale argumentelor......................................................................132 Tipuri-utilizator...........................................................................................................................132 Pointeri nuli.................................................................................................................................133 CAP:8. LUCRUL CU OBIECTE..........................................................................................................134 Proprieti...................................................................................................................................134 Metode ........................................................................................................................................134 Clase............................................................................................................................................135 8.1 OBIECTELE DIN ACCESS 97.............................................................................................................135 Application..................................................................................................................................135 Container.....................................................................................................................................135 8.1.1 Colecii...............................................................................................................................136 Obiectul DBEngine (motorul Jet Engine)....................................................................................139 Colecia Errors (Erori)................................................................................................................139 Colecia Workspaces (Sesiuni de lucru)......................................................................................139 Colecia Databases (Baze de date)..............................................................................................139 Colecia Users (Utilizatori).........................................................................................................140 Colecia Groups (Grupuri)..........................................................................................................140 Colecia QueryDefs (Interogri).................................................................................................140 Colecia TableDefs (Tabele)........................................................................................................140 Colecia Indexes (Indeci)...........................................................................................................140 Colecia Fields (Cmpuri)...........................................................................................................140 Colecia Recordsets (Seturi de nregistrri)................................................................................140 Colecia Relations (Relaii).........................................................................................................141 Colecia Parameters (Parametri)................................................................................................141 Colecia Properties (Proprieti).................................................................................................141 8.1.2 Containere i documente....................................................................................................141 8.2 LUCRUL CU VARIABILE DE TIP OBIECT...............................................................................................142 Cnd folosim semnul exclamrii (!) i cnd punctul (.)...............................................................144 8.3 COLECII IMPLICITE........................................................................................................................144 Container.....................................................................................................................................144 8.4 LUCRUL CU PROPRIETILE OBIECTELOR ............................................................................................145 8.4.1 Tipuri de proprieti...........................................................................................................145 8.4.2. Accesul la proprieti........................................................................................................145 ....................................................................................................................................................145 8.4.3. Stabilirea proprietilor.....................................................................................................145 8.5. CREAREA I MANIPULAREA OBIECTELOR CU DAO.............................................................................146 8.5.1. Crearea obiectelor.............................................................................................................146 8.5.1.1. Crearea unei tabele........................................................................................................148 8.5.1.2 Crearea unui index..........................................................................................................148 8.5.1.3 Crearea unei relaii.........................................................................................................151 8.5.1.4. Crearea proprietilor-utilizator....................................................................................152 Pag. 295

8.5.2. Modificarea obiectelor......................................................................................................153 8.6. OBIECTE DEFINITE DE UTILIZATOR....................................................................................................153 8.6.1. Proprietile i metodele obiectului...................................................................................153 8.6.2 Crearea instanelor obiectului............................................................................................157 8.6.3. Durata de via a obiectelor..............................................................................................158 8.7 LUCRUL CU OBIECTE DE TIP RECORDSET............................................................................................158 8.7.1. Tipuri de seturi de nregistrri...........................................................................................160 8.7.1.1. Seturi de nregistrri de tip tabel..................................................................................161 8.7.1.2. Seturi de nregistrri de tip dynaset................................................................................161 8.7.1.3. Seturi de nregistrri de tip snapshot..............................................................................162 8.7.2. Actualizarea datelor unui set de nregistrri ....................................................................162 8.7.3. Parcurgerea seturilor de nregistrri ...............................................................................163 8.7.4. Regsirea numrului de nregistrri ale unui set de nregistrri ......................................163 8.7.5. Poziia absolut i poziia procentual..............................................................................164 8.7.6. Poziiile de nceput i de sfrit ale setului de nregistrri (BOF i EOF).........................164 8.7.7. Regsirea valorilor cmpurilor unui set de nregistrri ...................................................165 8.7.8. Cutarea nregistrrilor....................................................................................................167 8.7.8.1. Cutri n seturi de nregistrri de tip tabel.................................................................167 8.7.8.2. Cutri n seturi de nregistrri de tip dynaset i snapshot............................................168 8.7.8.3. Criterii ce conin iruri de caractere i date...................................................................170 8.7.9 Semne de carte....................................................................................................................171 8.7.10 Metoda Clone (clonare)....................................................................................................172 8.7.11 Proprietatea RecordsetClone ...........................................................................................172 8.7.12 Sortarea i filtrarea unui set de nregistrri.....................................................................173 8.7.13 Editarea nregistrrilor unui set de nregistrri...............................................................175 8.7.13.1. Modificarea nregistrrii curente.................................................................................176 8.7.13.2 Adugarea unei noi nregistrri la un set de nregistrri..............................................176 8.7.13.3 tergerea unei nregistrri a unui set de nregistrri.....................................................177 8.8. OBIECTE SPECIALE........................................................................................................................177 CAP:9. CREAREA I LUCRUL CU RAPOARTELE......................................................................178 9.1 CREAREA UNUI RAPORT...................................................................................................................179 9.1.1. Crearea rapoartelor cu ajutorul programelor Wizard.......................................................179 9.1.2. Crearea manual a rapoartelor ........................................................................................183 9.2. SURSA DE DATE A RAPORTULUI.......................................................................................................183 9.3. SECIUNILE UNUI RAPORT...............................................................................................................184 9.4. PROPRIETILE UNUI RAPORT..........................................................................................................185 9.5. SORTAREA I GRUPAREA DATELOR...................................................................................................186 9.6. FOLOSIREA FUNCIILOR AGREGAT N CADRUL RAPOARTELOR................................................................188 9.7. EDITAREA RAPOARTELOR ................................................................................................................189 CAP:10. FOLOSIREA DATELOR EXTERNE.................................................................................191 10.1 COPIEREA N SAU DIN ALTE APLICAII..............................................................................................191 10.1.1 Baze de date......................................................................................................................191 10.1.2 Foi de calcul tabelar........................................................................................................194 10.1.3 Fiiere de text...................................................................................................................196 10.1.4 Fiiere de text cu caractere delimitatoare........................................................................197 10.1.5 Fiiere de text cu lime fix.............................................................................................198 10.2 COMPUNEREA MESAJELOR POTALE.................................................................................................198 10.3 EXPORTUL ALTOR OBIECTE............................................................................................................199 10. 4 POTA ELECTRONIC...................................................................................................................201 10.5 DATE EXTERNE............................................................................................................................203 10.6 TABELE LEGATE...........................................................................................................................204 Pag. 296

Diferene ntre tabelele legate i cele locale................................................................................207 10.7 ODBC......................................................................................................................................208 CAP: 11.TRATAREA ERORILOR, DEPANAREA I TESTAREA .............................................209 11.1 ANTICIPAREA ERORILOR................................................................................................................209 PROIECTUL.........................................................................................................................................209 Tabele..........................................................................................................................................210 Interogri....................................................................................................................................210 Formulare i rapoarte ................................................................................................................211 Gruparea funciilor.....................................................................................................................211 11.3 TEHNICI ORIENTATE PE OBIECT PENTRU PREVENIREA APARIIEI ERORILOR..............................................211 ncapsularea................................................................................................................................211 Refolosirea..................................................................................................................................212 Comanda Option Explicit............................................................................................................212 Verificarea sintaxei.....................................................................................................................213 Comentarii ..................................................................................................................................213 11.4 TESTAREA .................................................................................................................................214 Testarea funcional....................................................................................................................214 Testarea modului de utilizare......................................................................................................214 Testarea distructiv.....................................................................................................................215 ntreinerea..................................................................................................................................215 11. 5 TIPURI DE ERORI.........................................................................................................................215 Erori de sintax...........................................................................................................................216 Erori de execuie.........................................................................................................................217 Erori de semantic......................................................................................................................218 Alte erori.....................................................................................................................................223 11.6. DEPANAREA .............................................................................................................................223 Execuia programului..................................................................................................................224 Puncte de ntrerupere..................................................................................................................224 Continuarea execuiei..................................................................................................................224 Stoparea execuiei.......................................................................................................................224 Reiniializarea execuiei..............................................................................................................225 Execuia codului pas cu pas.........................................................................................................225 Repetarea execuiei liniei de cod.................................................................................................226 Saltul peste liniile de cod.............................................................................................................226 Modificarea codului....................................................................................................................226 Stiva de apeluri............................................................................................................................227 Fereastra de depanare (Debug)...................................................................................................227 Elemente de urmrire..................................................................................................................228 11.7 UTILIZAREA SISTEMULUI DE ASISTEN (HELP)................................................................................233 Tratarea erorilor.........................................................................................................................236 Erori n Visual Basic...................................................................................................................237 Utilizarea instruciunilor Exit Function i Exit Sub n rutinele de tratare a erorilor...................243 Erori n formulare i rapoarte.....................................................................................................244 Erori DAO...................................................................................................................................244 Erori definite de utilizator...........................................................................................................245 Stiva de erori...............................................................................................................................246 11.7 DEPANAREA CODULUI DE DEPANARE...............................................................................................251 Controlul de versiune..................................................................................................................251 Controlul de versiune n Access 97..............................................................................................252 Visual SourceSafe........................................................................................................................252 Programul de completare Access SourceSafe..............................................................................253 Pag. 297

CAP: 12.OPTIMIZAREA BAZEI DE DATE.....................................................................................255 12.1 EFICIENA .................................................................................................................................255 12.2 REDUCEREA SUPRANCRCRII MEMORIEI.........................................................................................256 12.2.1 Alegerea corect a tipurilor de date.................................................................................258 12.2.2 Gruparea procedurilor n module.....................................................................................259 12.2.3 Eliminarea comentariilor i secvenelor de cod inutile.....................................................259 12.2.4. Eliberarea memoriei ori de cte ori este posibil..............................................................260 12.2.5 Nu ncrcai n memorie module / biblioteci care nu sunt necesare..................................260 12.2.6 Salvarea bazei de date ca fiier MDE...............................................................................260 12.2.7 O ultim recomandare - cumprai mai mult memorie...................................................261 12.3 CRETEREA VITEZEI DE EXECUIE...................................................................................................261 12.3.1 Cronometrarea execuiei codului......................................................................................262 12.3.2 Folosirea constante..........................................................................................................265 12.3.3 Folosii tipuri specifice de obiecte (asociere iniial).......................................................265 12.3.4 Folosii variabile, nu proprieti......................................................................................266 12.3.5 Folosii funcii ir.............................................................................................................267 12.3.6 Evitai folosirea structurilor lente.....................................................................................268 12.3.8.Folosii operaii aritmetice cu ntregi ori de cte ori este posibil.....................................269 12.3.9 Folosii cod in-line............................................................................................................269 12.3.10 Folosii structura For Each.........................................................................................270 12.3.11 Folosii judicios instruciunea DoEvents........................................................................271 12.3.12 Folosii metoda Requery, nu aciunea Requery...............................................................272 12.3.13 Folosii cuvntul cheie Me..............................................................................................273 12.4 CRETEREA VITEZEI DE EXECUIE A OPERAIILOR CU BAZA DE DATE.....................................................273 12.4.1 Folosii indexuri..............................................................................................................273 12.4.2. Folosii semne de carte....................................................................................................274 12.4.3. Folosii ca surs pentru formulare interogri salvate.....................................................274 12.5. CRETEREA VITEZEI APARENTE......................................................................................................275 12.5.1 Un formular simplu de nceput.........................................................................................275 12.5.2 Folosii indicatoare care ilustreaz progresul operaiei...................................................276 12.5.3 tergei codul din modulele de formulare.........................................................................277 12.5.4 Prencrcai i ascundei formularele...............................................................................277 12.5.5. Stocai datele n memoria local......................................................................................278 12.5.6. Consideraii referitoare la lucrul n reea........................................................................278 12.6. ULTIMELE RETUURI....................................................................................................................279 12.6.1 Compactarea bazei de date...............................................................................................280 12.6.2 Compilarea tuturor modulelor..........................................................................................280 12.6.3 Deschiderea bazelor de date n mod exclusiv...................................................................281 12.7 REZUMAT...................................................................................................................................281 CAP: 13 .INTERNET.............................................................................................................................283 13.1 CE ESTE INTERNETUL?..................................................................................................................283 13.2 PROTOCOALE...............................................................................................................................284 13.3 DATE DE TIP HIPERLEGTUR (HYPERLINK).....................................................................................284 13.4. CUM SE UTILIZEAZ HIPERLEGTURILE?.........................................................................................285 13.5 HIPERLEGTURI N VBA..............................................................................................................286 13.6. PUBLICAREA N WEB...................................................................................................................286 13.6.1 Documente HTML statice ................................................................................................286 13.6.2 Aplicaia wizard HTML Export.........................................................................................287 13.6.3 Internet Data Connector...................................................................................................287 13.6.4.Active Server Pages..........................................................................................................288 13.7. CREAREA UNUI BROWSER.............................................................................................................290 Pag. 298

13.8.REZUMAT...................................................................................................................................291 INTODUCERE........................................................................................................................................300

Pag. 299

Intoducere Acest curs se dorete a fi o prezentare a Mediului de lucru Access 97. Puteti sa facei o mulime de lucruri n Access fr s folosii nici un element de programare. Totui, dac avei intenii serioase privind dezvoltarea bazelor de date i dorii s nzestrai aplicaiile cu o interfa inteligent i profesional, trebuie s v nsuii codul pentru controlul tabelelor i formularelor. Cursul se concentreaz asupra limbajului de programare care st la baza mediului Access 97 Visual Basic for Applications (VBA). Dac nvai s programai n VBA pentru Access, v va fi uor s lucrai cu Ecel, Project i desigur, cu cel mai popular libaj de programare Visual Basic.

Pag. 300

You might also like