Sunteți pe pagina 1din 22

CURS 9: UTILIZAREA LIMBAJULUI VISUAL BASIC PENTRU ACCESS (VBA)

Acum vreo 15 ani, Bill Gates a declarat c toate aplicaiile Microsoft care folosesc proceduri macro vor utiliza un limbaj comun bazat pe limbajul de programare BASIC. BASIC este acronimul pentru Beginners All Purpose Instruction Code, dezvoltat iniial la Dartmouth College. nainte de lansarea produsului Access 1.0, rezultatele decretului lui Gates nu s-au putut vedea dect ntr-un singur produs Microsoft Word for Windows. Odat cu apariia produsului Excel 5.0, Visual Basic Applications Edition (mai cunoscut sub numele de Visual Basic for Applications sau VBA), a devenit lingua franca pentru dezvoltarea produselor firmei Microsoft. Limbajul Visual Basic pentru Access (VBA) este un limbaj orientat pe obiecte i pe evenimente. Obiectele Access se caracterizeaz prin metode i proprieti.

EDITAREA MODULELOR VBA


Aa cum se tie, limbajul Visual Basic este instrumentul de programare pentru aplicaiile informatice dezvoltate cu ajutorul pachetului Office. Modulele din Access sunt obiecte ale bazei de date, care permit scrierea de subrutine (proceduri) n limbajul Visual Basic pentru Access (VBA). Aceste module pot fi constituite din: declaraii de variabile, tipuri de date utilizator, proceduri i/sau funcii etc. Pentru a scrie o procedur i/sau funcie o funcie VBA se alege meniul Create Macro (Module). Procedurile i/sau funciile pot fi asamblate n module n funcie de cerinele programatorului.

Funciile returneaz ntotdeauna o valoare, i ele pot fi: predefinite (standard), deci definite de autorii limbajului VBA, cum ar fi de exemplu funciile: Date()-returneaz data sistemului; IsNull(<expresie>) - returneaz True dac expresia dat ca parametru are valoarea NULL i False n caz contrar; Len(<expresie_sir_de_car>) returneaz lungimea irului de caractere dat ca parametru) i multe altele. - definite de utilizator prin: [Private | Public] Function nume_functie [(param1 as tip_date, )] [as tip_date] Lista parametrilor formali
Tipul de date al rezultatului returnat

Procedurile se definesc de utilizator prin [Private | Public] Sub nume_procedura [(param1 as tip_date, )]
Lista parametrilor formali

Att funciile, ct i procedurile, odat definite, pot fi apelate de cte ori este nevoie doar prin numele lor, urmat de eventualii parametric actuali. Aceaste reapelri se pot face din orice obiect al bazei de date (care permit acest lucru), cu excepia cazului n care au fost declarate Private. Cea mai puternic facilitate a editorului VBA este faptul c acesta evideniaz proprietile i metodele posibile pentru un anumit obiect prin intermediul desfurtorului de obiecte. Afiarea este contextual, adic are loc n momentul scrierii n VBA a elementelor care caracterizeaz un anumit context. Astfel, programatorul nu trebuie s rein cuvintele cheie (proprieti, metode, obiecte, tipuri de date etc.), ci doar s tie de existena acestora. VBA afieaz ntr-un anumit context numai elementele (proprieti, metode, obiecte, tipuri de date etc.) caracteristice acestuia (deci permise, posibile). Pe lng proprieti i metode, fiecare tip de obiect are un numr prestabilit de evenimente posibile, dar cel puin unul. Evenuimentul este declanat de o aciune. Aciunea poate surveni din exteriorul sistemului (declanat de ctre operator) sau declanat prin program. Aciunile de tipul declanrii unui clic sau dublu clic, sau traversarea cu mouse-ul sau acionarea unei taste etc., sunt aciuni efectuate de ctre operator. O procedur inclus ntr-un program poate declana un eveniment n mod automat. Pe de alt parte evenimentele declaneaz procedurile. O astfel de programare este denumit event-driven, adic dirijat de evenimente. VBA combin deci elemente ale programrii orientate pe obiect cu elemente ale programrii orientate pe evenimente. OBIECTE I COLECII ACCESS O baz de date Access este format dintr-o mulime de obiecte, care se pot folosi din VBA. Pe lng propriile obiecte, definite n Access2000, acesta mai dispune de cteva componente care ajut programatorul n manipularea datelor i administrarea ubei baze de date. Aceste componente dispun la rndul lor de propriile obiecte pentru manipularea datelor. Dintre acestea amintim dou care sunt mai puternice : - Microsoft ActiveX Database Object (ADODB) ; - Microsoft Database Active Object (DAO). Unele obiecte predefinite din Access2000 au asociate colecii, care sunt de asemenea obiecte. Coleciile conin obiecte cu aceleai caracteristici. Practic putem spune c n Access sunt predefinite tipuri de obiecte, fiecare tip de obiect avnd asociat o colecie n care regsim obiectele din tipul respectiv. Obiectele dintr-o colecie sunt practic obiecte definite de utilizator (formulare, rapoarte, tabele etc.) sau create automat de Access (sesiuni de lucru etc.).. Obiectele i coleciile din Access sunt organizate ntr-o structur ierarhic. Un obiect poate s conin un alt obiect .a.m.d. De exemplu un raport este un obiect de tip Report (care aparine coleciei Reports), iar raportul conine controale, care sunt obiecte de tip Control (i aparin coleciei Controls). Fiecare colecie dispune de proprietatea Count, care indic numrul de elemente din aceasta. Sintaxa utilizrii obiectelor din VBA Invocarea unei metode sau proprieti a unui obiect se face prin prefixarea acestora cu numele obiectului: nume_obiect.nume_metod nume_obiect.nume_proprietate 2

Referirea unor proprieti care sunt la rndul lor obiecte se face dup cum urmeaz: nume_obiect.nume_proprietate_obiect.nume_metod nume_obiect. nume_proprietate_obiect.nume_proprietate Specificarea unui obiect aparinnd unei colecii se poate face n una din urmtoarele variante: 1) nume_obiect_colectie![nume_obiect] este nevoie de paranteze drepte numai dac numele obiectului conine spaii. 2) nume_obiect_colectie ("nume_obiect") 3) nume_obiect_colectie (index_obiect) unde index_obiect este un numr care indic poziia n colecie a unui obiect. Aceste numere de ordine ncep de la zero. Exemple: - un formular creat de utilizator aparine coleciei de formulare ( Forms) i va putea fi referit prin: Forms.nume_formular - numele unui control de pe un formular va putea fi referit din VBA prin: Forms.nume_formular.nume_control Dac se dorete invocarea unei metode/proprieti a unui obiect dintr-o colecie se procedeaz astfel: nume_colectie.nume_ obiect.nume_metod nume_colectie.nume_ obiect.nume_proprietate Exemple: - Forms.[formular Furnizori].[cod furnizor].SetFocus are ca efect poziionarea cursorului pe cmpul cod furnizor de pe formularul formular Furnizori. - Forms.[formular Furnizori].cmd_iesire.Visible=False are ca efect poziionarea pe False a proprietii Visible a butonului de comand cmd_iesire de pe formularul formular Furnizori. (proprietatea Visible pe False face ca respectivul buton s nu mai fie vizibil pe form, pn la momentul cnd proprietatea Visible va fi setat pe True). PRINCIPALELE OBIECTE VBA 1) Application acest obiect se refer la aplicaia Access activ; conine toate obiectele i coleciile Microsoft Access; permite un numr mare de proprieti i metode. Dintre metode enumerm: Quit: nchide aplicaia i Microsoft Access Sintaxa: Application.Quit [optiune] unde opiune poate fi una din constantele de mai jos:
Constant acSaveYes acPrompt acExit Descriere Salveaz toate obiectele fr afiarea csuei de dialog Afieaz csua de dialog i ntreab utilizatorul dac salveaz sau nu nchide Microsoft Access fr a salva nici un obiect

CloseCurrentDatabase: nchide baza de date curent Sintaxa: Application.CloseCurrentDatabase OpenCurrentDatabase: deschide o baz de date existent Sintaxa: Application.OpenCurrentDatabase NumeDb [, exclusive] unde NumeDb este numele bazei de date, precedat eventual de calea acesteia, iar parametrul exclusive precizeaz dac baza de date este deschis n mod exclusiv sau nu (adic dac poate fi utilizat doar local, sau poate fi utilizat de ctre mai muli utilizatori, prin acces distribuit). NewCurrentDatabase: creeaz o nou baz de date Sintaxa: Application.NewCurrentDatabase NumeDb unde NumeDb este numele bazei de date, precedat eventual de calea acesteia. 3

Exemplu : Private Sub Command7_Click() Dim Obiect As Access.Application Set Obiect=CreateObject("Access.Application") Obiect.NewCurrentDatabase "D:\Cornelia\BazaNoua.mdb" End Sub Run: permite executarea unei proceduri sau funcii Sintaxa: Application.Run procedura [,arg1, arg2, ...] unde procedura este numele procedurii (funciei), i arg1, arg2 etc. sunt argumente ce vor fi transmise la apelul procedurii (funciei). Se accept maxim 30 de argumente. Exemplu: Se afieaz valoarea n funcie de cantitatea i preul aferent. Private Sub Command9_Click() MsgBox "Valoarea este:" & Application.Run ("Valoare", _ InputBox("Introduceti cantitatea:"), InputBox("Introduceti pretul:")) End Sub unde Valoare este o funcie, definit ca mai jos: Function Valoare(Cantitate As Single, Pret As Single) As Single Valoare=Cantitate * Pret End Function RunCommand: permite executarea unei comenzi din meniul Access Sintaxa: [obiect].RunCommand comanda unde obiect poate fi obiectul Application sau DoCmd, iar comanda este o constant Access care specific o opiune din meniu Exemplu: S se execute comanda Find din meniul Edit. Private Sub Command10_Click() Docmd.RunCommand acCmdFind End Sub 2) DoCmd acest obiect permite executarea unor aciuni n cadrul procedurilor sau funciilor; el dispune numai de metode (nu i de proprieti). Sintaxa: [Application.]DoCmd.metoda [arg1, arg2, ] unde Application reprezint un obiect de tipul Application i este opional, metoda este o metod suportat de acest obiect i arg1, arg2, sunt eventualii parametri ai metodei selectate. Dintre metodele acestui obiect enumerm: Beep: are ca efect un zgomot sonor Sintaxa: DoCmd.Beep OpenTable: permite deschiderea unei tabele din baza de date curent Sintaxa: DoCmd.OpenTable nume [, mod_vizualizare] [, mod_editare] unde nume este numele tabelei i urmtorii doi parametri sunt dai de nite constante Access opionale: Primul parametru, mod_vizualizare, stabilete modul de vizualizare a tabelei, ca mai jos:
Constant acViewDesign acViewNormal Descriere Se afieaz fereastra Design, de modificare a structurii tabelei Se afieaz fereastra Datasheet, cu nregistrrile coninute de tabel. Acest parametru este implicit, n cazul cn care nu se specific nici

acViewPreview

unul din cele trei constante. Se afieaz fereastra de previzualizare nainte de imprimare a nregistrrilor coninute de tabele specificat

Al doilea parametru, mod_editare, se refer la drepturile de modificare asupra nregistrrilor din tabel. Constantele posibile sunt cele din tabela de mai jos:
Constant acAdd acEdit acReadOnly Descriere Tabela e deschis numai pentru adugarea de nregistrri Tabela e deschis pentru toate operaiile de actualizare (adugare, modificare tergere). Acest parametru este implicit. Nu este permis actualizarea nregistrrilor

Exemplu: S se deschid tabele Clienti n modul implicit DoCmd.OpenTable "Clienti" DoCmd.OpenTable "Clienti", acViewNormal, acEdit

este echivalent cu:

ApplyFilter: permite aplicarea unui filtru asupra unui set de nregistrri Sintaxa: DoCmd.ApplyFilter [nume_filtru] [, conditie] unde nume_filtru este o expresie text i reprezint numele unui Query din baza de date curent iar conditie este o expresie text i reprezint condiia pentru care se realizeaz acel filtru. Exemplu: S se selecteze nregistrrile care au cmpul Vechime>5. Private Sub Command2_Click() Docmd.ApplyFilter , "Vechime>5" End Sub Dup execuia procedurii de mai sus condiia "Vechime>5" este salvat la proprietatea Filter a obiectului de tip Form pe care se afl butonul de comand Command2. OpenForm: permite deschiderea unui formular din baza de date curent Sintaxa: DoCmd.OpenForm nume [, mod_vizualizare] [, nume_filtru] [, conditie] [, mod_editare] [, tip_fereastra] [, parametrii_formular] unde nume este numele formularului ce se dorete a fi deschis, iar restul parametrilor sunt opionali. Astfel, mod_vizualizare stabilete modul de vizualizare al formularului, asemntor cu ce a fost prezentat la metoda OpenTable:
Constant acDesign acFormDS acNormal acPreview Descriere Se deschide fereastra de proiectare (Design) a formularului Formularul este deschis n modul actualizare nregistrri (Open Form), ns n modul de afiare nregistrri (DataSheet). Formularul este deschis n modul actualizare nregistrri (Open Form), ns afiat pe ecran aa cum a fost el construit n fereastra Design Form. Acest parametru este implicit. Formularul este deschis n modul previzualizare nainte de imprimare

Parametrul nume_filtru const dintr-un ir de caractere care indic o interogare din baza de date folosit pentru a filtra nregistrrile afiate n formular. Proprietatea Filter a formei va fi setat cu valoarea criteriului din query. Parametrul conditie const dintr-un ir de caractere care conine o clauz SQL WHERE valid pentru a selecta numai anumite nregistrri care s fie afiate n formular. Se utilizeaz fr cuvntul cheie WHERE. Exemplu: S se deschid formularul Materiale care conine doar materialele care au codul <5 DoCmd.OpenForm "Materiale", acNormal, , "CodMaterial<5" 5

Parametrul mod_editare reprezint o constant care indic modul de deschidere al formularului din punct de vedere al drepturilor de actualizare asupra nregistrrilor afiate de formular. Constantele posibile sunt cele din tabela de mai jos:
Constant acFormAdd acFormEdit acFormReadOnly acFormPropertySetting s Descriere Formularul este deschis numai pentru adugare de nregistrri (nregistrrile deja existente nu sunt accesibile) Sunt permise toate operaiile de actualizare n formular. Nu este permis nici o operaie de actualizare n formular Sunt permise toate operaiile de actualizare n formular. Acest parametru este implicit

Parametrul tip_fereastra reprezint o constant care indic n ce fel de fereastr se deschide formularul. Constantele posibile sunt :
Constant acWindowNormal acDialog acHidden acIcon Descriere Fereastra formularului este normal (se comport n funcie de valorile proprietilor sale). Acest parametru este implicit. Formularul nu poate fi redimensionat Fereastra formularului este invizibil Formulorul este afiat minimizat

Parametrii_formular reprezint o expresie de tip ir de caractere care seteaz proprietatea OpenArgs a formularului n momentul deschiderii. Cu ajutorul acestui parametru se pot crea formulare generalizate pentru anumite operaii asemntoare. Astfel, de exemplu, se poate crea un singur formular generalizat pentru adugare, modificare i tergere date dintr-o tabel, n loc de a crea cte un formular separat pentru fiecare operaie. (Un exemplu de utilizare a acestui parametru este n aplicaia Laborator8.mdb la clic pe butonul Actualizare Furnizori din meniul principal: Forma AFurnizori va fi folosit cnd n modul Adaugare - cu titlul ferestrei Adaugare furnizori cu anumite controale fcute invizibile i cu proprietatea DataEntry setat pe True, cnd n modul ModSterg, cu titlul ferestrei Modificare/Stergere furnizori i cu proprietatea AllowAdditions setat pe False. OpenReport: permite deschiderea unui raport dintr-o aplicaie Access Sintaxa: DoCmd.OpenReport nume [, mod_vizualizare] [, nume_filtru] [, conditie] unde nume este numele raportului i urmtorii parametri sunt opionali: Primul parametru, mod_vizualizare, stabilete modul de vizualizare a raportului, ca mai jos:
Constant acViewDesign acViewNormal acViewPreview Descriere Se afieaz fereastra de proiectare a raportului ( Design Report) Raportul este listat la imprimant. Acest parametru este implicit. Raportul este deschis n modul previzualizare.

Urmtorii doi parametri, nume_filtru i conditie, au aceeai semnificaie ca la metoda OpenForm. Exemplu: S se deschid n mod previzualizare (pe ecran) raportul Clienti, care conine doar clientii al cror nume ncepe cu literele "SC". DoCmd.OpenReport "Clienti", acViewPreview, , "[nume client] like 'SC*' " OpenQuery: permite deschiderea unei interogri ntr-o aplicaie Access Sintaxa: DoCmd.OpenQuery nume [, mod_vizualizare] [, mod_editare] unde nume este numele interogrii i urmtorii parametri sunt opionali, avnd aceeai semnificaie i valori ca la metoda OpenTable. 6

Exemplu: S se deschid n mod proiectare interogarea FurnFact permind orice fel de modificare. DoCmd.OpenQuery "FurnFact", acViewDesign, acEdit Close: permite nchiderea unui obiect dintr-o aplicaie Access Sintaxa: DoCmd.Close [tip_obiect, nume_obiect] [, salvare] unde toi parametrii sunt opionali; tip_obiect este o constant care indic tipul obiectului care se va nchide i poate fi una din urmtoarele valori:
Constant acDefault acTable acForm acReport acQuery acModule acMacro Descriere Indic tipul implicit ntr-un context anume Indic un tabel. Indic un formular. Indic un raport. Indic o interogare. Indic un modul. Indic un macro.

Dac acest parametru nu este cel implicit (acDefault), el trebuie urmat obligatoriu de al doilea parametru, nume_obiect, care indic numele obiectului ce se va nchide. Parametrul salvare reprezint o constant care indic dac eventualele modificri ale obiectului vor fi salvate sau nu nainte ca obiectul s fie nchis. Valorile acestei constante sunt cele de mai jos:
Constant acSaveNo acSavePrompt acSaveYes Descriere Obiectul este nchis fr a fi salvate eventualele modificri ale sale Utilizatorul este ntrebat despre salvarea sau nu a eventualelor modificri ale obiectului ce se va nchide. Obiectul este nchis salvnd automat toate modificrile fcute asupra sa. Este valoarea implicit a acestui parametru.

Exemplu: S se nchid formularul Materiale salvnd automat toate modificrile. DoCmd.Close acForm,"Materiale", acSaveYes Quit: are ca efect ieirea din baza de date i din Access Sintaxa: DoCmd.Quit [salvare] unde parametrul opional salvare indic dac eventualele obiecte nesalvate vor fi salvate la ieirea din Access sau nu. Acest parametru poate avea una din urmtoarele valori:
Constant acQuitSaveNone acQuitPrompt acSaveAll Descriere Se iese din Access fr salvarea obiectelor nesalvate Utilizatorul este ntrebat despre salvarea sau nu a obiectelor nesalvate Se iese din Access cu salvarea automat a obiectelor nesalvate. Este valoarea implicit a acestui parametru.

Restore: are ca efect restaurarea ferestrei active la dimensiunea standard de definire. Sintaxa: DoCmd.Restore Aceast comand este util la deschiderea formularelor n cazul n care fereastra bazei de date ar fi maximizat. n acest caz i celelalte formulare care se deschid vor fi tot maximizate , avnd astfel un design poate urt, dar utiliznd metoda Restore formularul este redimensionat la dimensiunea la care a fost definit. Minimize: are ca efect minimizarea ferestrei active Sintaxa: DoCmd.Minimize Maximize: are ca efect maximizarea ferestrei active Sintaxa: DoCmd.Maximize 7

GoToRecord: are ca efect deplasarea la o anumit nregistrare, afiat cu un anumit obiect. Sintaxa: DoCmd.GoToRecord [tip_obiect, nume_obiect] [, nregistrare] [, deplasament] unde toi parametrii sunt opionali; tip_obiect este o constant care indic tipul obiectului n care sunt afiate nregistrrile. Valorile posibile sunt:
Constant acActiveDataObject acDataForm acDataQuery acDataTable Descriere Indic faptul c nregistrrile se afl n obiectul care este activ n momentul apelului. Este parametrul implicit. Indic faptul c nregistrrile se afl ntr-un formular Indic faptul c nregistrrile se afl ntr-o interogare Indic faptul c nregistrrile se afl ntr-o tabel

Dac acest parametru nu este cel implicit (acActiveDataObject), el trebuie urmat obligatoriu de al doilea parametru, nume_obiect, care indic numele obiectului n care se gsesc nregistrrile. Parametrul inregistrarea indic la ce nregistrare se face deplasarea. Valorile acestei constante sunt:
Constant acFirst acPrevious acNext acLast acNewRec ecGoTo Descriere Indic o deplasare la prima nregistrare Indic o deplasare la nregistrarea precedent Indic o deplasare la nregistrarea urmtoare. Este valoarea implicit. Indic o deplasare la ultima nregistrare Indic o deplasare la o nregistrare nou Indic o deplasare la o nregistrare specificat (mpreun cu parametrul deplasament)

Parametrul deplasament reprezint un numr ce indic cu cte nregistrri se face deplasarea nainte (pentru acNext), napoi (pentru acPrevious) sau la o anumit nregistrare (pentru acGoTo). Exemplu: Se dorete ca la ncrcarea unui formular indicatorul de nregistrri s se deplaseze automat pe o nou nregistrare. Pentru aceasta se va scrie urmtoarea procedur pentru evenimentul Load al formei respective : Private Sub Form_Load() DoCmd.GoToRecord , , acNewRec End Sub RunSQL: permite execuia unei fraze SQL care definete o interogare de aciune Sintaxa: DoCmd.RunSQL frazaSQL [, tranzactie] unde frazaSQL reprezint un ir de caractere care indic o fraz SQL ce definete o interogare de aciune. Se pot folosi urmtoarele comenzi SQL: INSERT INTO, SELECT ... INTO, DELETE, UPDATE, CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX sau DROP INDEX . Al doilea parametru este opional i indic dac interogarea de aciune SQL va fi tranzacionat (inclus n tranzacie, caz n care valoarea acestui parametru este True) sau nu (neinclus n tranzacie, caz n care valoarea acestui parametru este False). Exemplu: Se dorete s se tearg toate nregistrrile din tabela "Materiale", folosind SQL DoCmd.RunSQL "Delete * From Materiale" Save: determin salvarea unui anumit obiect Sintaxa: DoCmd.Save [tip_obiect, nume_obiect] unde toi parametrii sunt opionali; tip_obiect este o constant care indic tipul obiectului care se va nchide i poate fi una din urmtoarele valori:
Constant acDefault acTable acForm Descriere Indic obiectul implicit ntr-un context anume Indic un tabel. Indic un formular.

acReport acQuery acModule acMacro

Indic un raport. Indic o interogare. Indic un modul. Indic un macro.

Dac acest parametru nu este cel implicit (acDefault), el trebuie urmat obligatoriu de al doilea parametru, nume_obiect, care indic numele obiectului ce se va nchide. 3) Form acest obiect refer un obiect de tip formular. Toate formularele deschise din baza de date se regsesc n colecia Forms, fiind identificate printrun numr (indice) alocat n ordinea deschiderii acestora. Primul formular deschis are indicele zero. Pentru a afla numrul de formulare deschise la un moment dat, trebuie citit proprietatea Count a coleciei Forms. Pentru a referi un formular anume, din VBA se poate folosi una din urmtoarele sintaxe: Forms.nume_formular sau Forms!nume_formular Forms.[nume_formular] parantezele sunt obligatorii dac numele formularului conine spaii Forms("nume_formular") Forms(indice) unde indice este numrul de ordine al formularului n cadrul coleciei Forms Exemple: Forms.Clienti Forms![Clienti] Forms("Clienti") Forms(0) Referirea la formularul curent se poate face folosind i proprietatea Me. Exemplu: Referirea la un control cu numele CodClient din cadrul formularului Clienti se poate realiza utiliznd una din urmtoarele sintaxe: 1) referirea implicit: Forms.Clienti.CodClient sau Me.CodClient sau Me!CodClient 2) referirea explicit: Forms.Clienti.Controls.CodClient sau Me.Controls.CodClient Obiectul Form permite un numr mare de proprieti i metode. Cteva din cele mai importante proprieti ale obiectului Form au fost prezentate n cursul 6 (despre formulare), la pag. 9 i 10. Proprietile formularelor sunt vizibile n fereastra Properties, n cele 4 seciuni (Format, Data, Event, Other) i grupate mpreun n seciunea All. Programatorul se poate familiariza cu proprietile unui formular construind ct mai multe formulare i setnd manual proprietile acestora. (Proprietile pot fi ns setate i dinamic (n timpul rulrii aplicaiei), prin cod VBA. Mai amintim sau reamintim totui cteva proprieti: OpenArgs: reprezint un ir de caractere care poate fi transmis ca parametru la deschiderea unui formular. Recordsource: reprezint numele unei tabele, interogri sau o fraz SQL ce are ca rezultat un set de nregistrri de care este ataat formularul DataEntry: seteaz modul n care formularul este deschis numai pentru introducerea de nregistrri noi Caption: reprezint un ir de caractere afiat n bara de titlu a ferestrei formularului NavigationButtons: seteaz activarea (True) sau dezactivarea (False) controlului pentru deplasarea ntre nregistrrile unui formular AutoCenter: formularul este afiat pe centrul ecranului AutoResize: formularul se redimensioneaz pe ecran automat astfel nct s se vad tot coninutul su Toolbar: indic bara de instrumente afiat odat cu formularul 9

Controls: reprezint colecia de controale de pe un formular (vezi descrierea obiectului Control, ce va urma) ControlBox: seteaz activarea (True) sau dezactivarea (False) butoanelor de control ale ferestrei formularului RecordSelectors: seteaz apariia marcatorului de nregistrare pe formular ( True) sau dezactivarea acestuia (False).

Dintre metodele obiectului Form enumerm: Refresh: actualizeaz modificrile n nregistrrile din sursa formularului Sintaxa: Form.Refresh Requery: reactualizeaz nregistrrile din formular (dac formularul are ca surs o interogare se reface aceasta) Sintaxa: Form.Requery Observaie: Metoda Requery se poate folosi i pentru un obiect de tip Control, nu doar Form. Repaint: actualizeaz (redeseneaz) pe ecran formularul pentru care s-a apelat aceast metod Sintaxa: Form.Repaint SetFocus: se mut focus-ul (focalizarea, cursorul) pe formularul specificat, pe controlul specificat din formularul activ sau pe un cmp specificat dintr-un datasheet activ. Sintaxa: Obiect.SetFocus unde Obiect este un obiect de tip Form reprezentat de un formular, sau de tip Control, reprezentat de un control al unui formular sau datasheet activ. Exemplu: S se mute focus-ul pe controlul cu numele CodClient de pe formularul Clienti: Forms!Clienti!CodClient.SetFocus Undo: se folosete atunci cnd se dorete anularea modificrilor nregistrrii curente. Sintaxa: Obiect.Undo unde Obiect este un obiect de tip Form reprezentat de un formular, sau de tip Control, reprezentat de un control al unui formular sau datasheet activ. 4) Report refer un obiect de tip raport dintr-o baz de date Access. Toate rapoartele deschise din baza de date se regsesc n colecia Reports. Pentru a afla numrul de rapoarte deschise la un moment dat, trebuie citit proprietatea Count a coleciei Reports. Pentru a referi un raport anume, din VBA se poate folosi una din variantele similare celor prezentate la obiectul Form. Exemple: Reports.[RapClienti] sau Reports![RapClienti] Reports("RapClienti") Reports(0) Referirea la raportul curent se poate face folosind i proprietatea Me. Exemplu: Referirea la un control cu numele CodClient din cadrul raportului RapClienti se poate realiza utiliznd una din urmtoarele sintaxe: 1) referirea implicit: Reports.[RapClienti].CodClient sau Me.CodClient sau Me!CodClient 2) referirea explicit: Reports.[RapClienti].Controls.CodClient sau Me.Controls.CodClient Proprietile obiectului Report se pot urmri n fereastra Properties a obiectului de tip raport activ. Dintre proprietile obiectului Report amintim Caption, RecordSource, Toolbar i Controls, care au aceeai semnificaie ca n cazul obiectului Form. Principala metod a acestui obiect este Print. Alte metode ale obiectului Report sunt Circle, care traseaz un cerc, elips sau un arc de cerc i Line, care traseaz o linie sau un dreptunghi. 10

5) Control refer un control de pe un raport, formular sau dintr-o seciune a acestora. Toate controalele dintr-un raport, formular sau dintr-o seciune le regsim n colecia Controls. Principalele metode ale obiectului Control sunt: SetFocus: are ca efect activarea unui control (mutarea focus-ului pe controlul respectiv) Sintaxa: Obiect.SetFocus unde Obiect este un obiect de tip Form reprezentat de un formular, sau de tip Control, reprezentat de un control al unui formular sau datasheet activ. Exemplu: S se mute focus-ul pe controlul cu numele CodClient de pe formularul Clienti: Forms!Clienti!CodClient.SetFocus Undo: se folosete atunci cnd se dorete anularea modificrilor efectuate asupra valorii coninute de control Sintaxa: Obiect.Undo unde Obiect este un obiect de tip Form reprezentat de un formular, sau de tip Control, reprezentat de un control al unui formular sau datasheet activ. Requery: reactualizeaz nregistrrile din sursa de date a unui control de tip list derulant (ComboBox), list de valori (ListBox) sau subformular (SubForm) Sintaxa: Obiect.Requery Principalele proprieti ale obiectului Control sunt: Visible: indic dac un control este vizibil (True) sau nu (False) Exemplu: S se fac invizibil controlul cu numele CodClient de pe formularul Clienti: Forms!Clienti!CodClient.Visible=False Enabled: indic dac un control este utilizabil (True) sau nu (False) Exemplu: S se fac inutilizabil controlul cu numele cmdiesire de pe formularul Clienti: Forms!Clienti!cmdiesire.Enabled=False ColumnCount: indic numrul de coloane dintr-un control de tip ListBox sau ComboBox ListCount: indic numrul de linii dintr-un control de tip ListBox sau ComboBox PROGRAMAREA DIRIJAT DE EVENIMENTE N ACCESS Se poate vorbi de programare dirijat de evenimente n Access n contextul formularelor, rapoartelor i controalelor de pe un formular/raport sau seciunile acestora. Evenimentele reprezint aciuni exercitate de utilizator sau impiuse de sistem care sunt recunoscute de obiecte i pentru care se pot elabora secvene de cod VBA sau comenzi macro ce vor fi executate n momentul producerii evenimentului. Exemple de evenimente n Access sunt: efectuarea unui clic sau dublu-clic cu mouse-ul asupra unui buton de comand, deschiderea sau nchiderea unui formular/raport, selectarea unei opiuni dintr-o list derulant, redimensionarea unei ferestre, scrierea unei nregistrri ntr-o tabel sau tergerea unei nregistrri dintr-o tabel, apariia unei erori etc. Tuturor evenimentelor din Access li se pot ataa proceduri, care s execute anumite aciuni la apariia rerspectivelor evenimente. Astfel, de exemplu, la evenimentul de deschidere a unui formular se poate ataa o procedur/funcie care s testeze dac un anumit utilizator are drepturi de utilizare a acestuia sau nu, sau, nainte de salvarea unei nregistrri ntr-o tabel se poate ataa o procedur care s verifice respectarea anumitor corelaii dintre date etc. Avantajele programrii dirijate de evenimente fa de modelul de programare procedural sunt multiple, decurgnd din faptul c programarea dirijat de evenimente nu este limitat la o serie de instruciuni grupate n proceduri ramificate, ci se bazeaz pe administrarea intrrilor, pe interaciunea direct cu utilizatorul, oferind acestuia un mai mare grad de libertate n exploatarea aplicaiei.

11

Lista cu evenimentele ce se pot trata n cadrul formularelor/rapoartelor i controalelor se poate obine din fereastra cu proprieti, seciunea Event. Programatorul i alege evenimentul dorit dup care se trece la elaborarea procedurii ce se dorete a fi ataat acestui eveniment.

Pentru a ataa o procedur unui eveniment se activeaz , alegndu-se Event Procedure, dup care se activeaz . Pentru a ataa o procedur unui eveniment se poate apsa i mai nti, dup care din fereastra Choose Builder se alege Code Builder. Pentru a ataa o funcie unui eveniment se alege Expression Builder din fereastra Choose Builder, apoi, din seciunea Functions se alege categoria de funcii (Built-In Functions funcii Access sau funcii definite de utilizator). Dac sunt funcii definite de utilizator se alege mai nti modulul n care acestea au fost definite.

12

Procedurile ataate evenimentelor controalelor de pe un formular/raport sunt memorate n module care sunt ataate formularelor/rapoartelor. Acestea nu sunt vizibile n seciunea Module a bazei de date. Fiecare formular/raport are ataat un singur modul. Din acest modul se poate referi formularul/raportul curent prin cuvntul cheie Me. Toate obiectele de pe un formular/raport sunt vizibile n modulul ataat acestuia din toate procedurile. Procedurile ataate evenimentelor controalelor de pe un formular/raport sunt memorate n aceleai module n care sunt memorate procedurile ataate formularelor/rapoartelor. Acestea nu trebuie apelate explicit de ctre programator nicieri, deoarece se apeleaz automat la declanarea evenimentului. Un eveniment odat declanat avem posibilitatea: s-l ignorm (neatandu-i nici o procedur de tratare); s i atam o procedur de tratare; s l abandonm dac dorim i dac este permis abandonarea n cazul respectivului eveniment. Aceast abandonare a evenimentului se face fcnd uz de parametrul pus la dispoziie de procedura de tratare a evenimentului (de obicei acest parametru se numete Cancel i dac este setat pe True evenimentul este abandonat Observaie: Nu toate procedurile de tratare a unor evenimente au posibilitatea de abandonare a acestora).

1. Evenimente ataate formularelor


Pentru a obine lista cu proprieti a unui formular se selecteaz mai nti formularul (cu Select Form din meniul Edit sau se selecteaz butonul din partea de stnga-sus a ferestrei formularului), dup care se activeaz butonul Properties sau se alege opiunea Properties din meniul View. Pentru a vedea lista cu evenimente care se pot programa se alege seciunea Event. n figura de mai jos se pot vedea o parte (lista se continu!) din evenimentele care pot fi tratate pe un formular:

13

Observaii: 1) Tratarea evenimentelor unui formular nu afecteaz evenimentele unui subformular ataat acestuia. 2) Programatorul poate abandona un eveniment setnd pe True parametrul Cancel pentru respectiva procedur de tratare a evenimentului. Acest lucru este posibil numai pentru acele procedurieveniment care permit acest lucru, avnd ataat automat parametrul Cancel n antetul procedurii, ca n cazul evenimentului On Open, care va conduce la completarea urmtoarei proceduri de tratare a evenimentului de deschidere a unui formular: Private Sub Form_Open(Cancel As Integer) ... End Sub Exemplu: Se dorete ca la deschiderea unui formular s se verifice mai nti dac utilizatorul este autorizat s se foloseasc de acel formular, cerndu-i-se introducerea unei parole. n caz c parola este corect are loc evenimentul de deschidere a formularului iar n caz contrar se afieaz un mesaj corespunztor i deschiderea formularului este abandonat. n acest caz procedura-eveniment ataat evenimentului Open va fi urmtoarea: Private Sub Form_Open(Cancel As Integer) If InputBox("Tastati parola:") <> "parola" Then MsgBox "Nu sunteti autorizat sa folositi acest formular!" Cancel = True End If End Sub Evenimentele On Open, On Load i On Activate i respectiv On Close, On Unload i On Deactivate 14

Dorim s clarificm deosebirea ntre evenimentele On Open, On Load i On Activate (ce par poate identice la prima vedere, dar nu sunt!) a unui formular i similar ntre evenimentele On Close, On Unload i On Deactivate a unui formular. On Open se produce la deschiderea formularului, nainte ca o nregistrare din tabela sau interogarea ataat formularului (existent n proprietatea RecordSource) s fie afiat pe ecran. Acest eveniment se poate abandona. Procedura ataat evenimentului On Open are urmtorul antet: Private Sub Form_Open(Cancel As Integer) Parametrul Cancel determin dac formularul va fi deschis sau nu. Pentru a nu deschide formularul Cancel va trebui setat pe True. On Load se produce la deschiderea formularului, n momentul n care o nregistrare din tabela sau interogarea ataat formularului este afiat pe ecran. Acest eveniment nu se poate abandona. Procedura ataat evenimentului On Load are urmtorul antet: Private Sub Form_Load() On Activate se declaneaz atunci cnd un formular devine fereastr activ pe ecran (fereastra activ este cea care are bara de titlu albastr, i nu gri, i care deine dialogul cu utilizatorul la momentul respectiv). n contextul acestui eveniment la deschiderea formularului ordinea evenimentelor este urmtoarea: On Open On Load On Activate Nici acest eveniment (On Activate) nu se poate abandona. Procedura ataat evenimentului On Activate are urmtorul antet: Private Sub Form_Activate() On Unload se produce la nchiderea formularului, dar nainte de tergerea sa de pe ecran. Acest eveniment se poate abandona. Procedura ataat evenimentului On Unload are urmtorul antet: Private Sub Form_Unload(Cancel As Integer) La setarea parametrului Cancel pe True evenimentul de nchidere a formularului se va abandona. On Close se produce la nchiderea i tergerea de pe ecran a formularului. Acest eveniment nu se poate abandona. Procedura ataat evenimentului On Close are urmtorul antet: Private Sub Form_Close() On Deactivate se declaneaz atunci cnd un formular nu mai este fereastr activ pe ecran. Nici acest eveniment nu se poate abandona. Procedura ataat evenimentului On Deactivate are urmtorul antet: Private Sub Form_Deactivate() Astfel, la nchiderea unui formular ordinea de declanare a evenimentelor este urmtoarea: On Unload On Deactivate On Close Evenimentul On Resize On Resize se declaneaz ori de cte ori se ncearc redimensionarea unui formular, inclusiv la deschiderea acestuia, atunci cnd e construit fereastra formularului. Acest eveniment nu se poate abandona. Procedura ataat evenimentului On Resize are urmtorul antet: Private Sub Form_Resize() Exemplu: Private Sub Form_Resize() MsgBox "Se incearca redimensionare ferestrei ! " 15

End Sub Evenimentul On Current On Resize se declaneaz atunci cnd o nregistrare din tabela sau interogarea ataat formularului devine nregistrare curent. Acest eveniment nu se poate abandona. Procedura ataat evenimentului On Current are urmtorul antet: Private Sub Form_Current() Exemplu: Private Sub Form_Resize() MsgBox "Se incearca redimensionare ferestrei ! " End Sub Evenimentele BeforeInsert, AfterInsert, BeforeUpdate i AfterUpdate BeforeInsert se declaneaz exact naintea momentului n care se ncearc inserarea (crearea) unei nregistrri noi pe formularul curent. Acest eveniment se poate abandona. Procedura ataat evenimentului BeforeInsert are urmtorul antet: Private Sub Form_BeforeInsert(Cancel As Integer) Parametrul Cancel se folosete pentru a abandona inserarea unei nregistrri noi. Pentru acest lucru trebuie setat Cancel=True. AfterInsert se declaneaz dup momentul n care s-a inserat o nregistrare nou pe formularul curent. Acest eveniment nu se poate abandona. Procedura ataat evenimentului AfterInsert are urmtorul antet: Private Sub Form_AfterInsert() BeforeUpdate se declaneaz naintea momentului de salvare a unei nregistrri (noi sau nu) pe formularul curent. Acest eveniment se poate abandona. Procedura ataat evenimentului BeforeUpdate are urmtorul antet: Private Sub Form_BeforeUpdate(Cancel As Integer) Parametrul Cancel se folosete pentru a abandona salvarea nregistrrii. Pentru acest lucru trebuie setat Cancel=True. AfterUpdate se declaneaz dup momentul de salvare a unei nregistrri (noi sau nu) pe formularul curent. Acest eveniment nu se poate abandona. Procedura ataat evenimentului AfterUpdate are urmtorul antet: Private Sub Form_AfterUpdate() Ordinea acestor evenimente este: BeforeInsert BeforeUpdate Evenimentul On Delete On Delete se declaneaz atunci cnd utilizatorul dorete s tearg nregistrarea curent. Acest eveniment se poate abandona. Procedura ataat evenimentului On Delete are urmtorul antet: Private Sub Form_Delete(Cancel As Integer) Parametrul Cancel se folosete pentru a abandona tergerea nregistrrii (prin Cancel=True). Exemplu: La tergerea unei nregistrri este bine s chestionm utilizatorul pentru a nu terge din greeal o nregistrare. n acest caz se poate ataa urmtoarea procedur evenimentului On Delete al formei: 16 AfterUpdate AfterInsert

Private Sub Form_Delete(Cancel As Integer) If MsgBox ("Sunteti sigur ca doriti sa stergeti inregistrarea? ", vbQuestion + vbYesNo)=vbNo Then Cancel=True End If End Sub Evenimentul On Error On Delete se declaneaz automat atunci cnd se produce o eroare pe formularul curent. Acest eveniment nu se poate abandona. Procedura ataat evenimentului On Error are urmtorul antet: Private Sub Form_Error(DataErr As Integer, Response As Integer) unde DataErr este un parametru care indic codul erorii returnat de obiectul Access Err, iar Response este un parametru prin care se poate stabili dac se afieaz mesajul de eroare i n ce mod. Acest parametru poate lua ca valori dou constante, prezantate mai jos :
Constant acDataErrDisplay acDataErrContinue Descriere Se afieaz mesajul de eroare generat de Access Se ignor eroarea, avnd posibilitatea afirii unui mesaj de eroare al utilizatorului n locul celui generat de Access

2. Evenimente ataate rapoartelor


n figura de mai jos se pot vedea toate evenimentele care pot fi ata;ate unui raport:

Evenimentele On Open, On Close, On Activate, On Deactivate i On Error au acelai efect i se trateaz exect ca n cazul formularelor. i seciunile unui raport (Report Header, Page Header, Detail, Page Footer, Report Footer, Group Header, Group Footer) au evenimente ataate. Aceste evenimente se pot vedea n fereastra Properties dac anterior am selectat linia seciunii respective. De exemplu pentru seciunea Detail avem: 17

Evenimentul On NoData On No Data se declaneaz la crearea raportului, dac acesta nu conine nici o nregistrare (este gol!). Acest eveniment se poate abandona. Procedura ataat evenimentului On No Data are urmtorul antet: Private Sub Report_NoData(Cancel As Integer) Parametrul Cancel se folosete pentru a abandona crearea i afiarea sau imprimarea raportului (prin Cancel=True). Exemplu: Private Sub Report_NoData(Cancel As Integer) MsgBox "Raportul nu contine date !" Cancel=True End Sub Evenimentele On Format i On Print On Format se declaneaz nainte de formatarea pentru afiare sau tiprire a unei seciuni dintrun raport. Acest eveniment se poate abandona. On Print se declaneaz nainte de fotmatarea pentru tiprire a unei seciuni dintr-un raport. i acest eveniment se poate abandona.

3. Evenimente ataate controalelor


Controalele din formularele/rapoartele Access au i ele evenimente specifice care pot fi tratate. O parte din evenimente sunt ntlnite la toate controalele standard din Access iar altele sunt specifice numai anumitor controale. La fel ca i n cazul formularelor/rapoartelor vom prezenta numai utilizarea celor mai uzuale evenimente. Lista evenimentelor controlului TextBox se poate vedea n figura de mai jos:

18

Lista evenimentelor unui subformular se poate vedea n figura de mai jos:

Lista evenimentelor unui buton de comand se poate vedea n figura de mai jos:

Lista evenimentelor unui control ComboBox se poate vedea n figura de mai jos:

19

Lista evenimentelor unui control ListBox se poate vedea n figura de mai jos:

Lista evenimentelor unui control Option Group, adic un grup de butoane radio (Option Buttons) sau casete de validare (CheckBox) se poate vedea n figura de mai jos:

Lista evenimentelor unui control Option Button (buton radio) se poate vedea n figura de mai jos:

20

Lista evenimentelor unui control CheckBox (caset de validare) este identic cu cea de la butoane radio de mai sus i se poate vedea n figura de mai jos:

Evenimentele On Click, On DblClick, On GotFocus, On LostFocus, On Enter i On Exit On Click se declaneaz n momentul n care se activeaz butonul mouse-ului. Acest eveniment nu se poate abandona. Procedura ataat evenimentului On Click are urmtorul antet: Private Sub NumeControl_Click() On DblClick se declaneaz n momentul n care se activeaz de dou ori butonul mouse-ului (la dublu-clic). Acest eveniment se poate abandona. Procedura ataat evenimentului On DblClick are urmtorul antet: Private Sub NumeControl_DblClick(Cancel As Integer) Parametrul Cancel se folosete pentru a abandona cel de-al doilea clic din secvena dublu-clic (rmne deci doar un eveniment On Click) Observaie: La producerea unui eveniment On DblClick se produce automat i un eveniment On Click. Evenimentul On Click l preceda pe On DblClick. Pentru a observa mai bine acest lucru, pe un formular gol creai un buton de comand i asociai procedurile urmtoare celor dou evenimente On Click i On DblClick ale butonului de comand Command0: Private Sub Command0_Click() MsgBox "S-a declansat evenimentul On Click", vbExclamation End Sub 21

Private Sub Command0_DblClick(Cancel As Integer) MsgBox "S-a declansat evenimentul On DblClick", vbExclamation End Sub

Se vede c n execuie, dup primul clic din cele dou ale unui dublu-clic, deja se execut mesajul de la On Click, aa nct pentru a se executa procedura de tratare a evenimentului On DblClick va trebui s se elimine procedura de la On Click. Altfel niciodat nu se va executa On DblClick! On GotFocus se declaneaz n momentul n care un control este activat (primete focus-ul). Acest eveniment nu se poate abandona. Procedura ataat evenimentului On GotFocus are urmtorul antet: Private Sub NumeControl_GotFocus() On LostFocus se declaneaz n momentul n care un control este dezactivat. Acest eveniment nu se poate abandona. Procedura ataat evenimentului On LostFocus are urmtorul antet: Private Sub NumeControl_LostFocus() On Enter se declaneaz nainte ca un control s fie activat. Acest eveniment nu se poate abandona. Procedura ataat evenimentului On Enter are urmtorul antet: Private Sub NumeControl_Enter() On Exit se declaneaz nainte ca un control s fie dezactivat (practic la ncercarea de ieire dintr-un control). Acest eveniment se poate abandona. Procedura ataat evenimentului On Exit are urmtorul antet: Private Sub NumeControl_Exit(Cancel As Integer) Parametrul Cancel se folosete pentru a abandona ieirea dintr-un control (Cancel=True). Evenimentele BeforeUpdate i AfterUpdate Aceste dou evenimente au acelai efect i se trateaz exact ca n cazul formularelor. Procedura ataat evenimentului BeforeUpdate are urmtorul antet: Private Sub NumeControl_BeforeUpdate(Cancel As Integer) Procedura ataat evenimentului AfterUpdate are urmtorul antet: Private Sub NumeControl_AfterUpdate()

22