Sunteți pe pagina 1din 73

erban CRICOT

Programarea n VISUAL BASIC for Application

Editura CARMINIS Piteti, 2003

II-2

NOT INTRODUCTIV
"Programarea n Visual Basic for Application" este o lucrare destinat n special utilizatorilor de baze de date Access. Lucrarea este structurat n dou pr i: n prima parte, "Elementele de baz ale limbajului de programare VBA - Visual Basic for Application" sunt prezentate: principiile de baz ale programrii; elementele de baz ale limbajului de programare Visual Basic; bibliotecile de proceduri i func ii din Access; interfa a de dezvoltare i depanere a VBA; n a doua parte, "Utilizarea obiectelor n limbajul de programare VBA" sunt prezentate: principiile definirii i utilizrii obiectelor n VBA; modelul ierarhic-arborescent Access; modelul ierarhic-arborescent Data Access Object; tehnologiile OLE i Automation-OLE; utilizarea n aplica iile Access a ActiveX-urilor; utilizarea n aplica iile Access a obiectelor Word i Excel; crearea i utilizarea claselor de obiecte n VBA; Pentru nsuirea elementelor de baz ale programrii n Visual Basic sunt necesare numai cunotin e minime despre sistemele de operare Windows. Totui, pentru a n elege partea a doua a lucrrii referitoare la programarea prin obiecte, no iunile despre baze de date rela ionale i despre interfa a Access sunt obligatorii. n decursul lucrrii sunt prezentate exemple comentate de cod VBA. Acestea mpreun cu alte exerci ii specifice grupate pe categorii i mpreun cu alte dou aplica ii demonstrative comentate, se gsesc n format Mdb, pe suportul ataat la carte. "Programarea n Visual Basic for Application" face parte dintr-un ciclu de lucrri referitoare la informatica de gestiune, care mai con ine: "Func ionarea i utilizarea calculatoarelor PC" "Utilizarea bazelor de date rela ionale Access n realizarea aplica iilor economice" "Re ele de calculatoare interconectate" "Proiectarea aplica iilor Web" "Principiile proiectrii sistemelor informatice de gestiune"

II-3

Modul de utilizare a CD-ROM-ului inclus n carte


La sfritul acestei cr i ve i gsi un CD-ROM ce con ine urmtoarele fiiere: DAO.MDB - con ine toate fragmentele de cod VBA prezentate n carte, mpreun cu toate formularele, cererile i tabelele necesare executrii lor. n modulul general de cod, ve i gsi sursele grupate dup natura lor, n module distincte de cod. Pentru transferurile prin tehnica AUTOMATION, se va folosi fiierul Excel, FOAIE.XLS PROBLEME.MDB - este o aplica ie ACCESS, care con ine un set de exerci ii rezolvate n VBA. Aplica ia permite vizualizarea tuturor problemelor grupate pe categorii i accesarea printr-o simpl apsare pe un buton, a modulului de cod sau a formularului ce va con ine codul surs. CURS.MDB - este o aplica ie demonstrativ cu un grad de dificultate mai ridicat i n care codul surs VBA este comentat n detaliu. Aceast aplica ie permite prezentatea grafic a unor analize asupra dinamicii cursului valutelor USD i EURO. Pentru grafice s-a folosit ActiveX-ul, Microsoft Graph, iar pentru introducerea datelor calendaristice controlul MS Calendar Control. n modulul general de cod, se gsesc dou colec ii de rutine parametrizate, foarte utile n realizarea de aplica ii. AGENDA.MDB - este o aplica ie mai simpl, cu codul surs VBA comentat, care permite stocarea i regsirea informa iilor referitoare la o baz de date rela ionale de persoane. Deoarece execu ia aplica iilor ACCESS nu se poate efectua direct de pe CD-ROM, se va copia n prealabil pe hard disck directorul cu acestea: EXEMPLE_VBA. Aplica iile sunt realizate n ACCESS 97. Pentru execu ia lor n versiuni superioare este necesar ca mai nti s se efectueze conversia lor.

II-4

CUPRINS
II.1. Obiecte .......................................................................................................................................... II-8 II.1.1. Obiecte, clase de obiecte i colec ii de obiecte......................................................................... II-8 II.1.2. Provenien a obiectelor utilizate ntr-o aplica ie Access ........................................... II-9 II.1.3. Ierarhia obiectelor dintr-o aplica ie .......................................................................................... II-9 II.1.4. Utilizarea n VBA a propriet ilor i metodelor obiectelor ....................................... II-11 II.1.5. Exemple de referire a obiectelor din modelul Access ............................................................ II-11 II.1.6. Instruc iunea With .................................................................................................................. II-12 II.1.7. Variabile obiect ...................................................................................................................... II-13
II.1.7.1. Tipuri de variabile obiect .................................................................................................................II-13 II.1.7.2. SET Instruc iunea de atribuire pentru variabile obiect ....................................................II-14 II.1.7.3. Eliberarea resurselor folosite de o variabil obiect. Cuvntul cheie NOTHING. ...........................II-15 II.1.7.4. Crearea unei instan e noi pentru o clas de obiecte. Cuvntul cheie NEW.....................................II-15

II.1.8. Parcurgerea colec iilor de obiecte. Instruc iunea ForEach............................................. II-16 II.2. Modelul Access-Application...................................................................................................... II-17 II.2.1. Obiectul Application .............................................................................................................. II-17 II.2.2. Colec ia Forms ....................................................................................................................... II-18
II.2.2.1. Obiectul Form ..................................................................................................................................II-19 II.2.2.1.a) Cuvntul cheie ME....................................................................................................................II-19 II.2.2.1.b) Propriet ile formularului ..........................................................................................................II-20 II.2.2.1.c) Evenimentele formularului ........................................................................................................II-22 II.2.2.1.d) Metodele formularului...............................................................................................................II-24 II.2.2.1.e) Obiectele sec iunilor formularului: Detail, Form_Header, Form_Footer..................................II-25 II.2.2.1.f) Referirea Subformularelor i a controalelor sale ........................................................................II-25 II.2.2.2. Obiectul Control Text_Box (caseta de text) ..................................................................................II-26 II.2.2.2.a) Propriet ile controlului Text Box.............................................................................................II-26 II.2.2.2.b) Propriet ile dinamice ale controlului Text Box........................................................................II-29 II.2.2.2.c) Evenimentele controlului Text Box...........................................................................................II-29 II.2.2.2.d) Metodele controlului Text Box .................................................................................................II-30 II.2.2.3. Obiectul Control Combo_Box (lista ascuns)...............................................................................II-31 II.2.2.3.a) Propriet ile specifice controlului Combo Box .........................................................................II-31 II.2.2.3.b) Evenimentul specific controlului Combo Box. .........................................................................II-33 II.2.2.4. Obiectul Control List_Box (list derulant)..................................................................................II-33 II.2.2.5. Obiectul Control boolean Option_Button, Check_Box, Toggle_Button........................................II-33 II.2.2.6. Obiectul Control Option_Group ...................................................................................................II-33 II.2.2.7. Obiectul Control Label (etichet) .................................................................................................II-34 II.2.2.8. Obiectul Control grafic Line, Rectangle, Picture..........................................................................II-34 II.2.2.9. Obiectul Control Command_Button..............................................................................................II-34

II.2.3. Obiectul DoCmd .................................................................................................................... II-34 II.2.4. Obiectul Screen ...................................................................................................................... II-35 II.3. Modelul DAO Data Access Objects....................................................................................... II-37 II.3.1. Modelul DAO Structura ierarhic arborescent.................................................................... II-37 II.3.2. Obiectul DBEngine ................................................................................................................ II-38 II.3.3. Colec ia Workspaces Spa iul (mediul) de lucru .................................................................. II-38 II.3.4. Tratarea erorilor de execu ie n VBA ..................................................................................... II-40
II.3.4.1. Tratarea standard a erorilor de execu ie produse n VBA ...............................................................II-40 II.3.4.2. Tratarea erorilor de execu ie prin module specializate ...................................................................II-40 II.3.4.2.a) Instruc iunea: On Error..............................................................................................................II-41 II.3.4.2.b) Instruc iunea: Resume ...............................................................................................................II-41 II.3.4.2.c) Obiectul: Err ..............................................................................................................................II-41 II.3.4.2.d) Str uctur a unei r utine care ar e mo d ul de Er ror hand ling ........................................II-42 II.3.4.2.e) Colec ia Errors i obiecte Error .................................................................................................II-43

II.3.5. Colec ia Databases ................................................................................................................. II-44 II.3.6. Colec ia Containers ................................................................................................................ II-45 II.3.7. Colec ia TableDefs................................................................................................................. II-49 II.3.8. Colec ia QueryDefs ................................................................................................................ II-51 II.3.9. Colec ia Relations .................................................................................................................. II-54 II.3.10. Colec ia Recordsets Set de nregistrri.............................................................................. II-54
II.3.10.1. Func ionarea unui set de nregistrri.............................................................................................II-54 II.3.10.2. Tipuri de seturi de nregistrri.......................................................................................................II-55 II-5

II.3.10.3. Deschiderea unui set de nregistrri Metoda OpenRecordset ...........................................II-56 II.3.10.4. Propriet ile unui set de nregistrri..............................................................................................II-56 II.3.10.5. Accesarea secven ial a unui set de nregistrri............................................................................II-58 II.3.10.6. Accesul direct ntr-un set de nregistrri........................................................................................II-58 II.3.10.6.a) Metoda Seek............................................................................................................................II-58 II.3.10.6.b) Metodele FindFirst, FindLast, FindNext, FindPrevious..........................................................II-59 II.3.10.7. Prelucrarea datelor dintr-un Recordset.........................................................................................II-61 II.3.10.7.a) Citirea datelor din cmpurile unui Recordset ..........................................................................II-61 II.3.10.7.b) Actualizarea datelor din cmpurile unui Recordset.................................................................II-62

II.3.11. Recordseturi definite pe cereri ............................................................................................. II-65 II.3.12. Recordseturi definite pe alte Recordseturi ........................................................................... II-66 II.3.13. Accesul la obiecte externe de date ....................................................................................... II-67

II-6

II-7

Cap.II Utilizarea obiectelor n limbajul de programare VBA


II.1. Obiecte
II.1.1. Obiecte, clase de obiecte i colecii de obiecte Din cele prezentate pn acum, referitor la no iunea de obiect, putem sintetiza astfel: Obiectul este o entitate bine definit (adic exist), care are o anumit structur, anumite caracteristici i anumite func ii (realizeaz una sau mai multe ac iuni). Un obiect se caracterizeaz prin: propriet i structura i atributele sale; metode ac iunile pe care poate s le efectueze; evenimente condi iile care determin momentul cnd se lanseaz o anumit ac iune (de exemplu Click pe un obiect). Exemplu. ntr-o aplica ie Access, ntr-un formular, exist un obiect cu numele Cmd. Acesta este un control buton de comand, cu anumite propriet i (culoare, dimensiuni, pozi ia n formular, textul afiat etc.), care are ataat evenimentului Click o ac iune (metod), materializat printr-o procedur eveniment, prin care se nchide formularul respectiv. Clasa de obiecte con ine toate defini iile unui obiect, adic tipurile de propriet i, metode i evenimente care vor determina structura unui obiect. Prin setarea caracteristicilor unei clase de obiecte (de exemplu atribuirea de valori propriet ilor) se ob ine un obiect nou. Prin definirea unei clase de obiecte se creeaz practic un format, o structur pe care o vor avea toate obiectele ce se vor crea din aceasta. Rela ia dintre o clas de obiecte i obiectele care provin din ea este asemntoare cu aceea dintre tipurile de date i variabile de tipul respectiv. Aa cum tipul de date este un concept, iar o variabil este materializarea (n memoria calculatorului) acestuia, tot aa clasa de obiecte este un concept, iar obiectele ce provin din ea reprezint materializarea acesteia. Crearea unui nou obiect al unei clase se numete instan a clasei respective. n Access exist definite diferite clase de obiecte. De exemplu clasa Form stabilete care este structura unui obiect formular, adic propriet ile (nume, culoare, dimensiuni, caption etc.), evenimentele (open, close, click etc.) i metode (refresh, requery etc.). Un formular creat este o materializare (o instan ) a clasei Form, avnd setate propriet ile cu anumite valori i ataate la anumite evenimente metode specifice prin scrierea unui cod de program n VBA. Colec ia de obiecte este constituit din totalitatea obiectelor care provin din aceeai clas de obiecte i care au din aceast cauz aceleai tipuri de propriet i i metode. Aceste obiecte constituie deci instan e ale aceleiai clase de obiecte. Obiectele dintr-o colec ie pot fi privite i folosite ca un tablou de obiecte. Ele vor crea o structur de tip tablou, la care este posibil referirea la un anumit obiect prin indexul acestuia, deci printr-un numr care reprezint pozi ia acestuia n tablou. Astfel, la crearea primului obiect, acesta va primi indexul 0, la crearea celui de-al doilea indexul va fi 1, etc. O colec ie de obiecte reprezint la rndul ei o entitate, cu propriile sale propriet i. Din aceast cauz ea constituie, n totalitatea ei, un obiect specific. Astfel o colec ie de obiecte va avea printre altele urmtoarele dou propriet i: Count care con ine numrul de obiecte din colec ie; Parent care con ine obiectul superior din ierarhie de care apar ine colec ia. Numele obiectului colec ie este format din numele clasei de unde provin obiectele la care se adaug sufixul "s". Exemplu. ntr-o aplica ie Access, n formularul F_CDialogContainer, colec ia de obiecte Controls con ine toate obiectele control din formular. Procedura urmtoare, lansat de evenimentul DblClick al sec iunii "Header" a formularului trateaz colec ia Controls, ca pe un tablou, afind elementele componente ale acesteia (numrul acestora se gsete n proprietatea Count) ct i obiectul de care apar ine (proprietatea Parent). Private Sub FormHeader_DblClick(Cancel As Integer)

II-8

' Afieaz numele obiectelor ce se afl n _ colec ia de controale a formularului Dim ST As String Dim i As Integer Dim N As Integer ST = "" ' Proprietatea Count a colec iei con ine _ numrul de obiecte din colec ie N = Me.Controls.Count - 1 For i = 0 To N 'Primul element dintr-o colec ie are indexul 0 ST = ST & i & ": " & Me.Controls(i).NAME & vbCr Next i ' Propritatea Parent a colec iei con ine obiectul _ de care apar ine colec ia MsgBox " Controalele din formularul parinte:" _ & vbCr & """ " & Me.Controls.Parent.NAME & _ " "", sunt n ordine:" & vbCr & vbCr & ST ' vbCr este o constant care determin saltul de rnd nou _ la afiare vbCr = Chr(10) & Chr(13) End Sub II.1.2. Proveniena obiectelor utilizate ntr-o aplicaie Access Un obiect, aa cum am artat, este format att din date (propriet i) ct i din cod de program (metode). Realizarea unei aplica ii prin crearea i utilizarea unor obiecte reprezint o metod modern de programare, denumit programarea la nivel de obiect. Cel mai important avantaj al acestei metode este acela al utilizrii obiectelor create n mai multe aplica ii, ceea ce duce, n afar de o cretere semnificativ a productivit ii, la standardizarea aplica iilor realizate. n Access obiectele din care se realizeaz o aplica ie pot proveni din mai multe surse: instan e ale claselor de obiecte aflate n bibliotecile standard ale pachetului Access: DAO, Access Application i VBA; instan e ale claselor de obiecte proprii (utilizator), create special de proiectant (prin modulele de clase de obiecte); instan e ale unor clase de obiecte externe, realizate de aplica ii server sub forma unor controale sau biblioteci ActiveX realizate cu tehnologia (standardul industrial) Automation. Utilizarea acestor clase de obiecte externe implic n prealabil, aa cum se va arta, crearea n aplica ia client (care folosete obiectele produse de clasa respectiv) a unei referin e ctre acestea. II.1.3. Ierarhia obiectelor dintr-o aplicaie Obiectele folosite ntr-o aplica ie se gsesc ntr-o structur ierarhic-arborescent. Fiecare element al acestei structuri apar ine unei structuri superioare i la rndul su con ine unul sau mai multe elemente de nivel inferior. De asemenea un element al acestei structuri poate fi constituit dintr-un obiect individual sau dintr-o colec ie de obiecte. O aplica ie Access este realizat n cea mai mare parte din obiectele i colec iile de obiecte care provin din clasele de obiecte ale urmtoarelor biblioteci standard (modele): DAO privind structurile de date; Access (Application) privind interfa a utilizator; i respectnd ierarhiile create n acestea. Obiectele, ca i propriet ile sau metodele lor, au un nume, care poate fi implicit (adic stabilit de sistem) sau dat de utilizator. n decursul acestui capitol termenul model va referi realizarea unei structuri ierarhice de obiecte i colec ii de obiecte ce provin dintr-o bibliotec standard ce con ine clase de obiecte.
II-9

Referirea la un obiect. Deoarece exist posibilitatea ca mai multe obiecte s aib acelai nume, atunci cnd se refer un obiect (sau propriet ile i metodele sale), este necesar calificarea numelui cu ntreaga structur ascendent a obiectelor de care acesta este dependent (asemntor cu descrierea cii unui fiier sau folder de pe un disc). Acest lucru nu este ns obligatoriu dac nu se creeaz ambiguit i. Semnele de calificare folosite n toate obiectele unei aplica ii Access (deci i n VBA) sunt punctul (.) sau semnul exclamrii-bang (!), specificul utilizrii lor fiind urmtorul: punctul (.): se folosete cnd n faza de scriere a structurii ierarhice, aceasta este deja cunoscut de sistem; semnul exclamrii (!): se folosete cnd se dorete ca descrierea structurii respective s se analizeze de abia n faza de execu ie, deoarece n faza de scriere ea nu este nc cunoscut de sistem; Explica ie. Se tie c ntr-o aplica ie Access execu ia unui formular (sau raport) care are introdus cod VBA n modulul su de cod, se va face numai dup ce se compileaz fr eroare acesta. n faza de compilare a modulelor de cod, sistemul va analiza numai structurile ierarhice care au ca semn de calificare punctul (.) i ignor pe cele care au ca semn de calificare semnul exclamrii (!), urmnd ca acestea din urm s fie analizate abia n faza de execu ie. Deci pentru ca opera ia de compilare s se termine cu succes este necesar ca toate structurile ierarhice care nu sunt cunoscute n momentul respectiv s fie introduse cu semnul de calificare semnul exclamrii (!) pentru a nu fi analizate (structurile ierarhice cunoscute n faza de compilare pot fi introduse cu semnul de calificare punct). Exemplu. Astfel, dac n codul din spatele unui formular legat la un tabel se folosete numele unui cmp al acestuia, atunci, deoarece n faza de compilare obiectul respectiv, tabelul, este deja cunoscut de sistem, semnul de calificare folosit poate fi punctul (.); dac ns formularul nu este legat ini ial la o tabel, urmnd a se efectua aceast opera ie printr-o instruc iune VBA (deci n faza de execu ie), atunci referirea la cmpurile acesteia trebuie fcut cu semnul de calificare semnul exclamrii (!), pentru ca analiza acesteia s nu se mai fac n momentul compilrii (cnd nu este cunoscut) ci n momentul execu iei instruc iunii care folosete structura respectiv. Se poate nlocui oricnd semnul de calificare punct (.) cu semnul de calificare semnul exclamrii (!), dar nu i invers. Folosirea structurilor ierarhice descrise cu semnul de calificare semnul exclamrii (!) ncetinete execu ia codului VBA, deoarece analiza acestora nu se mai face n faza de compilare. Referirea unei colec ii se face folosind acelai sistem, deoarece colec ia este, aa cum am vzut, la rndul ei, un obiect. Referirea la un obiect dintr-o colec ie se poate face n 3 feluri: Fie folosind tot metoda prezentat, utiliznd calificarea obiectului cu colec ia din care face parte: <referirea la colec ie> <semn de calificare> <numele obiectului> Exemplu. Me.Controls!CForm Fie folosind indexarea colec iei cu un numr care reprezint pozi ia n colec ie a obiectului respectiv (asemntor cu referirea unui element dintr-un tabel). Numerotarea elementelor unei colec ii de obiecte se pornete de la 0 (zero). <referirea la colec ie> <(> <numr n cadrul colec iei> <)> Exemplu. Me.Controls(0) Fie la fel ca mai sus dar folosind ca pe un ir de caractere numele obiectului n loc de index. <referirea la colec ie> <(> <"nume obiect"> <)> Exemplu. Me.Controls("CForm") Dac se dorete s se fac referire n codul VBA la formularul sau raportul "printe", fr a se mai face descrierea structurii ierarhice superioare, se poate folosi cuvntul cheie ME. Semnele care se pot folosi pentru a se specifica un obiect sunt parantezele drepte <[nume_obiect]>. Ele sunt folosite obligatoriu atunci cnd n numele obiectului se gsesc spa ii.

II-10

II.1.4. Utilizarea n VBA a proprietilor i metodelor obiectelor Referirea la propriet ile sau metodele unui obiect se face prin: metoda descris la punctul precedent pentru referirea obiectului; urmat de numele propriet ii sau metodei, folosind semnul de calificare punct. Utilizarea propriet ii unui obiect, n codul VBA, se face la fel ca i cum s-ar lucra cu o variabil obinuit, n citire sau scriere. Dac se dorete atribuirea unei valori propriet ii unui obiect, atunci aceasta se introduce n partea din dreapta a unei instruc iuni de atribuire. Exemplu de scriere a propriet ii Caption a unui formular: Me.Caption="Nume Nou Form" sau a propriet ii Index, a unui Recordset: Rs.Index="PrimaryKay" Dac se dorete citirea propriet ii unui obiect, atunci aceasta va face parte dintr-o expresie obinuit. Exemplu de citire a propriet ii Caption a unui formular: MsgBox "Numele formularului este: " & Me.Caption La utilizarea propriet ilor unui obiect trebuie s se in cont de urmtoarele trei restric ii: Nu toate propriet ile au posibilitatea s li se schimbe valoarea. Aceste propriet i se numesc Read Only, i se folosesc numai n citire; Ca i o variabil, o proprietate este de un anumit tip de date, de care trebuie inut cont n utilizarea ei; Modificarea propriet ilor unui obiect prin cod dureaz numai n timpul fazei respective de execu ie, urmnd ca la terminarea acesteia s se refac proprietatea ini ial; Utilizarea metodelor unui obiect n codul VBA se face la fel ca i cum s-ar lucra cu o procedur, folosindu-se metoda de apelare fr Call, prin scrierea sub forma unei instruc iuni a metodei, urmat, dac este cazul, de parametrii acesteia (fr a fi introdui ntre paranteze) separa i prin virgul. Exemplu de apelare a unei metode cu doi parametri de tip string: Rs.Seek "=", "unu". II.1.5. Exemple de referire a obiectelor din modelul Access Pentru n elegerea acestor exemple este necesar urmrirea structurii ierarhice a modelului Access Application ce se gsete tot n cadrul acestui capitol. Forms!Date se face referire la formularul deschis cu numele Date. Forms![date de bilant] se refer formularul deschis date de bilant. Observa i parantezele drepte folosite pentru c numele formularului con ine spa ii. Forms![vinzari].RecordSource se face referire la proprietatea Record Source al formularului deschis vinzari. Parantezele drepte pot fi scoase. Observa i punctul, semnul de calificare pentru o proprietate sau metod. Forms![vinzari]!valoare se refer controlul cu numele valoare din formularul deschis vinzari. Forms!("vinzari")!valoare identic cu mai sus, dar se folosete alt posibilitate de precizare a unui obiect dintr-o colec ie i anume printr-un string care reprezint numele obiectului. Forms!(0)!valoare identic cu mai sus, dar se folosete precizarea unui obiect dintr-o colec ie prin folosirea numrului de ordine al obiectului n cadrul colec iei (am presupus c formularul vinzari a fost primul deschis, primind indexul 0 in cadrul colec iei Forms). Me.FilterOn se refer proprietatea FilterOn a formularului n care se gsete codul VBA. Me!Altul.Visible se refer proprietatea Visible a controlului Altul a formularului n care se gsete codul VBA. Exemplul prezentat anterior este reluat, dar el nu se mai gsete n codul din spatele formularului, ci extern n modulul de cod al aplica iei. Din el se observ n special cum func ioneaz colec ia Forms, a formularelor deschise. Public Sub Col_Form_Controale() ' Afieaz obiectele ce se afl n colec ia de controale a primului formular deschis Dim ST As String Dim i As Integer Dim N As Integer ST = "" ' Proprietatea Count a colec iei con ine numrul de obiecte din colec ie
II-11

On Error GoTo Fis ' Dac nu este nici un formular deschis se produce _ eroare controlabil de ctre utilizator N = Forms(0).Controls.Count ' Numrul de obiecte din colec ia de _ controale a primului formular deschis On Error GoTo 0 n continuare, dac se produce o eroare aceasta _ va fi tratat de sistemul standard de erori. For i = 0 To N -1 'Primul element dintr-o colec ie are indexul 0 ST = ST & i & ": " & Forms(0).Controls(i).NAME & vbCr Next i ' Propritatea Parent a colec iei con ine obiectul de care apar ine colec ia MsgBox " Controalele din formularul parinte:" & vbCr & _ """ " & Forms(0).Controls.Parent.NAME & _ " "", sunt n ordine:" & vbCr & vbCr & ST Sfirsit: Exit Sub Fis: MsgBox "Nu exista nici un formular deschis", vbCritical Resume Sfirsit End Sub II.1.6. Instruciunea With Instruc iunea With este folosit pentru a scrie diferite instruc iuni ce se refer la proriet ile sau metodele unui obiect, fr a le mai califica cu numele obiectului. Forma lui With este: With object [instruc iuni] End With n care instruc iunile plasate n interiorul acesteia vor referi propriet ile sau metodele obiectului object, direct, fr calificarea acestora cu obiectul respectiv. n object se poate folosi numele unui obiect sau o variabil obiect. Exemplu. Urmtoarea secven modific cteva dintre propriet ile formularului deschis cu numele Datt. With Forms!Datt .RecordSource = "Tabela_A" .Caption = "Formularul Datt" .ScrollBars = 0 .NavigationButtons = True End With Instruc iunea With se poate folosi i pentru tipurile de date definite de utilizator cu instruc iunea Type. Exemplu. Urmtoarea secven introduce date n variabila vPersoana, declarat ca tip de date tPrs, definit de utilizator. Type tPers Nume As String Virsta As Integer DataNastere As Date End Type Dim vPersoana as tPers .. With vPersoana .Nume=InputBox("Introduceti numele:") .Virsta=30 .DataNastere=InputBox("Introduceti data nasterii:") End With
II-12

II.1.7. Variabile obiect n programare variabilele sunt elementele prin care se fac referiri la date. Deoarece n programarea la nivel de obiect, exist o entitate specific, obiectul, care ncapsuleaz att date ct i prelucrri, este necesar definirea unei variabile specifice, variabila obiect, prin care s se poat manipula mai eficient acesta. O variabil obiect este asemntoare unei variabile obinuite ce con ine un anumit tip de date. Declararea ei se face cu aceleai instruc iuni (Dim, Public, Private sau Static) ca i la celelalte variabile. Variabilele obiect ocup o zon de memorie de 32 bi i (4 octe i). Dei lucrul cu variabile obiect nu este deosebit de cel cu variabilele obinuite, totui ele au o caracteristic specific i anume: ntr-o variabil obiect nu se va gsi efectiv obiectul respectiv, ci o referire (adres) la acesta. Astfel, dac avem o variabil de tip integer AI i executm AI=3, atunci n AI vom avea efectiv, pe 16 bi i, numrul 3. Dac mai declarm o variabil de acelai tip, BI i o facem egal cu AI, vom avea i n aceasta numrul 3. Acum, executnd AI=5, se va schimba valoarea din AI, dar cea din BI va rmne neschimbat. AI i BI au deci existen e separate, independente. Nu acelai lucru se ntmpl i n cazul variabilelor obiect. Dac (vezi urmtorul exemplu) avem o variabil obiect FM1 i introducem n ea un obiect, formularul F_CDialogContainer, atunci n FM1 nu vom avea formularul respectiv, ci o referire (adres) la acesta. Tot aa, dac mai declarm o variabil obiect, FM2 i introducem n ea ce se gsete n FM1, atunci vom avea acum dou variabile obiect care vor referi acelai obiect. S modificm acum o proprietate a lui FM1. Dac vom citi aceeai proprietate din FM2, vom observa c modificarea este efectuat i n acesta. Deci, cele dou variabile obiect nu au existen e independente, ele referind practic acelai obiect. Evident, n anumite prelucrri, acest lucru are importan (ca n exemplu). Totui n majoritatea prelucrrilor manifestarea variabilelor obiect este similar cu a celor clasice. II.1.7.1. Tipuri de variabile obiect O variabil obiect se poate declara n mai multe feluri i anume ca: Variabil obiect generic: Dim nume_var As Object Variabila declarat n acest fel este o variabil obiect generic, deoarece n ea se poate introduce orice obiect. Variabil obiect specific Pentru fiecare obiect care se ob ine dintr-o clas vizibil n aplica ie, indiferent c aceasta provine din bibliotecile standard, prin referin e la obiecte externe sau este creat de utilizator, exist tipuri specifice de variabile obiect, cu acelai nume ca al clasei respective. De asemenea, acelai lucru se ntmpl i pentru colec iile de obiecte, existnd tipuri specifice de variabile obiect cu numele acestora. Astfel, pentru obiectele provenite din biblioteca Access Application, exist urmtoarele tipuri de variabile obiect: Forms colec ia formularelor deschise; Form pentru un obiect formular; Reports colec ia rapoartelor deschise; Report pentru un obiect raport; Controls pentru colec ia tuturor controalelor dintr-un formular sau raport; Control pentru un control dintr-un formular sau raport etc. Deoarece controalele, la rndul lor, provin din clase diferite de obiecte, exist pentru fiecare tip din acestea variabile obiect specifice. Astfel mai sunt pentru controale urmtoarele tipuri specifice de variabile obiect: TextBox pentru controlul caset de text; ComboBox pentru controlul list ascuns;
II-13

ListBox pentru controlul list derulant; CheckBox pentru controlul boolean caset de validare; Button pentru controlul boolean buton radio; ToggleButton pentru controlul boolean de tip tast; CommandButton pentru controlul buton de comand; Label pentru controlul etichet etc.

Declararea unei variabile obiect specifice se face folosind numele clasei sau colec iei care va fi referit de variabila respectiv. Dim nume_var As tip_obiect Diferen a dintre utilizarea unei variabile obiect specifice sau generice se refer la urmtorul aspect: La declararea unei variabile obiect generice, sistemul nu tie ce fel de obiect va fi n aceasta. Acest lucru se va cunoate la prima ncrcare cu un obiect al variabilei. n acest moment, se va configura variabila obiect cu propriet ile i metodele specifice tipului de obiect respectiv. Deci aceast configurare este realizat n partea de execu ie a aplica iei. La declararea unei variabile obiect specifice, sistemul tie de la nceput care sunt propriet ile i metodele tipului de obiect respectiv. Deci configurarea variabilei este realizat n partea de compilare a aplica iei i nu n cea de execu ie. Din aceast cauz, execu ia cu acest tip de variabile este mai rapid. Un alt avantaj, determinat de utilizarea variabilelor obiect specifice, se refer la momentul n care este folosit, n partea de editare a programului, variabila obiect respectiv. Editorul de VBA este dotat cu instrumente puternice de recunoatere i marcare a diferitelor cuvinte rezervate, a instruc iunilor, a variabilelor, a obiectelor, a procedurilor i func iilor vizibile din locul unde sunt folosite. Astfel, dac se introduce n text o func ie (reamintesc c m refer la partea de editare, de introducere a sursei unui modul de cod n VBA), atunci, dup scrierea ei, automat se afieaz o list cu parametrii acesteia, ceea ce reprezint un instrument foarte util al asistrii activit ii de programare. Similar, la introducerea n codul VBA a denumirii unui obiect (sau colec ii de obiecte), editorul afieaz o list ce con ine att propriet ile i metodele acestuia ct i obiectele (sau colec iile de obiecte) pe care acesta le con ine. Acelai lucru se va ntmpla i dac programatorul va introduce numele unei variabile obiect specifice. Dac se lucreaz ns cu variabile obiect generice, aceast facilitate nu poate fi activat n momentul respectiv (al editrii programului), deoarece sistemul nu cunoate nc nimic despre structura obiectului pe care l refer variabila respectiv. Nu toate obiectele sau colec iile utilizate n Access au asociate i declara iile de tipul respectiv pentru definirea variabilelor. n acest caz, evident se vor declara generic, variabilele care refer aceste obiecte. De exemplu, pentru controalele folosite ntr-un formular sau raport, exist tipurile de variabile obiect specifice: "Controls" care se refer la colec ia controalelor din formularul sau raportul respectiv; "Control" care se refer la un obiect control din formularul sau raportul respectiv; dar pentru toate controalele de un anumit tip (de exemplu TextBox) sunt definite numai tipurile pentru acest obiect (TextBox), dar nu i pentru colec ia format din aceste controale (nu exist tipul TextBoxs). Din cele prezentate se deduce c este indicat ca atunci cnd este posibil, s se foloseasc numai variabile obiect specifice. Dei nu s-a folosit n prezentare, pentru declararea variabilelor obiect, dect forma instruc iunii Dim, celelalte forme i anume Public, Private sau Static, sunt valabile i func ioneaz la fel ca la variabilele clasice. II.1.7.2. SET Instruc iunea de atribuire pentru variabile obiect Dei am folosit mereu forma de mai jos pentru instruc iunea de atribuire pentru variabilele clasice: var = expresie totui forma complet a acesteia este: Let var = expresie
II-14

n care cuvntul cheie Let, introdus implicit, arta c este atribuit o valoare unei variabile clasice. Pentru variabilele obiect, la care atribuirea const practic n crearea unei referin e ctre un obiect, este obligatorie folosirea la instruc iunea respectiv a cuvntului cheie SET. Deci pentru variabilele obiect instruc iunea de atribuire este: Set var_obiect = expresie_obiect n care expresie obiect este o expresie al crui rezultat este un obiect. Efectul instruc iunii de atribuire este introducerea n variabila obiect a adresei obiectului (referirea la acesta) care rezult din expresia din dreapta i nu realizarea unei copii a obiectului respectiv. Din aceast cauz dac mai multe variabile refer acelai obiect, orice modificare a acestuia (cauzat eventual prin una din variabile) va fi reflectat imediat de toate aceste variabile care refer obiectul respectiv (vezi exemplul care va urma). II.1.7.3. Eliberarea resurselor folosite de o variabil obiect. Cuvntul cheie NOTHING. O variabil obiect are nevoie de un spa iu (memorie) de lucru pentru a func iona. Acesta este eliberat automat, ca la orice variabil, la terminarea modulului n care a fost declarat variabila obiect. Dac totui se dorete eliberarea imediat a spa iului ocupat de o variabil obiect se folosete instruc iunea: Set var_obiect = Nothing Public Sub Var_Obiect() ' Demonstreaz c o variabil obiect reprezint referin a ctre un obiect Dim ST As String Dim FM1 As Form Dim FM2 As Form On Error GoTo Fis 'Lipsa unui formular deschis produce o eroare Set FM1 = Forms(0) ' Var. obiect FM1, va con ine referin a ctre _ primul formular deschis MsgBox "Primul formular deschis este: " & FM1.NAME On Error GoTo 0 Set FM2 = Forms(0) ' Var. obiect FM2, va con ine aceeai referin ca _ variabila FM1 ST = FM1.Caption ' Proprietatea Caption a variabilei obiect FM1 _ este salvat n ST FM1.Caption = "TEST Variabile Obiect" ' Se schimb proprietatea _ Caption n FM1 MsgBox FM2.Caption ' Schimbarea se face practic n obiectul referit. _ Deci i n FM2 prop. Caption va fi: "TEST Variabile Obiect" FM1.Caption = ST ' Se reface proprietatea Caption. MsgBox FM2.Caption ' Aceast schimbare se produce i n FM2 Set FM1 = Nothing ' Se elibereaz spa iul ocupat de FM1 Sfirsit: Exit Sub ' La terminarea rutinei, se elibereaz spa iul ocupat de toate variabilele _ obiect declarate n ea. Deci spa iul ocupat de FM2 se elibereaz i el. Fis: MsgBox "Nu exista nici un formular deschis", vbCritical Resume Sfirsit End Sub II.1.7.4. Crearea unei instan e noi pentru o clas de obiecte. Cuvntul cheie NEW Cuvntul cheie New se poate folosi att la declararea unei variabile obiect ct i la instruc iunea de atribuire Set. Dim nume_var As New tip_obiect Set var_obiect = New expresie_obiect

II-15

Efectul acestuia se manifest numai la clasele de obiecte create prin modulele de cod ale aplica iei. El produce crearea unei noi instan e pentru clasa respectiv, adic practic al unui spa iu separat de existen pentru variabila respectiv. Nu trebuie confundat folosirea acestui cuvnt cheie cu aceea de creare a unor obiecte noi n modelele standard ale Access (de exemplu nu se poate crea prin New un control nou ntr-un formular). II.1.8. Parcurgerea coleciilor de obiecte. Instruciunea ForEach n primul exemplu din acest capitol s-a artat cum pot fi parcurse cu o instruc iune FOR obinuit obiectele unei colec ii, folosindu-se proprietatea Count a colec iei pentru stabilirea numrului de cicluri necesar. Acelai lucru se poate face mai eficient cu forma special a instruc iunii ForEach: For Each var_obiect In colec ie_obiecte [instruc iuni] [Exit For] [instruc iuni] Next [var_obiect] Variabila obiect folosit trebuie s fie compatibil cu tipul colec iei specificate dup cuvntul cheie IN. Func ionarea buclei For const n faptul c la fiecare itera ie, variabilei obiect, var_obiect, i se va atribui pe rnd cte un element al colec iei specificate. Deci instruc iunea ForEach va avea attea cicluri cte obiecte con ine colec ia specificat n instruc iune. Exemplu. Public Sub Afis_Forms() 'Afieaz toate formularele deschise Dim FM As Form Dim ST As String ST = "" For Each FM In Forms ' FM refer la fiecare ciclu un formular deschis ST = ST & " " & FM.NAME & vbCr Next If Len(ST) > 0 Then MsgBox "Formulare deschise: " & vbCr & vbCr & ST Else ' Nu s-a executat nici un ciclu din For...Each MsgBox "Nici un formular nu eeste deschis" End If End Sub Instruc iunea For ... Each se poate folosi i pentru variabile de tip tablou (Array). n acest caz, variabila contor trebuie s fie declarat de tip variant.

II-16

II.2. Modelul Access-Application


Modelul ierarhic arborescent Application, prin care se realizeaz instan ele obiectelor i colec iilor care constituie interfa a utilizator a unei aplica ii i care provin din clasele de obiecte con inute n biblioteca standard Access, este artat succint n figura alturat. n figura prezentat nu s-au detaliat colec iile. De exemplu, dac la un moment dat exist dou formulare deschise, FM_1 i FM_2, care con in controalele Cbox_1, Cbox_2 i Cmd (FM_1), respectiv Comb1 i Cbox_1 (FM_2), atunci colec ia Forms va arta ca n figur. -----------------II.2.1. Obiectul Application Application Forms Reports Modules Screen DoCmd
formularele deschise rapoartele deschise

Controls Controls Legend


Obiecte Colec ii

colec ia formularelor deschise

Cbox_1 Forms Obiectul Application se refer la aplica ia Cbox_2 Controls FM_1 Microsoft Access activ i are dou func ii de baz: 1) Con ine urmtoarele obiecte i colec ii: Cmd colec ia Forms a formularelor deschise; Cbox_1 Controls FM_1 colec ia Reports a rapoartelor deschise (cu Comb1 aceiai structur ca Forms); colec ia Modules a modulelor de cod; colec ia References a referin elor ctre alte obiecte ActiveX (obiecte sau biblioteci); obiectul Screen con ine propriet i i metode ce se refer la formularul, raportul sau controlul care la un moment dat are focusul; obiectul DoCmd care con ine metode prin care se pot executa din codul VBA aproape toate comenzile care se pot folosi n aplica iile Access. 2) Prin metodele i propriet ile sale, obiectul Application poate accesa oricare dintre componentele (colec ii, obiecte, proceduri, func ii, clase etc.) aplica iei Microsoft Access. De asemenea exist posibilitatea referirii acestui obiect i dintr-o aplica ie extern prin tehnica Automation.

Oricare obiect Access are o proprietate special-Application, prin care se poate accesa obiectul Application. -----------------Dintre metodele obiectului Application prezentm cteva: Metoda SetOption a obiectului Application este folosit pentru a seta op iunile generale ale bazei de date (o parte din acestea se gsesc definite n meniul Tools|Options). Astfel op iunea Status Bar, care permite sau nu vizualizarea barei de stare, se poate activa prin urmtoarea metod: Application.SetOption "Show Status Bar", True Aa cum se observ, metoda SetOption are doi parametri: primul este un string care con ine numele op iunii ce se va seta; al doilea este de un tip de dat specific op iunii (boolean n cazul prezentat) i este folosit pentru a da o valoare op iunii; Metoda GetOption ntoarce valoarea unei op iuni generale a bazei de date; Metoda Quit determin terminarea aplica iei Access; Metoda Echo determin blocarea refacerii ecranului. . Application.Echo False,"Ecranul este blocat" DoCmd.Hourglass True ' prelucrri n cursul crora ecranul nu se va mai modifica _ Stringul introdus n al doilea argument este afiat pe bara de stare Application.Echo True
II-17

DoCmd.Hourglass False ' Se reface starea normal a ecranului CreateForm i CreateReport Func ii ce permit crearea unui formular sau raport n aplica ia Access, din codul VBA, ca n exemplul urmtor: Sub NewForm() Dim fm As Form Set fm = Application.CreateForm ' Creaz un formular nou a crei _ referin se introduce n variabila obiect specific de tip Form, fm With fm ' Seteaz cteva propriet i ale formularului .RecordSource = "Tabela_A" .Caption = "Numele Formularului" .AllowAdditions = False .AllowDeletions = False End With DoCmd.Restore ' afieaz formularul creat End Sub O aplica ie Access este un ActiveX. Aceasta nseamn c ea poate fi accesat i din alte aplica ii care folosesc tehnologia OLE Automation, ca MS Visual Basic, MS Excel sau alt aplica ie Access. Pentru aceasta trebuie creat o nou instan a obiectului Application, n care se poate deschide o baz de date. n exemplul urmtor se deschide dintr-o aplica ie Access o baz de date cu numele DAO.mdb, ce se afl n directorul Teste a discului C: Sub ExempluAccess() Dim appAccess As Object Dim strDB As String strDB = "C:\Teste\DAO.mdb" ' introduce adresa bazei de date Set appAccess = New Access.Application ' creeaz o nou instan a _ obiectului Application, a crei referin se introduce n variabila obiect _ appAccess, n scopul folosirii acesteia ' Deschide n instan a creat n MS Access baza de date DAO.mdb appAccess.OpenCurrentDatabase strDB appAccess.DoCmd ' efectueaz diferite ac iuni n DAO.mdb appAccess.CloseCurrentDatabase ' nchide baza de date DAO.mdb Set appAccess = Nothing ' anuleaz instan a creat End Sub n descrierea structurii ierarhic arborescente a modelului Access-Application din aplica ia Access, folosirea obiectului Application este op ional, el fiind considerat implicit. II.2.2. Colecia Forms Colec ia Forms con ine toate formularele deschise la un moment dat. Indexarea colec iei ncepe de la 0 Forms(0) reprezentnd primul formular deschis. n continuare, fiecare nou formular deschis va avea indexul urmtor din secven , iar nchiderea unui formular va determina o renumerotare a formularelor deschise, n aa fel ca mul imea indecilor s fie mereu continu i n ordinea deschiderii formularelor. Membrii colec iei Forms a formularelor deschise sunt obiecte Form. Pentru colec ia Forms i obiectele Form, exist definite tipuri de date obiect specifice. Formularele deschise pot fi i n proiectare (design). Exemplu. Procedura urmtoare, ce se gsete n modulul general de cod, afieaz numrul formularelor deschise n momentul execu iei sale. Ea va folosi proprietatea Count a unei colec ii de obiecte, care con ine, aa cum s-a mai artat, numrul de obiecte ce se gsesc n aceasta. Sub TestForms Dim N as Integer Dim FS as Forms Set FS = Application.Forms
II-18

N = FS.Count If N = 1 Then MsgBox "Exist un formular deschis" ElseIf N>1 Then MsgBox "Exist " & N & " formulare deschise" Else MsgBox "Nu exist nici un formular deschis" End If End Sub II.2.2.1. Obiectul Form Un obiect Form reprezint un formular deschis. El are propriet i, metode i evenimente (la care se pot ataa metode) descrise tot n cadrul acestui capitol. Un obiect Form con ine o colec ie de controale numit Controls, format din obiecte Control. Fiecare obiect Control va fi de un anumit tip i va avea propriet ile, metodele i evenimentele specifice acestuia. Pentru colec ia Controls i obiecte Control, exist tipuri de date obiect specifice, definite. De asemenea, pentru diferite tipuri de controale sunt definite tipuri de date obiect specifice (dar nu i colec ii) ca de exemplu: TextBox pentru controlul caset de text; ComboBox pentru controlul list ascuns; ListBox pentru controlul list derulant; CheckBox pentru controlul boolean caset de validare; Button pentru controlul boolean buton radio; ToggleButton pentru controlul boolean de tip tast; CommandButton pentru controlul buton de comand; Label pentru controlul etichet. II.2.2.1.a) Cuvntul cheie ME Me este folosit pentru a face referire direct, din modulul de cod din spatele unui formular, la obiectul (formular) al crui cod este executat. n acest fel Me se comport asemntor cu o variabil obiect de tip Form, declarat implicit. Me este utilizat n general n dou scopuri: Pentru a referi direct obiectele din formularul al crui cod se execut (op ional). De exemplu: Me.Cbox_1, se refer la un control din formularul n execu ie. Me.RecordSource="Tabela_A" ' se leag formularul la _ tabela Tabela_A; aceasta are un cmp A MsgBox Me!A ' se observ semnul de calificare folosit; la _ compilare, formularul nefiind legat de Tabela_A, cmpul A nu era _ cunoscut de sistem. Pentru a trimite ntr-o rutin aflat n alt modul de cod, ca parametru, instan a al crui cod este executat. Exemplu. n formularele unei aplica ii exist un buton de comand, BC, care la evenimentul click, va nchide toate formularele deschise cu excep ia celui care este activ (cel n care s-a apsat BC). n modulul de cod din spatele unui formular la evenimentul Click al butonului ce comand BC, va fi urmtoarea procedur eveniment: Private Sub BC_Click() ' proc. Evenimentului Click al controlului BC ' nchide toate formularele deschise din aplica ie CloseForms Me ' parametrul va fi o referin la un obiect de tip form _ i anume chiar formularul n al crui cod ne gsim End Sub n modulul general de cod va fi urmtoarea procedur public: Public Sub CloseForms(pF As Form) Dim vF As Form Dim cF As Forms Dim NrClose As Integer Dim Afis As String
II-19

Dim NF As Integer Dim i As Integer Set cF = Application.Forms ' colec ia Formularelor deschise NF = cF.Count MsgBox "Formulare deschise=" & NF For i = NF - 1 To 0 Step -1 Set vF = cF(i) ' un obiect Formular If vF.NAME = pF.NAME Then MsgBox "Formularul activ este:" & pF.NAME Else Application.DoCmd.Close acForm, vF.NAME ' Metod a obiectului DoCmd prin care se nchide _ obiectul de tip formular (constanta acForm) _ i cu numele con inut n al doilea parametru. NrClose = NrClose + 1 End If Next Afis = IIf(NrClose = 0, "Nu s-au inchis formulare", "Formulare inchise=" & NrClose) MsgBox Afis End Sub Se observ c s-a parcurs colec ia formularelor deschise (Forms) de la ultimul formular deschis ctre primul. Acest lucru se datoreaz faptului c nchiderea unui formular va produce modificri n colec ia formularelor deschise, att asupra numrului de membri ai colec iei ct i asupra numrului de ordine (de indexare) n cadrul colec iei unui formular dac a fost nchis un formular cu un index mai mic; de exemplu dac exist 3 formulare deschise, cu indecii: 0, 1, 2 nchiderea formularului 1 va face ca formularul cu indexul 2 s ia indexul 1. II.2.2.1.b) Propriet ile formularului Majoritatea propriet ilor formularului se pot accesa att static (prin cele 3 pagini ale controlului TAB al formularului) ct i dinamic, prin cod VBA. Numele formularului Stabilirea numelui formularului se face n fereastra Database la fel ca la tabele sau cereri. Acesta este foarte important deoarece se va folosi pentru a se face referire la acest obiect de oriunde, dar evident calificat dac este necesar. Pagina FORMAT Cele mai utilizate propriet i din aceast pagin, referitoare la forma de prezentare a formularului, sunt: Caption Titlul formularului. Apare n bara de titlu a acestuia. Nu trebuie confundat cu numele formularului. Implicit, dac proprietatea nu este completat, numele formularului se va folosi i ca titlu. Default View Tipul formularului, care poate fi Continous sau Single. Scroll Bars Specific dac exist sau nu bare de derulare, orizontale i/sau verticale. Record Selectors Specific dac exist sau nu n stnga nregistrrii, buton de selec ie a acesteia. Navigation Buttons Specific dac exist sau nu n partea de jos a formularului butoane pentru accesarea anumitor nregistrri. Prin acesta se poate ajunge la prima sau la ultima nregistrare a formularului se consider ordinea de afiare i nu aceea a plasrii fizice a nregistrrilor n tabelele legate la nregistrarea precedent sau urmtoare sau la o nou nregistrare n
II-20

vederea adugrii. De asemenea se afieaz numrul curent al nregistrrii, cte nregistrri sunt n formular i dac formularului i se aplic un filtru de selec ie. Dividing Lines Specific dac exist sau nu linii de separare a nregistrrilor. Auto Resize Specific dac formularul i modific forma, prin tragere, dac se recalculeaz sau nu dimensiunile obiectelor care sunt cuprinse n acesta. Auto Center Specific dac se pozi ioneaz sau nu formularul la mijlocul ecranului. Border Style exist urmtoarele posibilit i: Sizable Formularul poate fi maximizat, minimizat sau i se poate schimba forma prin tragere de margini. None Nici una din facilit ile de mai sus nu este valabil, i de asemenea nu are nici buton X de nchidere. Thin E ca Sizable, dar nu are margini de tragere. Dialog E ca None, dar are buton X de nchidere. Control Box Specific dac exist sau nu caseta de butoane din stnga barei de titlu. Min Max Button - Specific dac exist sau nu butoanele de maximizare/ minimizare n Control Box. Close Button Specific dac exist sau nu buton X de nchidere. Width L imea efectiv a formularului (nu a ferestrei de vizualizare a acestuia), n unitatea de msur stabilit n Windows | Control Panel | Regional Settings. Whats This Button Se poate seta pe Yes numai dac Min Max Button este No, i duce la introducerea n Control Box a butonului specific de Help assistant din MS Office. Picture Formularele pot avea eventual, o imagine de fundal, Background. Adresa fiierului care con ine imaginea (sunt acceptate mai multe tipuri: bmp, ico, wmf, emf, dib) se introduce n aceast proprietate. Picture Type Se stabilete dac fiierul respectiv este ncapsulat (embedded) sau legat (linked). ncapsularea n mai multe formulare a aceluiai fiier grafic duce totui la ocuparea spa iului pentru fiecare fiier n parte. Picture Size Mode exist urmtoarele posibilit i: Clip imaginea este preluat la dimensiunile ei reale; Zoom imaginea va fi mrit pn la dimensiunea ferestrei formularului dar i pstreaz propor iile; Stretch Imaginea va fi mrit pentru a ocupa ntreaga fereastr dar nu i pstreaz propor iile. Picture Alignement Se stabilete unde se plaseaz n fereastra formularului imaginea grafic. Picture Tiling Setat pe Yes, duce la repetarea imaginii grafice pentru a ocupa ntreaga fereastr a formularului. Grid X, Grid Y Distan a dintre liniile grilei de proiectare, n pixeli. Afiarea grilei de proiectare se face din View | Grid. Alinierea controalelor la aceast gril se face din Format | Snap To Grid. Pagina DATA, con ine propriet ile referitoare la datele formularului. Record Source Tabela sau cererea, de care este legat formularul. Filter Se poate introduce o expresie folosind regulile prezentate la cereri - care are rolul de a face o selec ie a nregistrrilor din surs. Dac se creeaz un filtru prin meniul Records, atunci cnd formularul este n execu ie, atunci acesta va fi introdus automat n aceast proprietate. Order By Se introduc cmpurile dup care se sorteaz nregistrrile din formular (aranjarea tuturor nregistrrilor din formular dup ordinea ascendent sau descendent a unuia sau mai multor cmpuri). Dac se dorete sortare descendent se introduce dup numele cmpului respectiv un spa iu i DESC. Implicit se consider sortarea ascendent. Dac sunt mai multe cmpuri de sortare, acestea se separ prin virgul. Ca i la filtre, dac se stabilete un cmp de sortare prin meniul Records, atunci cnd formularul este n execu ie, acesta va fi introdus automat n aceast proprietate. Crearea unui filtru sau al unui criteriu de sortare nu implic i activarea automat a acestuia. Activarea sau dezactivarea lor se poate face n timpul execu iei formularului n dou moduri: Fie din meniul de comenzi prin Records | Apply Filter, Sort sau Records | Remove Filter, Sort;
II-21

Fie din cod VBA, prin setarea la True sau False, a propriet ilor dinamice ale formularului: FilterOn OrderByOn Allow Filters, Allow Edits, Allow Deletions, Allow Additions Setate pe No, blocheaz comanda respectiv. Record Locks Se ntlnete i la cereri. Are rolul de a stabili ce nregistrri se blocheaz, cnd se lucreaz n re ea i mai mul i utilizatori acceseaz aceeai tabel sau cerere ncercnd s scrie n ea. Blocarea se refer la faptul c numai primul utilizator care modific zona respectiv poate s o fac, ceilal i fiind Read Only. Posibilit ile de blocare oferite de sistem sunt: No Loks nregistrrile nu sunt blocate, to i utilizatorii putnd scrie n acelai timp n aceeai nregistrare, ceea ce face ca sistemul s cear ce modificare rmne valabil, printr-un mesaj specific. Se folosete cnd aplica ia nu este folosit n re ea; All Records ntreaga tabel este blocat, numai un singur utilizator avnd dreptul s efectueze modificri, ceilal i putnd numai s citeasc din tabela respectiv; Edited Record Numai nregistrarea curent este blocat. Practic se blocheaz o zon de 2KB, ceea ce poate duce i la blocarea altor nregistrri; Pagina OTHER Pop Up Specific dac fereastra formularului va fi sau nu deasupra celorlalte ferestre. Modal Un formular modal se caracterizeaz prin faptul c, o dat preluat controlul, nu l mai cedeaz dect la nchiderea lui. Acest lucru poate fi valabil numai pentru aplica ia Access sau pentru toate aplica iile aflate n execu ie n momentul respectiv. Cycle Stabilete care este ordinea de accesare a nregistrrilor cnd se trece cu <Enter> sau <Tab> de la un control la altul i se ajunge la ultimul control din sec iunea de detail, stabilit conform ordinii tab (care se lanseaz din meniul contextual al formularului i prin care se fixeaz care este ordinea de parcurgere a controalelor dintr-o sec iune atunci cnd se trece de la un control la altul prin tastatur cu <Enter> sau <Tab>). Dac proprietatea este setat pe All Records, se va continua cu nregistrarea urmtoare, iar dac este Current Record, se va reveni la primul control din aceeai nregistrare. Menu Bar Numele unei alte bare de meniu creat de proiectant, care s nlocuiasc meniul standard din Access. Toolbar Numele unei alte bare de pictograme creat de proiectant, care s nlocuiasc bara de pictograme standard din Access, care apare la execu ia unui formular, i anume Form View. Shortcut Menu Specific dac se va permite sau nu apari ia meniului contextual al formularului. Shortcut Menu Bar Numele unui meniu contextual creat de proiectant, care s nlocuiasc pe cel standard care apare la execu ia unui formular. II.2.2.1.c) Evenimentele formularului Pagina Even Cele mai importante sunt: On Open i On Close Se produc la deschiderea, respectiv nchiderea formularului. Aceste evenimente pot fi anulate, adic nu se va mai produce deschiderea/ nchiderea formularului. n general se folosesc pentru ca utilizatorul s confirme aceste ac iuni. innd cont c sunt prima/ ultima ac iune care se produce n "existen a" unui formular, ele pot fi folosite i la anumite setri necesare n codul VBA. Exemplu. On Open Pentru a se crea o ac iune care s se execute la deschiderea unui formular (adic se ataeaz o metod evenimentului On Open) se va selecta
II-22

n pagina de evenimente a obiectului FORM, "Event Procedure". Prin apsarea pe cele trei puncte din dreapta, se va lansa un Wizard care va afia modulul de cod VBA al acestui formular, n care va nsera prima i ultima linie a procedurii corespunztoare acestui eveniment, urmnd ca utilizatorul s scrie secven a de instruc iuni n cod VBA. ' procedura ataat evenimentului open a formularelor Private Sub Form_Open(Cancel As Integer) ' Se folosete MsgBox ca func ie. ' Ea va afia o caset cu mesajul respectiv i cu doua butoane, Yes i No ' Dac utilizatorul apas pe: ' Yes func ia va ntoarce valoarea "vbYes" ' No func ia va ntoarce valoarea "vbNo" If MsgBox("Doriti deschiderea formularului.... ?", vbYesNo) = vbYes Then ' Ramura TRUE a instruc iunii IF.... utilizatorul a apsat pe Yes. ' Folosirea MsgBox ca procedur pentru afiarea unui mesaj MsgBox "Se deschide formularul.... " Else ' Ramura FALSE a instruc iunii IF.... utilizatorul a apsat pe No. Cancel = True ' Se anuleaz deschiderea formularului prin _ setarea la TRUE a parametrului CANCEL al procedurii MsgBox "Ati anulat deschiderea formularului... " End If End Sub O procedur eveniment va avea un nume care va con ine numele obiectului (n cazul nostru FORM) i numele evenimentului (OPEN), pe care sistemul l va crea automat. Procedurile eveniment pot avea parametri (declara i n aceeai linie de definire a procedurii, ntre paranteze rotunde), pe care sistemul i va introduce dac este cazul. Aceti parametri pot fi de: intrare con in nite valori pe care sistemul i ncarc n func ie de un anumit context i care pot fi folosi i n interiorul procedurii; ieire care vor fi eventual seta i de utilizator, pentru ca la terminarea procedurii (instruc iunea END SUB sau EXIT) sistemul s execute anumite ac iuni. Astfel parametrul CANCEL, atunci cnd apare ntr-o procedur eveniment, arat c dac se va seta pe TRUE, evenimentul respectiv va anula ac iunea care l-a produs, iar dac se seteaz pe FALSE, atunci ac iunea care a declanat evenimentul se va termina normal. On Load i On Unload Se produc la ncrcarea n memorie a formularului, respectiv eliberarea spa iului ocupat de el. Se produc dup, respectiv nainte de On Open/ On Close. Nu pot fi anulate. Before Update Se produce dup modificarea unei nregistrri, atunci cnd se iese din nregistrarea respectiv. Poate fi anulat. Se folosete n general pentru a verifica anumite corela ii ntre cmpurile unei nregistrri i a nu permite utilizatorului trecerea la o alt nregistrare (deci modificrile efectuate) dac acestea nu sunt corespunztoare (se va face parametrul CANCEL=TRUE). Exemplu. BeforeUpdate Private Sub Form_BeforeUpdate(Cancel As Integer) If (Me!DataNasterii.Value < Me!DataAbsolvireLiceu) And _ (Me!DataAbsolvireLiceu<Me!DataAbsolvireFacultate) Then Else MsgBox "Corectati corelatiile intre date" Cancel = True ' Nu se va permite trecerea la o nou nregistrare ' deoarece condi ia testat nu este adevrat End If End Sub n exemplul de mai sus s-au folosit obiectele DataNasterii, DataAbsolvireLiceu i DataAbsolvireFacultate, care sunt nite controale text box, legate de cmpurile tabelei ataate
II-23

formularului i care, n proprietatea VALUE, con in datele din cmpurile respective ale nregistrrii curente. Proprietatea VALUE fiind implicit la controalele text box, poate fi omis. After Update Se produce dup modificarea unei nregistrri, atunci cnd se iese din nregistrarea respectiv. Acest eveniment nu se poate anula, modificarea devenind definitiv. Se folosete n general pentru a calcula anumite valori i a le introduce n controale, la terminarea modificrilor dintr-o nregistrare (n formulare single, de obicei). Exemplu. AfterUpdate Avem un single formular legat la o tabel care con ine dou cmpuri, legate la rndul lor de controale tip text box, cu numele Cantitate i Pret. Al treilea control, Valoare, nu este legat de tabel i este Read Only, nepermi nd utilizatorului s modifice datele n el. Totui dorim ca n cazul n care cantitatea sau pre ul se modific, s se schimbe corespunztor i valoarea din acest control, la terminarea modificrii nregistrrii. Private Sub Form_AfterUpdate () Me!Valoare = Me!Cantitate * Me!Pret ' Proprietatea Value a controalelor nu este obligatorie, fiind implicit. Se poate folosi aceast proprietate att pentru citirea, ct i pentru introducerea datelor n control, func ionarea fiind deci asemntoare cu a unei variabile. End Sub Dac un control nelegat se gsete n sec iunea Detail a unui formular (sau raport) atunci valoarea care se gsete n el (calculat cu datele din nregistrarea curent cea care are cursorul) va fi afiat n toate detail-urile care se vd pe ecran (deci aceeai valoare la toate nregistrrile). Din aceast cauz s-a specificat un formular single. Totui, exemplul prezentat, dei corect, este cam ilogic. Gndi i-v de ce!! Before Insert i After Insert Este la fel ca cele dinainte dar se produc numai cnd se introduc nregistrri noi. On Current Se produce cnd se trece pe o alt nregistrare. Se folosete n general, pentru a efectua calcule, la ntrarea ntr-o nregistrare, cu datele din aceasta. Exemplu. On Current La aceeai aplica ie prezentat mai sus, dorim s facem acelai calcul al valorii i la intrarea n nregistrare. Private Sub Form_Current () Me!Valoare = Me!Cantitate * Me!Pret End Sub Dac nu am fi creat aceast metod pentru acest eveniment, atunci la intrarea ntr-o nregistrare am fi avut n controlul Valoare, rezultatul calculului anterior. On Timer Se produce dac proprietatea Timer Interval este diferit de zero. Dac n Timer Interval este o valoare numeric, atunci acesta va specifica, n milisecunde, intervalele de timp la care se lanseaz procedura eveniment introdus la On Timer. Exemplu. On Timer Private Sub Form_Timer () ' Se va executa la intervalul de timp care se gseste n proprietatea _ TimerInterval de pe pagina de evenimente a formularului. Aceasta _ avnd valoarea 60.000, nseamn c aceast procedur se va _ executa la fiecare minut. MsgBox "A mai trecut 1 minut !!" End Sub On Click, On Dbl Click, On Mouse Down, On Mouse Up, On Mouse Move Se produc la ac iunea respectiv a mouse-ului pe formular. On Key Down, On Key Up, On Key Press Se produc la ac iunea respectiv a tastaturii. On Error Se produce la o eroare datorat datelor. On Got Focus, On Lost Focus Se produc la primirea, respectiv pierderea focusului formularului. II.2.2.1.d) Metodele formularului Activarea acestor metode se face de obicei din modulul de cod VBA ataat formularului. n continuare prezentm cele mai utilizate metode ale formularelor.
II-24

Metoda Refresh Metoda Refresh va determina o remprosptare a unui formular cu datele actualizate ale tabelei ataate, dac aceasta se modific printr-un proces din afara modificrilor directe efectuate n tabel prin formular (acestea evident vor fi imediat sesizate). Un astfel de proces se poate efectua de exemplu dac: printr-o cerere ac iune se modific tabela ataat formularului; aplica ia ruleaz ntr-un mediu multiutilizator (ntr-o re ea de calculatoare) i un alt utilizator modific aceast tabel. Refresh se poate face i direct n view prin ac ionarea comenzii Records | Refresh. Aceast ac iune sistemul o face i automat la un interval de timp care se stabilete pentru toate formularele deschise, prin completarea propriet ii bazei de date Refresh Interval (n sec) din meniul Tools | Advanced. Evident, cnd se dorete o remprosptare imediat a afiajului unui formular, se va folosi metoda sus amintit. Metoda aceasta ac ioneaz numai asupra setului de nregistrri care exista la lansarea formularului, ea neavnd efect asupra: nregistrrilor noi introduse sau terse; cererilor folosite n diferite controale. (De exemplu avem un control combo Box care afieaz date dintr-o alt tabel care se modific dup lansarea formularului. Metoda refresh nu va actualiza acest control.) Metoda Requery Metoda Requery ac ioneaz ca i metoda Refresh dar este mult mai puternic deoarece ea reexecut toate cererile aferente formularului. Aceast metod este destul de lent, deoarece ea se comport ca i cum s-ar lansa din nou formularul (inclusiv pozi ionarea focusului pe prima nregistrare). Metoda Recalc Aa cum am mai artat, ntr-un formular pot exista controale calculate, care vor afia expresii n care pot interveni date din alte controale legate la cmpurile tabelei ataate formularului. n momentul n care se modific definitiv (se iese din control sau se trece la alt nregistrare) un control (cmp), se vor reface i calculele controalelor calculate n care acesta intervine. Sunt ns cazuri n care este necesar refacerea imediat a calculelor controalelor calculate, fr a modifica pozi ia cursorului dintr-un control. Metoda Recalc face aceast ac iune. Deci ea se comport ca i cum s-ar da o comand de trecere pe un alt control i o alt nregistrare, cu men inerea ns a cursorului pe pozi ia sa. Metoda Set Focus Cu aceast metod se poate muta focusul (cursorul) ntr-un formular, care evident este n execu ie. n general este folosit pentru mutarea focusului ntre dou formulare care se afl n execu ie. Exemplu. Forms("form1").SetFocus Aceast instruc iune va ceda cursorul (focus) formularului form1, evident cu condi ia ca acesta s fie deschis (obiectul Forms recunoate numai formularele care sunt deschise!). II.2.2.1.e) Obiectele sec iunilor formularului: Detail, Form_Header, Form_Footer Toate aceste sec iuni ale formularului au aceleai propriet i i evenimente. Pagina de Date, evident, nu are propriet i. Configurarea acestor obiecte este pu in uilizat n practica proiectrii formularelor. Singura proprietate mai folosit este Back Color prin care se stabilete culoarea de fundal a unei sec iuni. II.2.2.1.f) Referirea Subformularelor i a controalelor sale Un Subformular este un obiect inclus ntr-un formular, care con ine: Propriet i specifice, ce pot fi referite dup schema uzual. De exemplu: MsgBox Me.SF.RecordSource va afia numele tabelei legate de Subformularul cu numele SF, ce se gsete n formularul n al crui cod se afl instruc iunea. Controale, a cror referire se face prin utilizarea unei propriet i specifice unui Subformular i anume FORM.
II-25

De exemplu, dac n formularul deschis DesX, exist un Subformular cu numele SFm, n care exist un control text box TBB, atunci introducerea unei valori n acest control printr-o instruc iune aflat n modulul general de cod va fi: Forms!DesX!SFm.Form!TBB=100 II.2.2.2. Obiectul Control Text_Box (caseta de text) Cele mai utilizate tipuri de controale, folosite n proiectarea formularelor (ca i a rapoartelor) sunt prezentate n continuare prin prisma propriet ilor, metodelor i evenimentelor lor. Text Box este cel mai utilizat control folosit att n formulare ct i n rapoarte. Este un control care se poate lega la un cmp al unui tabel. Reprezint practic o caset n care se vor vizualiza datele din cmpul de care este legat, permi nd actualizarea acestora. De obicei este nso it de un control label (etichet), n care se va specifica ce reprezint datele din Text Box. II.2.2.2.a) Propriet ile controlului Text Box Prezentm n continuare propriet ile cele mai utilizate ale acestui control, cu observa ia c exist o serie de propriet i pe care le-am mai studiat anterior (la obiectul Form). Pagina FORMAT Pagina de Format con ine propriet ile prin care se configureaz formatul i stilul textului din caset. Font Name Felul fontei, adic tipul de liter folosit. Fontele care accept diacriticele romneti sunt cele cu termina ia 'CE'. (Alt font care accept caractere romneti este i 'MS Sans Serif'.) Pentru a se putea lucra cu diacritice romneti, tastatura trebuie setat corespunztor, pentru a doua limb, n Control_Panel | Keyboard. Fore Color Culoarea fontei. Font Size Mrimea n pixeli a fontei. Font Weight Grosimea fontei Font Italic Litera aplecat. Font Underline Subliniere. Text Align Alinierea textului n csu Border Style, Border Color, Border Width Se folosesc pentru configurarea marginii controlului. Special Effect Stabilete un tip standardizat de margine pentru control. Uneori setarea acestei propriet i are efect i asupra celor trei propriet i de mai sus. Exist 6 tipuri: Flat plat; Raised n relief; Sunken ngropat; Etched poansonat, zgriat; Shadowed cu umbr; Chiseled subliniat. Back Color Culoarea fundalului. Back Style Dac fundalul este sau nu transparent. n cazul transparen ei se va vedea obiectul de sub control, de obicei culoarea sec iunii n care se gsete acesta. n bara de meniu, n format, exist dou propriet i, care atunci cnd sunt activate vor seta toate obiectele selectate n momentul respectiv, n felul urmtor: Bring to Front aduce obiectele la suprafa ; Send to Back duce obiectele la fund; Prin aceste propriet i se poate stabili cum "se vd" obiectele suprapuse. Aceast proprietate poate fi folosit pentru a se marca explicit care este controlul n care se gsete cursorul (este activ). Aceasta se va realiza prin folosirea unei culori unice pentru controlul activ. Pentru aceasta se procedeaz astfel: Se face controlul cu Back Color culoarea controlului activ (de exemplu verde) i Back Style transparent.
II-26

Se creeaz un control grafic, Rectangle, "umplut" cu culoarea pe care vrem s o aib controlul (de exemplu galben) i de dimensiunile acestuia, care se aeaz dedesubt. n felul acesta controlul fiind transparent, va avea culoarea dreptunghiului de dedesubt (galben), iar cnd va primi focusul, culoarea setat pentru el (verde). Toate propriet ile prezentate mai sus se pot configura direct de pe bara cu pictograme "Formatting". Format n csu a de text avem o dat de tipul cmpului de care controlul este eventual legat. Avem posibilitatea s alegem ntre mai multe tipuri de afiare specifice tipului respectiv de dat. De asemenea acesta se poate crea i cu caracterele specifice de construire a formatelor. Decimal Places Numrul de zecimale al datelor de tip numeric. Visible Permite ca un control construit s poat fi fcut vizibil sau nu, n func ie de un anumit context. Scroll Bars Exist posibilitatea ca acest control s poat con ine mai multe linii de date. n acest caz este indicat s i se ataeze bara derulant vertical. Can Grow, Can Shrink Permite ajustarea controlului pe vertical, n cazul n care n control sunt un numr variabil de linii. Aceste propriet i sunt valabile numai la tiprire nu i la afiarea pe ecran. Deci ele sunt folosite n special la rapoarte. Left, Top, Width, Height Pozi ia (relativ la sec iunea unde se gsete) i mrimea controlului pe ecran, dat n cm sau inches, n func ie de cum e setat unitatea de msur n Windows. Ele se vor completa automat n momentul n care se va "aeza" pe ecran controlul. Access folosete i celelalte setri din Widows | Control Panel | Regional Settings ca punctul zecimal, formatul pentru or i dat, perioada anului din 2 cifre etc. Unit ile de msur folosite n Access sunt: Pixel unitate dependent de rezolu ia ecranului. Inches sau Cm n func ie de setarea din Windows. Se folosete de obicei n paginile de propriet i 1 Inch=2,54 cm. Punct 72/ inch Twips 1440/inch, 567/cm, 20/punct. Se folosesc cnd se introduc prin VBA dimensiuni pentru controale. Pagina DATA Control Source Numele cmpului (din tabela sau cererea ataat la formular sau raport) de care se leag controlul. Este cea mai important proprietate a controlului. Este posibil i legarea controlului de o expresie (cmp calculat). Pentru aceasta se va pune <=expresie> la Control Source. n felul acesta se pot introduce calcule cu cmpurile din nregistrare, se pot folosi func ii standard sau utilizator (publice, din obiectul Module) sau chiar func ii agregate de domeniu cu date din alte tabele. Exemplu. Avem un formular care n zona de Detail are dou controale legate, Pret i Cantitate i un control Valoare, care la Control Source are: =[Pret]*[Cantitate]. n acest fel mereu vom avea n controlul Valoare produsul datelor din celelalte dou controale, care la rndul lor vor avea valorile cmpurilor din nregistrrile tabelei ataate. De asemenea putem lucra cu controale nelegate (unbound). n acest caz de obicei vom introduce date n control prin cod VBA, prin proprietatea dinamic (nu se poate seta dect cnd formularul este n execu ie) Value, care este implicit (dac nu se specific explicit nici o proprietate atunci cea implicit Value va fi folosit). Aceast proprietate este Input / Output. n faza de proiectare, n interiorul controlului este afiat valoarea propriet ii Control Source. Input Mask, Default Value, Validation Rule, Validation Text Func ioneaz la fel ca la propriet ilor tabelelor. Dac nu se completeaz se preiau setrile fcute cmpului respectiv la crearea tabelei. Dac se seteaz n formular aceste propriet i atunci acestea sunt valabile numai n acest obiect (formular), nemodificndu-se propriet ile tabelei.
II-27

La Default Value, Validation Rule, Validation Text putem s ne referim i la alte nume de obiecte accesibile, spre deosebire de tabele n care nu puteam s ne referim la alt cmp. Enabled, Locked: Permisiunea de intrare n control, respectiv de modificare a datelor din el. Deci exist posibilitatea s se creeze controale Read Only (numai citete). Sunt mai multe posibilit i: Dac Enabled = Yes i Locked = No putem s intrm n control (pozi ionez cursorul n control) i s modificm datele din el; Dac Enabled =No nu putem s plasm cursorul n control (evident nici s modificm); Dac Enabled = Yes i Locked = Yes se poate pozi iona cursorul n control dar nu se pot modifica datele; Dac Enabled = No i Locked = No (nu are sens) controlul apare ters; Pagina OTHER Name Nume control. Acesta este numele obiectului pe care l folosim cnd vrem s ne referim la acest control. Dei nu este obligatoriu este bine ca n cazul controlului legat numele lui i al cmpului s fie acelai. Status Bar Text Cnd focusul ajunge n control, pe bara de stare (care se gsete n partea de jos a ecranului) va apare textul introdus aici. Tab Stop n momentul n care se termin introducerea datelor ntr-un control, focusul se va pozi iona pe urmtorul control din sec iune care are setat aceast proprietate cu Yes. Ordinea de parcurgere a controalelor se stabilete prin comanda Tab Order. Aceasta se gsete n meniul contextual sau n View i permite aezarea controalelor din sec iuni n ordinea dorit prin "tragere". Auto Tab Trecerea de la un control la altul se face cnd: se apas pe tasta <ENTER> sau <TAB>. dac Auto Tab = Yes atunci trecerea la urmtorul control se va face i automat n momentul n care s-au completat toate datele din acesta conform formatului specificat. Astfel dac avem un control legat la un cmp de tip text cu lungimea de 3 caractere, dup introducerea celui de-al treilea caracter, fr s se apese pe <ENTER> sau <TAB> se va trece automat la urmtorul control stabilit prin ordinea tab. Enter Key Behavior Dac aceast proprietate este = New Line in Field, atunci la apsarea lui <ENTER> cursorul se va pozi iona pe urmtoarea linie din control, iar trecerea la urmtorul control se va face numai prin apsarea tastei <TAB>. Evident proprietatea are sens dac controlul are mai multe rnduri. Shortcut Menu Bar Se poate crea un meniu contextual specific pentru control. Acesta se face prin comanda Customize. Control Tip Text Va apare textul introdus n aceast proprietate cnd se pozi ioneaz mouseul deasupra controlului. Allow Auto Correct Setat pe Yes, va determina efectuarea automat a corec iilor textului introdus, conform specifica iilor stabilite prin meniul Tools | AutoCorrect. Propriet ile implicite ale controlului Text Box Generarea obiectelor dintr-o clas de obiecte se face prin setarea corespunztoare a propriet ilor obiectului i prin ataarea de metode evenimentelor. n momentul n care se creeaz o clas de obiecte se stabilesc practic care sunt propriet ile, metodele i evenimentele obiectelor care sunt create din aceasta. Obiectele provenite dintr-o clas vor avea evident aceleai metode, evenimente i tipuri de propriet i. Ele vor forma o colec ie de obiecte, care este privit ca un tablou cu o dimensiune (vector), n care elementele sunt indexate (de la 0). Crearea controlului Text Box
II-28

se face prin generarea acestuia din clasa de obiecte cu acelai nume, prin luarea i plasarea controlului din ToolsBox. n momentul crerii acestui obiect, evident propriet ile lui trebuie setate la anumite valori, implicite (default), urmnd ca proiectantul s le personalizeze ulterior n func ie de contextul n care va fi folosit. Aceste propriet i implicite se pot modifica prin ac ionarea n caseta tab: Default Text Box, care se poate ob ine prin selec ia de pe ToolsBox a controlului i ac ionarea pictogramei de propriet i. Evident la generare, controlul trebuie s primeasc un nume, unic, care va fi constituit din numele controlului plus un numr de ordine n cadrul formularului sau raportului unde este plasat. Din propriet ile implicite mai interesante sunt: Auto Label yes, ataeaz o etichet controlului; Add Colon yes, eticheta se va termina cu dou puncte; Label X, Label Y pozi ia etichetei fa de control; II.2.2.2.b) Propriet ile dinamice ale controlului Text Box Propriet ile unui obiect pot fi statice i/ sau dinamice. Proprietatea static este proprietatea care se poate modifica cnd formularul este n proiectare, prin caseta tab. Proprietatea dinamic este proprietatea care poate fi modificat n momentul cnd obiectul este n execu ie, n general prin cod VBA, lansat de obicei printr-o procedur eveniment. Majoritatea propriet ilor sunt att statice ct i dinamice. Anumite propriet i sunt numai dinamice, ele neregsindu-se n caseta tab a controlului. Dintre propriet ile dinamice, cea mai important este VALUE. Aceast proprietate este implicit, numele ei putnd fi omis. Ea este Input/ Output, putnd fi deci i citit i scris. Reprezint valoarea care se gsete n control. Dac acesta este legat, aceast valoare se va gsi i n cmpul ataat. Dac controlul este calculat, atunci Value nu mai poate fi dect citit. SelLength, SelStart, SelText Se folosesc pentru a manevra cursorul i valoarea din interiorul unui control Text Box. Sunt propriet i Input/ Output. SelStart reprezint pozi ia de start a cursorului n control; SelLength reprezint lungimea textului selectat din control; SelText reprezint valoarea textului selectat. Exemplu. Urmtoarea secven de instruc iuni nlocuiete n controlul UM, primele 3 caractere dac sunt "xxx" cu "buc". UM.SetFocus ' plaseaz focusul n cursor Me!UM.SelStart = 0 ' numerotarea ncepe de la 0 Me!UM.SelLength = 3 ' selecteaz primele 3 caractere din control _ (0, 1, 2) If Me!UM.SelText = "xxx" Then Me!UM.SelText = "buc" ' proprietatea SelText folosit i Input i Output II.2.2.2.c) Evenimentele controlului Text Box Before Update Acest eveniment se produce dup ce a avut loc o modificare a datelor n control, dar care nu este definitiv, putnd fi anulat prin setarea parametrului procedurii eveniment ataate, Cancel=True. n acest caz, la terminarea procedurii eveniment, focusul rmne n control pn cnd utilizatorul introduce o alt valoare care nu mai produce Cancel=True. Acest eveniment se folosete de obicei pentru a executa o metod mai complex de verificare a datelor introduse n control, care depete posibilit ile oferite de proprietatea Validation Rule. After Update Se produce imediat dup evenimentul Before Update, modificrile fiind acum ns definitive, nemaiputnd fi anulate. Se folosete cnd valoarea introdus aici va furniza datele necesare calculelor din alte controale. On Change Se produce dup fiecare tastare n interiorul controlului. On Enter i On Exit Se produc la intrarea i la ieirea din control. Got Focus i Lost Focus Se produc la primirea/ pierderea cursorului n/ din control.
II-29

On Click, On Dbl Click, On Mouse Down, On Mouse Up, On Mouse Move Se produc la ac iunea respectiv a mouse-ului pe control. On Key Down, On Key Up, On Key Press Se produc la ac iunea respectiv a tastaturii cnd focusul se gsete n control. II.2.2.2.d) Metodele controlului Text Box Metodele cele mai folosite sunt: Set Focus plaseaz focusul n controlul text. Requery, Recalc acelai efect ca i la metodele similare de la formulare, dar referitoare numai la controlul asupra cruia se aplic metoda. Exemplu. Before Update, After Update, Set Focus

n formularul de mai sus dorim ca n cmpul "Cantitate" s avem o valoare n intervalul: [10. 000.. 100. 000] dac "UM" = buc; [100.. 10. 000] dac "UM" = Kg; [1.. 10] dac "UM" = Tone. Dac "UM" nu e completat corespunztor atunci se va introduce "null" la "Cantitate" i "UM" i se va trimite focusul n controlul "UM". Private Sub Cantitate_BeforeUpdate (Cancel As Integer) If Me!UM = "buc" Then If Me!Cantitate>=10000 And Me!Cantitate<=100000 Then ' corect instr. vid Else Cancel = True ' incorect se anuleaz evenimentul, deci focusul _ rmne n control End If ElseIf Me!UM = "Kg" Then ' o alt form a instruc iunii IF _ asemntoare CASE If Me!Cantitate >= 100 And Me!Cantitate <= 10000 Then ' corect instr. vid Else ' incorect Cancel = True'anuleaz evenimentul - focusul rmne n control End If ElseIf Me!UM = "Tone" Then 'corect instr. vid If Me!Cantitate >= 1 And Me!Cantitate <= 10 Then Else ' incorect Cancel = True'anuleaz evenimentul - focusul rmne n control End If Else ' partea ELSE de la instr. IF, ELSEFse ajunge aici numai dac _ UM este incorect ' Me!Cantitate = Null Aceast instruc iune nu se poate executa _ deoarece nu se poate schimba valoarea din control pn cnd _ modificarea nu devine definitiv. Deci vom fi nevoi i s introduce _ aceast instruc iune n procedura eveniment AfterUpdate, a _ aceluiai control. Me!UM = Null ' aceast instruc iune func ioneaz pentru c se _ modific datele din alt control End If If Cancel Then MsgBox "Cantitatea nu este corelat cu UM" ' se afieaz un mesaj dac n acest moment CANCEL = TRUE _ pentru ca utilizatorul s tie c a greit End Sub Private Sub Cantitate_AfterUpdate () If IsNull (Me!UM) Then ' testarea valorii null se poate face numai _ cu func ia IsNULL Me!Cantitate = Null ' Numai n acest moment se pot modifica _ datele din acest control
II-30

Me!UM. SetFocus ' Metod a controlului UM, prin care acesta _ preia focusul MsgBox "Completati corect mai intii UM" End If End Sub II.2.2.3. Obiectul Control Combo_Box (lista ascuns) Acest control este asemntor cu Text Box, dar are posibilitatea derulrii unei liste din care se pot prelua datele care se introduc. n momentul cnd ntr-o tabel un cmp a fost creat cu proprietatea Look Up, iar acel cmp e legat ntr-un formular la un control Combo Box, propriet ile definite n tabel nu trec automat i n formular. Acest lucru se face ns automat dac formularul este creat cu WIZARD-ul de formulare. Controlul Combo Box are aceleai propriet i i evenimente ca ale lui Text Box. n plus mai sunt propriet i i evenimente, care se refer la lista ascuns. II.2.2.3.a) Propriet ile specifice controlului Combo Box n pagina DATA sunt: Row Source Type Tipul sursei de date care va fi afiat n lista derulant. Aici se folosete de obicei: Table/ Query cmpuri din alt tabel sau cerere (sau o cerere introdus direct n SQL); Value List list de valori ca n exemplu; Row Source n cazul n care Row Source Type= Table/ Query este numele unei tabele, cereri sau direct o instruc iune SQL care genereaz o cerere (ca la legarea formularului la o tabel); Value List este o list de valori, separate prin <;> Bound Column Numrul coloanei de legtur (datele din aceast coloan vor fi preluate ca valoare pentru control) Limit To List Dac proprietatea este Yes nu se vor putea introduce n control dect datele care se gsesc n lista derulant iar dac este No, se pot introduce i alte date dect cele din list. Auto Expand Dac proprietate este Yes, atunci se caut i se afieaz cea mai apropiat denumire din list care s aib n partea de nceput caracterele introduse n control, pn n acel moment, de la tastatur. n pagina FORMAT sunt urmtoarele propriet i: Column Count Numrul de coloane care apar la desfacerea listei. Column Head Dac se afieaz sau nu denumirea coloanelor. Column Widths L imea coloanelor. Se separ cu <;>. List Rows Numrul de rnduri care se afieaz cnd se desface lista. Dac lista are mai multe rnduri dect sunt setate a se afia, vor apare barele de derulare verticale. List Width L imea listei derulante. Dac aceasta este mai mic dect suma tuturor coloanelor afiate, vor apare barele de derulare verticale. Setat pe Auto, l imea listei va fi la fel ca l imea controlului Combo Box. Toate dimensiunile se dau n unitatea de msur setat n Windows. Aceast caracteristic este general n tot mediul Access. Reamintim c n VBA, dimensiunile sunt cerute n Twips. Exemplu. ntr-un formular se gsesc dou controale Combo Box, cu numele: CFm i CControl. La deschiderea formularului (evenimentul Open) se va introduce n lista ascuns a lui CFm proprietatea RowSource numele tuturor formularelor deschise din acel moment. La introducerea unei valori n CFm (evenimentul AfterUpdate a lui CFm), se va introduce n lista ascuns a lui CControl proprietatea RowSource numele tuturor controalelor din formularul al crui nume este n CFm.
II-31

Private Sub Form_Open(Cancel As Integer) ' La deschiderea formularului evenimentul Open al formularului _ se va configura lista ascuns a controlului Combo Box CFm Dim FM As Form Dim sForm As Variant ' ntr-un string sForm, se introduc formularele deschise (separate cu ;) _ Acesta se va introduce n proprietatea RowSource _ a controlului ComboBox CFm, configurat ca list de valori _ (proprietatea RowSourceType="Value List") sForm = Empty For Each FM In Forms ' Se parcurge toat colec ia formularelor deschise sForm = sForm & FM.NAME & ";" Next FM If IsEmpty(sForm) Then ' Nu exist nici un formular deschis _ acest lucru nu este posibil deoarece cel pu in _ formularul n care se gsete codul acesta e deschis Me.CFm.RowSource = "Nici un formular deschis??!!" Else ' Se configureaz cu numele formularelor deschise _ lista de valori a controlului Combo Box Me.CFm.RowSource = Left(sForm, Len(sForm) - 1) End If End Sub Private Sub CFm_AfterUpdate() ' Evenimentul AfterUpdate al lui CFm _ Se produce dup ce se introduce definitiv _ o valoare n CFm aceasta reprezentnd _ numele unui formular deschis Dim Ct As Control Dim sCtl As Variant 'Se configureaz un string cu controalele existente (separate cu ;) _ n formularul deschis al crui nume este n Me.CFm _ i cu care se configureaz proprietatea _ RowSource a controlului Combo Box CControl configurat _ ca list de valori (proprietatea RowSourceType="Value List") sCtl = Empty For Each Ct In Application.Forms(Me.CFm).Controls 'Se parcurge toat colec ia de controale a formularului _ al crui nume este n Me.CFm sCtl = sCtl & Ct.NAME & ";" Next Ct If IsEmpty(sCtl) Then ' Nu exist nici un control Me.CControl.RowSource = "Nu este nici un Control??!!" Else ' Se configureaz cu numele controalelor _ lista de valori a controlului Combo Box CControl Me.CControl.RowSource = Left(sCtl, Len(sCtl) - 1) End If End Sub
II-32

II.2.2.3.b) Evenimentul specific controlului Combo Box. Not In List Evenimentul se produce dac Limit To List=Yes. Se folosete cnd dorim ca atunci cnd utilizatorul ncearc introducerea unei valori din afara listei, dup o confirmare, aceast valoare s completeze lista derulant, i s poat fi folosit n continuare, ca n EXEMPLUL urmtor, care va crea aceast posibilitate pentru controlul combo "UM" prezentat mai sus. Private Sub UM_NotInList(NewData As String,Response As Integer) Dim RaspunsUtilizator As Integer ' variabila n care stocm rspunsul _ utilizatorului: NewData parametru de intrare care va avea valoarea datei introduse n control i care nu s-a gsit n list. Response parametru de ieire care poate lua 3 valori care vor fi explicate mai jos RaspunsUtilizator = MsgBox ("Doriti introducerea n lista _ derulanta a valorii " & NewData & " ?", _ vbQuestion + vbYesNoCancel) ' genereaz o caset cu 3 butoane If RaspunsUtilizator = vbYes Then ' completez proprietatea cu noua valoare Me!UM. RowSource = Me!UM. RowSource & ";" & NewData Response = acDataErrAdded ' dac se d valoarea de mai sus se va determina: _ blocarea mesajului standard al sistemului, _ se va face automat requery pe control pentru ca acesta s-i modifice lista derulant ElseIf RaspunsUtilizator = vbNo Then ' n cazul n care se d NO, atunci se va bloca mesajul standard de_ eroare Response = acDataErrContinue Me!UM = Null ' se terge valoarea din control, ateptndu-se o nou _ valoare Else ' cazul cancel ' n cazul n care se d NO, atunci se va afia mesajul standard de _ eroare i se va cere introducerea unei date din lista derulant Response = acDataErrDisplay ' e implicit aceast valoare, deci _ poate lipsi instruc iunea End If End Sub II.2.2.4. Obiectul Control List_Box (list derulant) List Box este asemntoare cu combo box, dar lista nu este ascuns, ci este afiat tot timpul. II.2.2.5. Obiectul Control boolean Option_Button, Check_Box, Toggle_Button Sunt controale booleene. n Access valoarea boolean poate lua 3 valori i anume: True (adevrat); False (fals); NULL (nedeterminat nu se tie). Pentru aceasta aceste butoane au o proprietate: Triple State. Dac Triple State are valoarea No, butonul are 2 stri: True i False; iar dac este setat pe Yes, butonul va avea toate cele trei stri. n acest din urm caz controlul trebuie legat numai de un cmp integer sau long. Valoarea NULL se va reprezenta printr-o imagine tears a controlului. II.2.2.6. Obiectul Control Option_Group Option Group este un control n care se pot introduce dou sau mai multe dintre controale booleene prezentate mai sus (toate vor fi de acelai fel). Specific acestui grup este c numai unul dintre controalele din interiorul lui se poate pozi iona pe True, celelalte devenind automat False. Un control individual boolean se leag aa cum am vzut la cmpuri de tip boolean sau integer, putnd lua dou sau trei valori booleene.
II-33

Cmpul de care se leag Option Group este o dat de tip integer. Valoarea introdus va fi n general numrul de ordine n grup al controlului boolean care este pe True. Pe Tools Box se afl un buton pentru activarea unui Wizard. Dac este apsat atunci cnd se face controlul grup de op iuni, sistemul va ndruma configurarea lui, punnd ntrebri referitoare la numele controlului Option Group, la ce fel i cte controale booleene s con in, la ordinea i valoarea butoanelor n grup, la cmpul de legtur i care dintre butoane va fi implicit pe True. II.2.2.7. Obiectul Control Label (etichet) Este cel mai utilizat control nelegat de un cmp. Proprietatea cea mai important a controlului este Caption, care va con ine textul afiat de control. Forma controlului se configureaz la fel ca la Text Box. II.2.2.8. Obiectul Control grafic Line, Rectangle, Picture Aceste controale nu sunt legate de cmpuri. Ele vor crea figura specificat n titlu. Controlul Rectangle poate fi i umplut n interior. II.2.2.9. Obiectul Control Command_Button n general se ataeaz evenimentului Click o metod care s efectueze o comand specific. II.2.3. Obiectul DoCmd Obiectul DoCmd con ine metode care permit execu ia majorit ii comenzilor puse la dispozi ie n MS Access. Astfel exist posibilitatea deschiderii sau nchiderii unor obiecte (formulare sau rapoarte), transferului de date cu alte aplica ii (Excel, Access, Fox etc.), setrii valorilor unor controale, schimbrii cursorului mouse-ului ntr-o clepsidr (hourglass) etc. Execu ia unei comenzi Access se face astfel: [Application.]DoCmd.NumeMetoda [arg1, arg2, ...] n care argumentele sunt n func ie de metoda executat; acetia pot fi obligatorii sau op ionali, caz n care exist valori implicite pentru ei. Cteva metode ale obiectului DoCmd sunt prezentate n continuare: OpenForm,OpenReport,OpenQuery,OpenTable,OpenModule permit deschiderea obiectului Access specificat. Close nchid un obiect Access precizat n argument (Form, Report, Query, Table, Module). DeleteObject terg un obiect Access, precizat n argument (Form, Report, Query, Table, Module). TransferDatabase, TransferSpreadsheet, TransferText export/ import obiecte ntre MS Access i MS Access, MS Excel sau MS-DOS text. Maximize permite mrirea la maxim a ferestrei active. Minimize permite micorarea i plasarea pe bar a ferestrei active. GoToRecord permite ca ntr-o tabel, formular sau cerere s se mute cursorul nregistrrii curente pe o anumit nregistrare. GoToControl permite ca ntr-o tabel, formular sau cerere, s se mute focusul pe un anumit control (cmp) din cadrul nregistrrii curente. FindRecord permite pozi ionarea pe prima nregistrare care respect un criteriu de selec ie. FindNext permite pozi ionarea pe urmtoarea nregistrare care respect un criteriu de selec ie. RunCommand permite execu ia unei comenzi Access care se gsete pe bara de meniuri, pe toolbar sau n meniul contextual. RunMacro, RunSQL permite execu ia unui Macro sau a unei cereri ac iune. Hourglass transform cursorul mouse-ului ntr-o clepsidr. SetWarnings anuleaz mesajele care apar la execu ia unei ac iuni. SelectObject permite setarea focusului pe un obiect Access care l poate primi, fcndu-l eventual i vizibil. CopyObject permite copierea unui obiect de date n aceeai (cu alt nume) sau alt aplica ie Access.
II-34

File)

Save permite salvarea unui obiect Access n diferite formate (vezi comanda Save As din meniul

OutputTo permite trimiterea unor date Access (datasheet, form, report, module) n fiiere de tip Microsoft Excel 97 (*.xls), MS-DOS text (*.txt), rich-text (*.rtf), HTML, Microsoft ActiveX Server (*.asp) etc. SendObject permite ataarea unor date Access (datasheet, form, report, module) la un e-mail. Restore permite restaurarea la dimensiunea anterioar a unei ferestre maximizate sau minimizate. Dac o fereastr este minimizat, nainte de aplicarea metodei Restore, trebuie selectat cu SelectObject. Quit provoac ieirea din MS Access, cu eventuala salvare a obiectelor modificate. Requery efectueaz metoda requery pentru un control specificat n argumente. Rename redenumete un obiect de date. ApplyFilter permite aplicarea unei selec ii asupra unor nregistrri, printr-un filtru, cerere sau clauza Sql Where. ShowAllRecords elimin selec ia produs prin ApplyFilter. Beep emite un semnal sonor. Echo permite sau nu afiarea mesajelor sistem (Echo) pe bara de stare. Dac Echo este off, atunci se poate plasa un text propriu pe bara de stare. CancelEvent permite anularea evenimentului care a produs execu ia acestei ac iuni. ShowToolbar face On/ Off un anumit toolbar. Exemplu. ' deschide formularul For i se pozi ionaz nregistrarea curent pe_ adugare de nregistrare DoCmd.OpenForm "For", acNormal DoCmd.GoToRecord,, acNewRec DoCmd.Hourglass True ' face mouse-ul clepsidr ' nchide formularul For DoCmd.Close acForm, "For" II.2.4. Obiectul Screen Obiectul Screen, prin propriet ile sale, acceseaz obiectele Access (form, report, control, datasheet) care de in n acel moment focusul, deci sunt n fereastra activ. Aceste propriet i sunt Read Only i n ele se va gsi referin a ctre obiectele specificate care de in focusul. Cu obiectul Screen, nu este posibil ca s se determine ca un anumit obiect s preia focusul. Acest lucru este posibil prin metoda SelectObject a obiectului DoCmd, sau prin metoda SetFocus a unor obiecte. Printre propriet ile obiectului Screen, enumerm: ActiveForm identific i creeaz o referin ctre obiectul Form, care de ine n acel moment focusul. ActiveReport identific i creeaz o referin ctre obiectul Report, care de ine n acel moment focusul. ActiveDatasheet identific i creeaz o referin ctre obiectul Datasheet, care de ine n acel moment focusul. ActiveControl identific i creeaz o referin ctre obiectul Control, care de ine n acel moment focusul. PreviousControl creaz o referin ctre ultimul control care a avut focusul. Aceste propriet i, aa cum s-a artat, ntorc referin e ctre obiectele specificate. Ele se vor comporta n continuare ca nite variabile obiect, permi nd accesarea propriet ilor i metodelor acestora. Exist posibilitatea ca proprietatea specificat n obiectul Screen s nu poat fi accesat. n acest caz sistemul va provoca o eroare de execu ie. De exemplu, ca PreviousControl s ntoarc o referin este necesar s se fi deschis cel pu in un formular i focusul s fi fost de inut de cel pu in dou controale din acesta. Dac nu sunt ndeplinite cele dou condi ii se produce eroarea de execu ie cu nr. 2483. Exemplu. ntr-un formular, la apsarea butonului de comand BCMD, se va afia un mesaj prin care se specific, dac se poate, numele ultimului control care a fost accesat i valoarea din acesta.
II-35

Private Sub BCMD_Click() Dim Ctl As Control Dim NumeCtl As Variant Dim ValCtl As Variant ' Nr. Eroare 2483 nu s-au accesat minim dou controale, deci nu exist _ un control precedent Const NoPrevious = 2483 ' Nr. Eroare 2427 controlul nu are definit proprietate VALUE Const NoValue = 2427 On Error GoTo Process_Err ' dac va apare o eroare de execu ie, _ se va continua rutina de la eticheta Process_Err ' Var. obiect Ctl, va referi, dac se poate, precedentul control Set Ctl = Application.Screen.PreviousControl NumeCtl = Ctl.NAME ValCtl = Ctl.Value MsgBox "Precedentul control " & vbCr & _ "-Nume=" & NumeCtl & vbCr & _ "-Valoare=" & ValCtl Process_Bye: ' Aa se declar o etichet Exit Sub Process_Err: If err.Number = NoPrevious Then MsgBox "Focusul nu a fost pe cel pu in dou controale" ElseIf err.Number = NoValue Then MsgBox "Controlul " & NumeCtl & "nu are proprietatea VALUE" Else MsgBox "Alta Eroare " & err.Number & "/ " & err.Description End If Resume Process_Bye 'Anuleaz eroarea i se duce la etichet Process_Bye End Sub Exemplu. La apsarea pe butonul de comand CtActiv, s se afieze formularul i controlul care au focusul. Private Sub CtActiv_Click() Dim Frm As Form, Ctl As Control ' ntoarce referin a ctre obiectul Form activ Set Frm = Screen.ActiveForm MsgBox Frm.NAME & "este formularul activ" ' ntoarce referin a ctre controlul care are focusul Set Ctl = Screen.ActiveControl MsgBox Ctl.NAME & "este controlul activ " & vbcr _ "-din formularul " & Frm.NAME End Sub

II-36

II.3. Modelul DAO Data Access Objects


II.3.1. Modelul DAO Structura ierarhic arborescent Modelul DAO Data Access Objects (obiecte pentru acces la date) permite ca printr-un limbaj de programare s se acceseze o baz de date local (din aplica ia curent) sau din alt aplica ie (fiier mdb/ mde). Ea permite gestionarea structurii (schema) i a informa iilor acesteia. Modelul DAO con ine toate colec iile de obiecte i obiectele bazei de date, precum i o serie de rutine, constante, tipuri de date, help-uri etc., necesare manipulrii acestora. Structura acesteia este dat n figura de mai jos. DBEngine
Workspaces Errors

Workspace(0)
Databases Users

Workspace(1)
Groups

Current DB
TableDefs QueryDefs Relations RecordSets Containers

Tabela_A Fields N A

Tabela_B Indexes A Fields A

Cerere_A Fields N

Tabela_A Tabela_B

Tabela_A Fields N

0-Databases 1-Forms 2-Modules


3-Relationships

Parameters Fields

Numar A A1

N A

4-Reports 5-Scripts 6-SysRel 7-Tables

Documents
Tabela_A Tabela_B

PrimaryKey

Fields N

Legend Obiecte Colec ii

Cteva din caracteristicile modelului DAO sunt prezentate n continuare. n primul rnd modelul DAO are o structur ierarhic arborescent, al crui nivel superior l constituie obiectul DBEngine. Acesta este deosebit fa de celelalte obiecte din modelul DAO. El este singular i nu apar ine nici unei colec ii, fiind tratat ca o excep ie. Fiecare obiect din structura DAO face parte dintr-o colec ie de obiecte. De asemenea el con ine la rndul su una sau mai multe colec ii de obiecte. Exemplu. Obiectul Tabela_A, este un obiect de tip TableDef, care face parte din colec ia TableDefs, a bazei de date locale a aplica iei. El con ine dou colec ii de obiecte, Fields i Indexes. Obiectele (cu excep ia celor din colec ia Errors) au propriet i Property care sunt constituite n colec ia de propriet i a obiectului respectiv Properties. Fiecare obiect are o proprietate implicit. De obicei aceasta este proprietatea Value. Toate obiectele i pstreaz numele n proprietatea Name. Obiectele (excep ie obiectele Error) au posibilitatea ca prin metode de tip Create i Append s creeze i adauge obiecte la colec iile de obiecte din structura lor. De asemenea cu metoda Delete se pot terge obiecte din colec ii.
II-37

Unele obiecte sunt create deja (TableDef de exemplu) i se folosesc ca atare indicndu-se numele lor (cu regulile obinuite de calificare), pe cnd altele (Database sau Recordset), ca s fie folosite, mai nti trebuie deschise cu metode de tip Open. Obiectele care se deschid au metode de nchidere Close. Totui acestea se pot nchide i automat, atunci cnd se termin modulul n care au fost declarate. DAO con ine 17 tipuri diferite de obiecte. VBA va con ine pentru toate tipurile de colec ii, tipuri de date care au chiar numele colec iei. (De exemplu se pot creea variabile de tip TableDefs, pentru colec ia care con ine structura tuturor tabelelor din baza de date.) Pentru obiectele care apar in unei colec ii, VBA are definite alte tipuri de date care au tot numele colec iei, dar la singular. (De exemplu se poate folosi o variabil de tip TableDef, pentru a se introduce structura unei tabele). II.3.2. Obiectul DBEngine DBEngine, aa cum am artat, este obiectul din vrful modelului ierarhic arborescent DAO. Folosirea lui ntr-o aplica ie Access pentru referirea obiectelor din DAO este op ional, el fiind considerat implicit. DBEngine con ine ntreaga structur DAO. El este obiectul ctre care trebuie fcut transferul de date, dac se dorete folosirea unei baze de date Access, din alte aplica ii care au implementat tehnologia Automation (de exemplu: MS Excel, MS Word, Visual Basic etc.) DAO nu ofer posibilitatea crerii altor obiecte DBEngine. DBEngine con ine dou colec ii de obiecte: Workspaces i Errors. II.3.3. Colecia Workspaces Spaiul (mediul) de lucru Workspace reprezint suportul n care o baz de date poate fi utilizat, mpreun cu sistemul de securitate folosit. DAO poate func iona n dou medii specifice unor anumite tipuri de baze de date, i anume: Microsoft Jet Workspace, care permite folosirea motorului Microsoft Jet, n care se pot utiliza baze de date Access (fiiere .mdb) sau surse ISAM: FoxPro, DBase, Paradox, Lotus. n felul acesta se pot crea aplica ii care pot "lega" mai multe tipuri de baze de date. ODBCDirect Workspace, prin care se pot accesa servere specializate de baze de date (de exemplu Microsoft SQL) prin metoda ODBC (Open Data Base Connectivity). Aplica ia server/ client Este o metod de realizare a unei aplica ii, n care cereri sau proceduri sunt formulate de aplica ia client, urmnd ca execu ia lor s se fac pe serverul de aplica ie, care va con ine baza de date (back-end server). ntre un server de aplica ie i un server de fiiere exist o diferen clar. Urmtorul exemplu va lmuri acest lucru. Presupunem c avem o baz de date (o colec ie de date specifice unei anumite activit i) i nite programe (aplica ii) care gestioneaz datele respective, adic le actualizeaz (adugri, tergeri sau modificri) sau extrag informa iile necesare derulrii activit ii respective. Aceast aplica ie va trebui accesat de mai mul i utilizatori. Astfel putem avea o companie de avia ie i pentru rezervarea locurilor la un zbor, mai multe agen ii ale acesteia, rspndite geografic, trebuie s tie precis care este starea ocuprii locurilor, iar n cazul unei noi rezervri, s informeze imediat acest lucru. Evident trebuie s avem o re ea de calculatoare, cu baza de date a zborurilor plasat pe un anumit calculator, de unde s fie accesat "on line", de clien i (n special agen iile de turism). Exist n continuare dou posibilit i de realizare a acestui lucru i anume cu un server de fiiere sau un server de aplica ii. n primul caz, al serverului de fiiere, vom plasa pe un server baza de date, iar pe toate sta iile de lucru de la agen ii, programele aplica iei. O cerere de prelucrare se va desfura n felul urmtor: se vor aduce prin re ea, de la serverul cu datele la sta ia de lucru, toate informa iile de la toate zborurile companiei, aici se vor extrage datele de la zborul care intereseaz, dup care, dac s-a fcut o rezervare, va fi trimis acest lucru imediat la serverul de date. Observm c pe re ea se vor transmite att informa ii utile ct i cele care nu sunt necesare la un moment dat. O astfel de aplica ie se numete aplica ie client.
II-38

n al doilea caz, al serverului de aplica ii, n afara bazei de date, pe server, vom avea i o parte din programele aplica ie i anume cele care acceseaz direct baza de date. La o sta ie de lucru unde exist cealalt parte a programelor aplica iei i anume interfa a cu utilizatorul o cerere de prelucrare (datele despre un zbor) va fi trimis serverului de aplica ii. Acesta va efectua extragerea din baza de date numai a informa iilor necesare, pe care le va trimite pe re ea napoi utilizatorului. Observm n acest caz, reducerea substan ial a informa iei transmise prin re ea, ceea ce face aplica ia mult mai performant, chiar dac este mult mai complex. O astfel de aplica ie se numete server/ client. n cadrul acestui capitol, se va prezenta numai Microsoft Jet Workspace. Implicit, DAO are un spa iu (mediu) de lucru, #Default Workspace# {care fiind primul din colec ia Workspaces se poate referi i Workspaces(0)} de tip Microsoft Jet, n care este plasat i baza de date local. Cnd se face referire la baza de date local, referirea obiectelor poate s nu con in nici DBEngine nici spa iul (mediul) de lucru Workspaces(0), deoarece amndou sunt implicite. Prin metoda DBEngine, CreateWorkspace, se pot creea i alte obiecte Workspace, ce pot fi ataate n memoria colec iei Workspaces prin metoda Append. Exemplu. De creare a dou obiecte Workspace, unul de tip Microsoft Jet, cellalt ODBCDirect i de vizualizare a propriet ilor acestora. Sub Prop_Workspace() Dim WS1 As Workspace Dim WS2 As Workspace Dim WS As Workspace Dim PR As Property ' obiect din colec ia Properties ' Se creaz dou spa ii de lucru cu metoda CreateWorkspace _ Microsoft Jet _ ODBCDirect ' Parametrii sunt n ordine: _ 1. Numele spa iului de lucru _ 2. Numele utilizatorului care are acces la el _ 3. Parola _ 4. Tipul mediului de lucru, i anume se folosete constanta: _ dbUseODBC Mediu ODBCDirect _ dbUseJet Mediu ODBCDirect Set WS1 = DBEngine.CreateWorkspace("WorkspaceODBC", _ "admin", "", dbUseODBC) Set WS2 = DBEngine.CreateWorkspace("WorkspaceJet", _ "admin", "", dbUseJet) ' Dup crearea unui spa iu de lucru ODBC acesta se ataeaz _ n memoria colec iei Workspaces cu metoda Append Workspaces.Append WS1 ' Nu s-a folosit DBEngine, deoarece e implicit Workspaces.Append WS2 ' Colec ia Workspace i propriet ile obiectelor din aceasta For Each WS In Workspaces If MsgBox("Spatiul:" & WS.NAME, _ vbOKCancel + _ vbCritical) = vbOk Then On Error Resume Next ' ignor erorile care pot aprea.... Vezi colec ia Errors For Each PR In WS.Properties MsgBox " Proprietatea:" & PR.NAME & " = " & _ PR.Value Next PR On Error GoTo 0 ' Reface sistemul de erori standard End If
II-39

Next WS End Sub Un obiect Workspace con ine 3 colec ii de obiecte, i anume: Databases care va con ine unul sau mai multe obiecte Database, n fiecare putndu-se deschide cte o baz de date, local sau din afar. Users i Groups, prin care se implementeaz sistemul de protec ie al spa iului (mediului) de lucru. Aceste obiecte nu vor fi prezentate n acest modul. II.3.4. Tratarea erorilor de execuie n VBA Colec ia Errors func ioneaz n contextul sistemului general de erori implementat n VBA, care va fi prezentat n cele ce urmeaz. II.3.4.1. Tratarea standard a erorilor de execu ie produse n VBA n momentul producerii unei erori de execu ie ntr-o rutin, sistemul va ntrerupe execu ia i va afia mesajul din csu a alturat, n care se poate vedea numrul erorii i o descriere sumar a acesteia (dac se lucreaz ntr-un mediu Run Time mediu de lucru pentru Access similar unui program executabil nu se va mai afia nici aceast descriere). n continuare utilizatorul poate apsa pe: Butonul End se oprete execu ia codului i se reini ializeaz toate variabilele aplica iei. Este evident c sunt anse mici ca aplica ia s poat fi reluat de utilizator n condi ii corecte. Butonul Debug se va afia codul de program care a generat eroarea, cursorul de instruc iuni (linia galben) pozi ionndu-se pe instruc iunea care a produs eroarea i permi nd utilizatorului s depaneze eventual programul prin modificarea instruc iunilor. Acest sistem se poate folosi numai n perioada de testare de ctre proiectant a aplica iei, pstrarea lui n exploatarea aplica iei fiind extrem de periculoas. Butonul Debug este activ numai dac se lucreaz pe un fiier MDB, care are codul de program i n limbajul surs (dac aplica ia este ntr-un fiier de tip MDE, butonul este inactiv). Dac se introduce n variabila A2, de tip numeric, un caracter alfabetic, atunci se va afia mesajul prezentat mai sus. De asemenea dac se va introduce 0 n A2 se va afia mesajul de eroare datorit mpr irii la 0. Public Function Eroare_Standard() As Variant ' Func ie care va trata o eventual eroare prin _ sistemul standard VBA de control al erorilor Dim A1 As Double Dim A2 As Double Dim R As Double A1 = 1000 A2 = InputBox("A2=") R = A1 / A2 'Dac o eroare se va produce pn aici, _ instruc iunile ce urmeaz nu se vor mai executa!! MsgBox "Rezultatul lui " & A1 & "/" & A2 & "=" & R Eroare_Standard = R End Function II.3.4.2. Tratarea erorilor de execu ie prin module specializate VBA ofer posibilitatea ca la producerea unei erori de execu ie sistemul s dea controlul la un modul special creat de proiectant prin care s se trateze n mod corespunztor eroarea. Un astfel de modul se numete rutin de tratare a erorilor (Error-handling). De asemenea, proiectan ii de aplica ii pot folosi producerea unor erori previzibile, n vederea rezolvrii mai "elegante" a unor cazuri normale de prelucrare. Controlul erorilor de execu ie se realizeaz prin dou instruc iuni i dou obiecte create special n acest scop:
II-40

II.3.4.2.a) Instruc iunea: On Error On Error este o instruc iune care atunci cnd este ntlnit i executat, produce asupra codului VBA care urmeaz dup aceasta dou ac iuni (indirecte): Dezactivarea sistemului standard de tratare a erorilor de execu ie. Dac dup execu ia instruc iunii On Error, n rutina respectiv se produce o eroare de execu ie, atunci nu mai este afiat mesajul standard de eroare pe care l-am prezentat nainte. De asemenea inversa acestei afirma ii este i ea valabil, adic dac ntr-o rutin se produce o eroare de execu ie nainte de a se executa instruc iunea On Error, se va continua prelucrarea prin sistemul standard de tratare a erorilor prin afiarea mesajului respectiv. Pozi ia pe care se va plasa cursorul de instruc iuni, n cazul apari iei unei erori de execu ie. Dac dup execu ia instruc iunii On Error, n rutina respectiv se produce la un moment dat o eroare de execu ie, atunci instruc iunea On Error va preciza i care este urmtoarea instruc iune care se va executa n cazul producerii unui asemenea eveniment. Exist trei forme ale instruc iunii On Error, n func ie de locul de unde se va continua execu ia n cazul apari iei erorii de execu ie: a) On Error GoTo etichet la producerea unei erori, prelucrarea va continua cu instruc iunile care se gsesc dup etichet. Aceast form este folosit atunci cnd se va folosi un modul specializat pentru tratarea erorii, Error-handling, care se va gsi dup aceast etichet. O etichet se declar printr-un nume scris la nceputul unei linii urmat de semnul dou puncte (:). O etichet este vizibil numai n rutina n care a fost declarat. b) On Error Resume Next la producerea unei erori, prelucrarea va continua cu urmtoarea instruc iune care se gsete dup aceea care a produs eroarea. Deci practic prin aceast form prelucrarea va continua fr a se mai executa instruc iunea care a produs eroarea. c) On Error GoTo 0 reinstaleaz sistemul standard de tratare a erorilor. n procedura prezentat mai nainte, Prop_Workspace, existen a unor propriet i fr valoare determin eroare la execu ia instruc iunii MsgBox care afieaz mesajul cu valoarea propriet ii. ncadrarea lui MsgBox ntre instruc iunile On Error Resume Next i On Error GoTo 0, va determina practic ignorarea instruc iunii MsgBox n cazul producerii unei erori. II.3.4.2.b) Instruc iunea: Resume Resume este instruc iunea prin care se iese din rutina de tratare a erorilor (Error-handling). Exist trei forme ale instruc iunii Resume, n func ie de locul de unde se va continua execu ia, dup ce se termin execu ia rutinei de tratare a erorilor. a) Resume etichet prelucrarea va continua cu instruc iunile care se gsesc dup etichet. b) Resume Next prelucrarea va continua cu urmtoarea instruc iune care se gsesc dup aceea care a produs eroarea. Deci practic prin aceast form prelucrarea va continua dup tratarea erorii, fr a se mai executa instruc iunea care a produs eroarea. c) Resume 0 sau Resume prelucrarea va continua chiar cu instruc iunea care a produs eroarea. Deci, dup execu ia rutinei de tratare a erorii, se va relua execu ia instruc iunii care nu s-a putut executa. II.3.4.2.c) Obiectul: Err Err este un obiect care se gsete n VBA i cruia n momentul producerii unei erori i se vor seta automat de sistem propriet ile, n func ie de eroarea produs. Cele mai importante propriet i ale acestui obiect sunt: Number care va con ine numrul* erorii produse. Aceast proprietate este implicit. Description care va con ine un text care expliciteaz aceast eroare. Pentru ca sistemul s ncarce propriet ile la producerea unei erori, este necesar ca obiectul Err s fie ini ializat (golit). Acest lucru se face numai la: execu ia instruc iunilor: On Error sau Resume; la terminarea rutinei care a produs ultima eroare, prin instruc iunile: Exit Sub, Exit Function sau Exit Property; la comand, prin execu ia metodei Clear, a obiectului Err.
II-41

Explica ie. * Numrul tuturor erorilor posibile se gsete n Help, i se pstreaz n cazul trecerii la noi versiuni. II.3.4.2.d) Structura unei rutine care are modul de Errorhandling Function XYZ() On Error GoTo Fis ' activarea rutinei Error-handling ' Codul care poate genera eroarea. Sfirsit: Exit Function ' Ieirea normal din rutin, n cazul n care nu se _ produce nici o eroare se va face prin aceast instruc iune Fis: ' Modulul de tratare a erorii (Error-handling) Resume . ' Instruc iunea care urmeaz dup execu ia modulului de_ tratare a erorii End Function Exemplu. n continuare se prezint aceeai func ie de la nceput dar n care se prelucreaz eventuala eroare printr-un modul specializat. Public Function Eroare_Handling() As Variant ' Exemplu de control al erorilor printr-un modul specializat. Const Er_Div0 = 11 ' codul erorii de mpr ire la 0 Const Er_Tip = 13 ' codul erorii de dat de alt tip Dim A1 As Double Dim A2 As Double Dim R As Double A1 = 1000 On Error GoTo Fis ' Producerea unei erori n continuare se va trata prin _ modulul care se afl dup eticheta FIS Reia: A2 = InputBox("A2=") R = A1 / A2 MsgBox "Rezultatul lui " & A1 & "/" & A2 & "=" & R Eroare_Handling = R Sfirsit: Exit Function ' Ieirea din func ie se face numai pe aici Fis: If err.Number = 11 Or err.Number = 13 Then If MsgBox(" - S-a produs o eroare datorit datei introduse" _ & vbCr & "Reintroduce-ti data?", vbExclamation + vbYesNo) = _ vbYes Then Resume Reia ' Se reia de la introducerea valorii pentru A2 _ se reseteaz ERR, pentru a fi func ional n cazul producerii unei alte erori Else Eroare_Handling = Null Resume Sfirsit ' Se termin func ia fr a se reintroduce data _ func ia va ntoarce NULL n acest caz End If Else ' Se produce o alt eroare care va fi afiat, _ dup care se oprete execu ia func iei MsgBox "Eroare Nr=" & err & " - " & err.Description Resume Sfirsit End If End Function
II-42

n cazul n care se produce o eroare ntr-o rutin (A) care nu are modul de tratare a erorii i dac aceasta este apelat de o alt rutin (B) care are un astfel de modul, eroarea va fi tratat de modulul de eroare al acesteia din urm (B). II.3.4.2.e) Colec ia Errors i obiecte Error n cazul n care un obiect DAO va provoca o eroare de execu ie, exist posibilitatea generrii mai multor erori n cascad. Dup producerea unei asemenea erori, n colec ia Errors se va crea un obiect Error similar obiectului prezentat anterior Err din VBA pentru fiecare eroare generat. n acelai timp, prima eroare produs va seta i obiectul VBA Err. Deoarece Err reprezint un singur obiect, acesta nu va putea prelua dect datele despre o singur eroare, i anume prima produs. Colec ia Errors, pentru a func iona corect, trebuie s aib terse toate obiectele Error componente. Aceast ac iune sistemul o efectueaz n momentul execu iei unei noi opera ii DAO. n cazul n care se dorete o prezentare detaliat a erorilor de execu ie produse de un obiect DAO, se pot folosi obiectele Error ale colec iei Errors ca n exemplul urmtor: Sub Eroare_DAO() Dim WS0 As Workspace Dim WS1 As Workspace Dim DB1 As Database Dim DB2 As Database Dim RS As Recordset Dim A As Integer Dim EROARE As String Dim ER As Error ' Obiect al colec iei Errors On Error GoTo Fis ' Producerea unei eventuale erori va da controlul la instruc iunile _ de la eticheta FIS Set WS0 = Workspaces(0) ' DAO corect Set WS1 = Workspaces(1) ' eroare DAO nu este creat obiectul Set DB1 = CurrentDb ' DAO corect Set RS = DB1.OpenRecordset("NoTable") ' eroare DAO Set DB2 = OpenDatabase("NuExistaBaza") ' eroare DAO Set RS = DB1.OpenRecordset("Tabela_A") ' DAO corect A = 10 / 0 ' eroare dar nu din DAO Sfirsit: Exit Sub Fis: EROARE = "" ' Introduce n variabila Eroare, pentru fiecare obiect din colec ia _ Errors, cte un rnd For Each ER In Errors EROARE = "Eroare DAO nr=" & ER.Number & " - " & _ ER.Description & vbCr Next If Errors(0).Number = err.Number Then ' Eroare ce provine din DAO, deoarece i primul obiect din colec ia _ Errors i obiectul Err au acelai numr de eroare MsgBox EROARE, vbCritical Else ' Eroare ce nu se produce n DAO MsgBox "Eroare VBA nr=" & err.Number & " - " & _ err.Description, vbExclamation End If Resume Next ' trece la execu ia urmtoarei instruc iuni End Sub

II-43

II.3.5. Colecia Databases Colec ia Databases con ine obiecte Database, care con in descrierea complet a structurii i informa iile dintr-o baz de date. Pentru ca o baz de date (sau un obiect component) s fie accesat, aceasta trebuie mai nti deschis, opera ie care produce crearea unui obiect Database, care se va aduga automat la colec ia Databases. VBA, con ine tipurile de date Databases i Database care permit declararea de variabile specifice. Deschiderea unei baze de date se poate face n urmtoarele dou moduri: Cu func ia CurrentDb, care ntoarce un obiect de tip Database, care con ine baza de date local, adic aceea definit n aplica ie. Dim Db As Database Set Db = CurrentDb Prin metoda Workspace, OpenDatabase, care permite deschiderea unei baze de date externe (care poate s fie chiar n format ISAM FoxPro, Dbase, Paradox). Dim Db As Database Set Db = [workspace].OpenDatabase(dbNume [, options] [, read-only] [, connect]) Aa cum se observ, singurul parametru obligatoriu este: dbNume numele complet (cu extensie i cale) al fiierului care con ine baza de date. Dac nu se precizeaz, spa iul (mediul) de lucru este cel implicit (Default Workspace) -----------------Obiectul Database con ine urmtoarele colec ii n care sunt incluse toate informa iile referitoare la baza de date respectiv. TableDefs Structura tabelelor bazei de date. QueryDefs Cererile din baza de date. Relations Rela iile din baza de date. Recordsets nregistrrile (datele) din tabelele bazei de date. Containers Informa ii de securitate despre obiectele din baza de date. Referirea colec iilor i a obiectelor din baza de date se face prin calificarea acestora, de jos n sus, trecnd prin toate colec iile i obiectele ascendente pn la cel pu in nivelul bazei de date (obligatoriu). Exemplu. n baza de date DAO.Mdb, pentru a se referi obiectul cmpul 'N' al tabelei 'Tabela_A' n vederea afirii propriet ilor Name i Type, se face: Dim Db As Database Dim Fd as Field Set Db = CurrentDb ' n variabila Fd se introduce obiectul cmpul N Set Fd = Db.TableDefs!Tabela_A.Fields!N Msgbox "Cmpul cu numele:" & Fd.Name & " este de tip:" & _ Fd.Type -----------------Obiectul Database con ine metode prin care: se pot crea obiecte noi i ataa colec iilor din structura sa: CreateTableDef pentru crearea unui obiect cu structura unei tabele noi i adugarea acestuia la colec ia TableDefs; CreateRelation pentru crearea unei rela ii noi i adugarea acesteia la colec ia Relations; CreateQueryDef pentru crearea unei cereri noi i adugarea acesteia la colec ia QueryDefs; CreateProperty pentru definirea unei noi propriet i a bazei de date sau a altui obiect DAO (adugarea acesteia la colec ia de propriet i a bazei de date se face prin metoda Append, a colec iei Properties); se pot defini i deschide obiecte Recordset prin metoda OpenRecordset. Exemplu. Public Sub Prop_Database(Optional BazaDate as Variant) ' Afieaz propriet ile bazei de date locale dac lipsete parametrul _ "BazaDate" sau a unei baze de date externe cu numele fiierului n _ parametrul "BazaDate"
II-44

Dim DB As Database Dim PR As Property ' Dac parametrul "BazaDate" lipsete atunci se lucreaz cu baza de _ date interna, local If IsMissing(BazaDate) Then Set DB = CurrentDb ' Baza de date din aplica ia curent Else Set DB= OpenDatabase(BazaDate) ' Baza de date din alta aplicatie End If '---------------------------MsgBox "Propriet ile bazei de date:" & DB.NAME, vbCritical ' Proprietatea Name a bazei de date con ine _ numele complet (cu extensie i path) al fiierului care o con ine On Error Resume Next ' Pentru a nu se opri prelucrarea dac apare o eroare _ datorat faptului c unele propriet i nu au valoare For Each PR In DB.Properties MsgBox " Proprietatea:" & PR.NAME & " = " & PR.Value, _ vbInformation Next PR On Error GoTo 0 ' Reface sistemul standard de tratare a erorilor End Sub II.3.6. Colecia Containers Colec ia Containers a unei baze de date con ine informa ii despre toate obiectele existente (salvate) ntr-o baz de date Access, fie c provin din structura DAO fie din alte structuri de obiecte. Ea este constituit din 8 obiecte Container. Fiecare din acestea con ine descrierea tuturor obiectelor de un anumit tip din baza de date (de exemplu formulare). Aceast descriere se face printr-o nou colec ie, Documents, n care fiecare obiect Document va con ine prin propriet ile sale informa iile (nume, permisiuni, etc.) despre un obiect de tipul respectiv existent (salvat) n baza de date. Cele 8 obiecte Container provin din: 3 din structura DAO: Databases Baza de date curent (deschis); Tables* Toate tabelele i cererile din baza de date; Relationships Toate rela iile permanente. 4 din MS Access Application: Forms Formularele salvate n baza de date; Modules Modulele de cod; Reports Rapoartele salvate n baza de date; Scripts Macro instruc iunile. 1 din sistemul de administrare (protec ie): SYSrel; -----------------Deoarece colec iile Containers i Documents reflect structura unei baze de date, este evident c nu este permis crearea sau tergerea de obiecte din aceste colec ii. n colec ia Tables, se va observa existen a unor tabele, care ncep cu prefixul "MSys". Acestea reprezint tabelele sistem ale MS Access. Dei au acelai nume nu trebuie confundat obiectul Container Forms sau Reports (care con ine informa ii despre toate formularele/ rapoartele din baza de date) i colec ia Access (Application) Forms sau Reports (care con ine tot formulare/ rapoarte, dar deschise n momentul respectiv). Exemplu. Prin procedura de mai jos se pot cunoate care sunt toate obiectele existente ntr-o baz de date (local sau extern). Acest lucru se ob ine prin proprietatea Name a obiectelor Document din fiecare obiect Container a colec iei Containers.
II-45

Public Sub Structua_Containers(Optional BazaDate) 'Structura colec iei - Containers 'Obiectele colec iei Containers sunt: ' 0=Databases ' 1=Forms ' 2=Modules ' 3=Relationships ' 4=Reports ' 5=Scripts macro ' 6=SYSrel ' 7=Tables tabele si query '----------------------------------------------Dim DB As Database Dim CT As Container Dim DC As Document ' Dac parametrul "BazaDate" lipsete atunci se lucreaz cu baza de date_ intern If IsMissing(BazaDate) Then Set DB = CurrentDb ' Baza de date din aplica ia curent Else Set DB= OpenDatabase(BazaDate) ' Baza de date din alt aplica ie End If '---------------------------For Each CT In DB.Containers ' Parcurge colec ia Containers If MsgBox("Container: " & CT.NAME, _ vbOKCancel + vbCritical) = vbOk Then ' Parcurge colec ia de Documente ale containerului For Each DC In CT.Documents If MsgBox("Documentul " & CT.NAME & " /" & _ DC.NAME, vbOKCancel +vbExclamation) = vbOk Then Else Exit For End If Next DC End If Next CT '----------------DB.Close ' Nu e necesar deoarece la sfritul procedurii toate obiectele declarate_ n aceasta se nchid i elibereaz automat variabilele obiect folosite End Sub Exemplu. Formularul F_CDialogContainer are dou controale Combo Box, CForm i CRap i un buton de comand Cmd. La ac ionarea butonului Cmd, printr-un control Common Dialog CD, se poate alege o baz de date extern sau baza de date local (dac se iese din CD cu Cancel). n urma acestei ac iuni cele dou controale, CForm i CRap, vor avea ca list de valori numele formularelor, respectiv rapoartelor din baza de date specificat, al crui nume se va afia n titlul formularului. Codul de program al acestui formular este: Private Sub Cmd_Click() Dim NF As Variant Dim DB As Database Dim DOC As Document Dim Formulare As Variant
II-46

Dim Rapoarte As Variant Reia: NF = CitireCD ' folosete controlul Common Dialog pentru _ preluarea unui nume complet de fiier On Error GoTo Fis ' Deschide Baza de date precizat prin controlul Common Dialog _ - dac nu se introduce un nume valid se va produce _ o eroare tratat prin modulul specializat 'FIS' If IsNull(NF) Then Set DB = CurrentDb ' Baza de date locala Me.Caption = "Baza de date locala" Else Set DB = OpenDatabase(NF) ' Baz de date din alt aplica ie _ selec ionat prin CitireCD Me.Caption = "BD:" & NF End If On Error GoTo 0 ' din nou sistemul standard de erori '==Se configureaz un string cu formularele existente (separate cu ;) _ n BD deschis cu care se configureaz proprietatea RowSource a _ controlului Combo CForm Formulare = Empty ' Se parcurg toate form. salvate For Each DOC In DB.Containers("Forms").Documents Formulare = Formulare & DOC.NAME & ";" Next DOC If IsEmpty(Formulare) Then ' Nu exist nici un formular n Baza de date deschis Me!CForm.RowSource = "Nici un Formular!!" Else ' Se introduc numele formularelor n lista de valori a controlului Combo Me!CForm.RowSource = Left(Formulare, Len(Formulare) - 1) End If '==Se configureaz un string cu rapoartele existente (separate cu ;) _ n BD deschis cu care se configureaz proprietatea RowSource a _ controlului Combo CRap Rapoarte = Empty ' Se parcurg toate rap. salvate For Each DOC In DB.Containers("Reports").Documents Rapoarte = Rapoarte & DOC.NAME & ";" Next DOC If IsEmpty(Rapoarte) Then ' Nu exist nici un raport n Baza de date deschis Me!CRap.RowSource = "Nici un Raport!!" Else ' Se introduc numele rapoartelor n lista de valori a controlului Combo Me!CRap.RowSource = Left(Rapoarte, Len(Rapoarte) - 1) End If Sfirsit: Exit Sub Fis:
II-47

If MsgBox("- Fisierul introdus nu este o Baza de date Access!!" _ & vbCr & "l reintroduceti ?", vbExclamation + vbYesNo) _ = vbYes Then ' Se reia introducerea prin controlul Common Dialog Resume Reia Else ' Se renun Me.Caption = "????" Resume Sfirsit End If End Sub '========Func ii interne========= Private Function CitireCD() As Variant ' Intoarce numele complet introdus prin controlul Common Dialog _ Dac func ia intoarce NULL atunci s-a ieit _ prin butonul Cancel din Common Dialog '------------------------------------------------' Parametrii de ini ializare pentru configurarea _ controlului Common Dialog: ' Intrare Titlul pus n caseta Common Dialog Me!CD.DialogTitle = "Selectati fisierul cu Baza de date" ' Intrare Extensia implicit a numelui de fiier introdus _ Se folosete de obicei la Comanda de salvare Me!CD.DefaultExt = "Mdb" ' Intrare Directorul implicit _ pentru pozi ionarea ini ial a casetei Common Dialog Me!CD.InitDir = "" ' Intrare Filtrul de selec ie pentru fiierele afiate _ Se introduc cte dou informa ii (separatorul este caracterul (|) _ pentru fiecare rnd afiat n caseta de selec ie: _ 1- Numele afiat pentru precizarea selec iei ce se efectueaz _ 2- Mul imea numelor care se vor selec iona prin _ folosirea caracterelor generice (*) i (?) Me!CD.Filter = "Fisier Access|*.Mdb|All|*.*" ' Comenzile posibile ce se pot efectua: _ Action = 1 - Open _ Action = 2 - Save _ Action = 3 - Color _ Action = 4 - Font _ Action = 5 - Print Me!CD.FileName = "" ' Ini ializare Me!CD.Action = 1 ' Open Se d controlul casetei Common Dialog ' Ieire Numele complet (cu cale i extensie) a fiierului selec ionat _ Dac se ntoarce un string gol ("") _ atunci s-a ieit prin apsarea pe Cancel If Me!CD.FileName = "" Then CitireCD = Null ' ieire prin Cancel Else CitireCD = Me!CD.FileName End If End Function
II-48

II.3.7. Colecia TableDefs Colec ia TableDefs con ine obiecte de tip TableDef, fiecare din acestea reprezentnd structura (deci nu datele introduse) unei tabele din baza de date deschis. Numele obiectului TableDef este chiar acela al tabelei respective. Fiecare obiect TableDef con ine propriet ile specifice tabelei (Validation Rule, Validation Text, irul de conectare pentru tabelele legate etc.). Exemplu. Procedura urmtoare afieaz numele (Name) i valoarea (Value) propriet ilor tuturor tabelelor din baza de date local. Sub Prop_TableDef() ' Propriet ile tabelelor _ - Name: numele propriet ii respective _ - Value (implicit): Valoarea pe care o are o proprietate Dim DB As Database Dim TD As TableDef Dim PR As Property Set DB = CurrentDb For Each TD In DB.TableDefs If MsgBox("Tabela: " & TD.NAME, _ vbOKCancel + vbCritical) = vbOk Then On Error Resume Next ' nu toate prop. au valoare implicit For Each PR In TD.Properties MsgBox " Proprietatea:" & PR.NAME & " = " & PR Next PR On Error GoTo 0 End If Next TD DB.Close End Sub Fiecare obiect TableDef con ine la rndul su alte dou colec ii, i anume: Colec ia Fields format din obiecte Field, fiecare din acestea descriind prin propriet ile sale (Nume, Tip de dat, Regula de validare pentru cmp, Caption, Size, etc.) un cmp al tabelei. Colec ia Indexes format din obiecte Index, care la rndul lor con in fiecare o colec ie de cmpuri Fields. Tabela_A din fiierul DAO.Mdb, prezentat schematic n figura de la nceputul modulului, con ine: Colec ia Fields cu 2 obiecte Field, [N] i [A]. Colec ia Indexes cu 2 obiecte, i anume: PrimaryKey, care la rndul lui con ine: Colec ia Fields cu un obiect - [N] A, care la rndul lui con ine: Colec ia Fields cu un obiect - [A] Explica ie. Fiecare index reprezint un obiect cu un nume (care este de obicei numele cmpului sau pentru cheia primar, PrimaryKey), urmnd ca prin colec ia Fields a indexului s se specifice care este efectiv numele cmpului din tabel. Deci se poate ca numele indexului i al cmpului s nu fie acelai, sau chiar ca un index s fie definit pe mai multe cmpuri. Exemplu. Public Sub Structua_TableDefs(Optional BazaDate) ' Structura colec iei de tabele - TableDefs Dim DB As Database Dim TD As TableDef Dim FD As Field ' Cmpurile tabelei Dim ID As Index Dim FID As Field ' Cmpurile indexului
II-49

' Dac parametrul "BazaDate" lipsete _ atunci se lucreaz cu baza de date intern If IsMissing(BazaDate) Then Set DB = CurrentDb ' Baza de date din aplica ia curent Else Set DB=OpenDatabase(BazaDate) ' Baza de date din alt aplica ie End If '---------------------------For Each TD In DB.TableDefs ' Parcurge colec ia de Tabele If MsgBox("Tabela:" & TD.NAME, vbOKCancel+vbCritical) _ = vbOk Then ' Parcurge colec ia de Cmpuri ale tabelei For Each FD In TD.Fields If MsgBox("Cimpul: " & TD.NAME & " /" & _ FD.NAME, vbOKCancel + vbExclamation) = vbOk Then Else Exit For End If Next FD '------------------------For Each ID In TD.Indexes ' Parcurge colec ia de Indeci a tabelei If MsgBox("Indexul: " & TD.NAME & " /" & _ ID.NAME, vbOKCancel + vbInformation) = vbOk Then For Each FID In ID.Fields ' Parcurge colec ia de Cmpuri a indexului If MsgBox("Cimpul indexului: " & TD.NAME _ & " /" & ID.NAME & " /" & FID.NAME, _ vbOKCancel + vbExclamation) = vbOk Then Else Exit For End If Next FID End If Next ID End If Next TD '--------------DB.Close ' Nu e necesar deoarece la sfritul procedurii toate obiectele _ declarate n aceasta se nchid i _ elibereaz automat variabilele obiect folosite End Sub Exemplu. Formularul F_TableDef are dou controale Combo Box, CTabel i CCimp. La deschiderea formularului (evenimentul Open), CTabel va avea completat lista de valori cu numele tabelelor din baza de date local. La introducerea unui nume de tabel n CTabel (evenimentul After Update), se completeaz lista de valori a controlului CCimp cu numele cmpurilor tabelei respective. Codul de program al acestui formular este: Private Sub Form_Open(Cancel As Integer) Dim DB As Database Dim TB As TableDef Dim sTabele As Variant Set DB = CurrentDb ' Baza de date local
II-50

'===Se configureaz un string cu tabelele existente (separate cu ;) _ n BD deschis cu care se configureaz proprietatea RowSource a _ controlului Combo CTabel sTabele = Empty For Each TB In DB.TableDefs ' Se parcurg toate tabelele sTabele = sTabele & TB.NAME & ";" Next TB If IsEmpty(sTabele) Then ' Nu exist nici un tabel Me!CTabel.RowSource = "Nici un tabel??!!" Else ' Se configureaz cu numele tabelelor lista de valori a controlului Combo Me!CTabel.RowSource = Left(sTabele, Len(sTabele) - 1) End If End Sub Private Sub CTabel_AfterUpdate() Dim DB As Database Dim FD As Field Dim sCimpuri As Variant Set DB = CurrentDb ' Baza de date local ' === Se configureaz un string cu cmpurile existente (separate cu ;) _ n tabela Me!CTabel cu care se configureaz _ proprietatea RowSource a controlului Combo CCimp sCimpuri = Empty For Each FD In DB(Me!CTabel).Fields ' Se parcurg toate cmpurile tabelei sCimpuri = sCimpuri & FD.NAME & ";" Next FD If IsEmpty(sCimpuri) Then ' Nu exist nici un cmp Me!CCimp.RowSource = "Nici un Cmp??!!" Else ' Se introduce n numele cmpurilor lista de valori a controlului Combo Me!CCimp.RowSource = Left(sCimpuri, Len(sCimpuri) - 1) End If End Sub -----------------Aa cum la nivelul obiectului bazei de date exist metoda CreateTableDef, pentru crearea structurii unei tabele, tot aa la nivelul unui obiect TableDef, exist metoda CreateField, prin care se pot defini cmpuri, care dup aceea se pot aduga prin metoda Append, la colec ia de cmpuri a obiectului TableDef. II.3.8. Colecia Quer yDefs Colec ia QueryDefs este foarte asemntoare colec iei TableDefs, cu specificarea faptului c obiectele QueryDef componente, adic structura cererilor din baza de date curent, nu au colec ia de indeci, dar au o colec ie de parametri. Colec ia QueryDefs con ine obiecte de tip QueryDef, fiecare din acestea reprezentnd structura unei cereri salvate din baza de date deschis, numele acestora fiind acelai cu al cererii respective. Fiecare obiect QueryDef con ine propriet ile specifice ale cererii. Exemplu. Sub Prop_QueryDef() ' Proprieta ile cererilor _ -Name: numele propriet ii respective _ -Value (implicit): Valoarea pe care o are o proprietate
II-51

Dim DB As Database Dim Qry As QueryDef Dim PR As Property Set DB = CurrentDb For Each Qry In DB.QueryDefs If MsgBox("Cererea:" & Qry.NAME, _ vbOKCancel + vbCritical) = vbOk Then On Error Resume Next For Each PR In Qry.Properties MsgBox " Proprietatea:" & PR.NAME & " = " & PR Next PR On Error GoTo 0 End If Next Qry DB.Close End Sub -----------------Fiecare obiect QueryDef con ine la rndul su alte dou colec ii, i anume: Colec ia Fields format din obiecte Field, fiecare din acestea reprezentnd un cmp al cererii. Colec ia Parameters format din obiecte Parameter, dac cererea a fost creat cu parametri. Exemplu. Cerere_A din fiierul DAO.Mdb, prezentat schematic n figura de la nceputul modulului, con ine: Colec ia Fields cu 3 obiecte Field: [N], [A] i [A1] Colec ia Parameters cu 1 obiect Parameter: [Numar] Exemplu. Public Sub Structua_QueryDefs(Optional BazaDate) ' Structura colec iei de cereri QueryDefs Dim DB As Database Dim Qry As QueryDef Dim FD As Field ' Cmpurile cererii Dim PT As Parameter ' Parametrii cererii ' Dac argumentul "BazaDate" lipsete - se lucreaz cu baza de date intern If IsMissing(BazaDate) Then Set DB = CurrentDb ' Baza de date din aplica ia curent Else Set DB=OpenDatabase(BazaDate) ' Baza de date din alt aplica ie End If '---------------------------For Each Qry In DB.QueryDefs ' Parcurge colec ia de Cereri If MsgBox("Cererea: " & Qry.NAME, _ vbOKCancel + vbCritical) = vbOk Then For Each FD In Qry.Fields ' Parcurge colec ia de Cmpuri ale cererii If MsgBox("Cimpul: " & Qry.NAME & " /" & _ FD.NAME, vbOKCancel + vbExclamation) = vbOk Then Else Exit For End If Next FD '------------------------For Each PT In Qry.Parameters ' Parcurge colec ia de Parametri ai cererii If MsgBox("Parametrul: " & Qry.NAME & " /" & _ PT.NAME, vbOKCancel + vbInformation) = vbOk Then
II-52

Else Exit For End If Next PT End If Next Qry DB.Close End Sub -----------------La nivelul obiectului bazei de date exist metoda CreateQueryDef, pentru crearea unei cereri permanente prin cod VBA, descrierea cererii fcndu-se direct n SQL. Exemplu. Cererea, Cerere_B, este creat dac se execut urmtoarea secven de instruc iuni. Public Sub Fac_Query() ' Creeaz o cerere Dim DB As Database ' Numele cu care va fi salvat cererea Const NumeCerere = "Cerere_B" ' Instruc iunea SQL de descriere a cererii Const SQL = "SELECT Tabela_B.* FROM Tabela_B;" Set DB = CurrentDb 'Baza de date din aplica ia curent ' Se creaz cererea i se salveaz n BD deschis DB.CreateQueryDef NumeCerere, SQL End Sub -----------------Metoda Execute Aceast metod se aplic numai cererilor ac iune, i are ca efect execu ia efectiv a cererii. Exemplu. Public Sub Executa_Query() ' Execut o cerere ac iune cu parametrii / Update Query Dim DB As Database Dim QRY As QueryDef Const NumeCerere = "Cerere_C" ' Numele cererii Set DB = CurrentDb ' Baz de date din aplica ia curent ' Se introduce cererea n variabila obiect QRY Set QRY = DB.QueryDefs(NumeCerere) ' se dau valori parametrilor cererii QRY.Parameters("Text1") = "unu" QRY.Parameters("Text2") = "XXX" ' Execu ia cererii ac iune Update face ca toate nregistrrile _ care au cmpul [A] = "unu" (parametrul: Text1) s i-l modifice _ n "XXX" (parametrul: Text2) QRY.Execute End Sub -----------------Parametrii unei cereri pot fi introdui direct prin cod VBA, ca n exemplul de mai sus. Cererile de selec ie (cu eventualii parametri), care evident nu se pot executa, pot s constituie suportul pentru crearea unor noi Recordseturi.

II-53

II.3.9. Colecia Relations Colec ia Relations con ine obiecte de tip Relation, fiecare din acetia reprezentnd o rela ie permanent a bazei de date. Numele rela iei va fi constituit din concatenarea numelor obiectelor ntre care se creeaz rela ia. Fiecare obiect Relation con ine o colec ie Fields, ale crui obiecte definesc cmpul de rela ie. Exemplu. Public Sub Structura_Relations(Optional BazaDate) ' Structura colec iei de rela ii - Relations Dim DB As Database Dim REL As Relation Dim FD As Field ' Cmpurile rela iei ' Dac parametrul "BazaDate" lipsete _ atunci se lucreaz cu baza de date intern If IsMissing(BazaDate) Then Set DB = CurrentDb ' Baza de date din aplica ia curent Else Set DB=OpenDatabase(BazaDate) ' Baza de date din alt aplica ie End If '---------------------------For Each REL In DB.Relations ' Parcurge colec ia de Rela ii If MsgBox("Relatia: " & REL.NAME, _ vbOKCancel + vbCritical) = vbOk Then For Each FD In REL.Fields ' Parcurge colec ia de Cmpuri ale rela iilor If MsgBox("Cimpul: " & REL.NAME & " /" & _ FD.NAME, vbOKCancel + vbExclamation) = vbOk Then Else Exit For End If Next FD End If Next REL End Sub II.3.10. Colecia Recordsets Set de nregistrri Colec ia Recordsets este format din obiecte Recordset (set de nregistrri). Un obiect Recordset con ine nregistrrile care se gsesc ntr-o tabel, sau cele care rezult n urma executrii unei cereri de selec ie (cererile de selec ie sunt considerate, aa cum am mai artat, tabele virtuale). Numele unui obiect Recordset este chiar numele tabelei sau cererii de selec ie la care se refer. La rndul su, un obiect Recordset con ine colec ia Fields format din obiecte Field, fiecare din acestea reprezentnd un cmp al nregistrrii respective i avnd de asemenea acelai nume cu al cmpului. II.3.10.1. Func ionarea unui set de nregistrri Deci dac obiectele TableDef (sau QueryDef) definesc structura tabelelor (cererilor, ca tabele virtuale), obiectele Recordset sunt formate din datele (informa iile) care se gsesc n acestea. Aa cum cererile sunt utilizate pentru a manipula datele dintr-o baz de date la nivel de mul ime (prin implementarea opera iilor de algebr rela ional), obiectele Recordset sunt folosite n acelai scop dar la nivelul elementar, al nregistrrii. Obiectul Recordset permite accesul la datele din baza de date, prin parcurgerea unui tabel sau a unei cereri de selec ie, n modalitatea n care se procedeaz cu un fiier clasic. Un Recordset este asemntor deci cu un fiier clasic. El este constituit din cmpuri (coloane) i nregistrri (rnduri).
II-54

Pentru a manevra un Recordset (sau un fiier clasic) trebuie s se parcurg nite etape, prin lansarea unor metode ale obiectului Recordset (este o singur excep ie metoda OpenRecorset este a obiectului Database): S fie deschis obligatoriu primul pas adic s fie definit din punct de vedere fizic i s i se atribuie un nume logic, prin care se va face n continuare referire la el. Metoda folosit este OpenRecorset (a obiectului Database). Aceast metod (ca i metoda OpenDatabase sau func ia CurrentDB) va crea obiectul Recordset al tabelei sau cererii de selec ie. S fie nchis obligatoriu ultimul pas. n urma acestei ac iuni se efectueaz opera iile fizice de sfrit i se elibereaz toate resursele (variabile, memorii tampon etc.) folosite de Recordset. Metoda Recordset folosit este Close. Aceast metod va produce tergerea obiectului Recordset respectiv, din colec ia Recordsets. Metoda Close este op ional, ea efectundu-se automat la terminarea rutinei n care a fost definit Recordset-ul. Deci colec ia Recordsets este format la un moment dat din toate obiectele Recordset deschise i nenchise. S fie accesat o anumit nregistrare. Un Recordset este format ca un tabel (matrice), din rnduri i coloane. Pentru a putea ajunge la datele dintr-o anumit celul (element), mai nti trebuie s se fac pozi ionarea pe nregistrarea (rndul) respectiv. Cnd se efectuau prelucrri prin cereri, se lucra cu mul imi (mul imea nregistrrilor dintr-o tabel) pe care se efectuau nite opera ii de algebr rela ional. Cnd se lucreaz cu un Recordset, opera iile se fac la nivel punctual ("m duc" mai nti pe nregistrarea respectiv pentru a face o prelucrare). Termenul de pointer (cursor) de nregistrri se refer la acest aspect, al nregistrrii care la un moment dat poate fi accesat. nregistrarea pe care se gsete la un moment dat pointerul de nregistrri se numete nregistrare curent. Deci un Recordset are un anumit numr de nregistrri, aezate una dup alta i pentru a efectua orice prelucrare trebuie mai nti s se pozi ioneze pointerul de nregistrri pe respectiva nregistrare. Pozi ionarea pointerului de nregistrri se poate face n mai multe feluri: acces secven ial la o nregistrare prin parcurgerea nregistrrilor una dup alta, n ordine, pn la aceea care intereseaz. Metodele Recordset folosite, denumite Move, permit mrirea sau micorarea pointerului de nregistrri, cu o valoare fix, ceea ce se materializeaz de obicei prin citirea nainte sau napoi a urmtoarei nregistrri. acces direct la o nregistrare plasarea direct pe o nregistrare n func ie de un criteriu de cutare. n func ie de mecanismul de efectuare a acestei opera ii, sunt dou categorii de metode, i anume: Metoda Recordset Seek pozi ionare rapid folosind cheia de indexare. Metodele Recordset Find pozi ionare mai lent, care nu folosete cheia de indexare. Se poate sintetiza ceea ce s-a prezentat la acest punct prin urmtoarea observa ie: Accesul nu este permis dect la cmpurile nregistrrii curente. Prelucrarea nregistrrii. Accesarea unei nregistrri se face n dou scopuri: Citirea datelor din cmpurile nregistrrii. Se folosete proprietatea Value, implicit, n citire, a obiectelor cmpuri (Field)*. Actualizarea, adic: Modificarea datelor dintr-un cmp. Se folosete proprietatea Value, n scriere, a obiectelor cmpuri (Field) i metodele Recordset: Edit i Update. Adugarea unei nregistrri noi. Se folosesc propriet ile Value, n scriere, a obiectelor cmpuri (Field) i metodele Recordset: AddNew i Update. tergerea unei nregistrri. Metoda Recordset folosit: Delete. II.3.10.2. Tipuri de seturi de nregistrri Un obiect Recordset poate proveni din urmtoarele surse: datele dintr-o singur tabel; datele din mai multe tabele printr-o cerere care poate fi:
II-55

actualizabil (updatable), adic n care se pot actualiza nregistrrile ob inute din execu ia cererii (cmpurilor din ieirea cererii li se poate stabili precis originea i anume: tabela, nregistrarea i cmpul; de exemplu o cerere cu clauza Total sau n care este setat proprietatea Unique Value, nu este updatable); neactualizabil; n momentul definirii (deschiderii) unui Recordset, trebuie precizat i tipul acestuia, conform provenien ei sale, prezentate mai sus, ceea ce va permite efectuarea numai anumitor opera ii asupra sa. Astfel exist 4 tipuri de seturi de nregistrri: Table (dbOpenTable) Set de nregistrri de tip tabel Recordset ce provine din nregistrrile unei singure tabele i care permite actualizri n acestea. Dynaset (dbDynasetTable) Set de nregistrri de tip de date dinamice - Recordset ce provine printr-o cerere actualizabil din nregistrrile mai multor tabele i care, n consecin , permite actualizri n acestea. Snapshot (dbSnapshotTable) Set de nregistrri de tip instantaneu de date - Recordset ce provine printr-o cerere neactualizabil din nregistrrile mai multor tabele i care, n consecin , nu permite actualizri n acestea. Este folosit numai n scopul cutrii sau al afirii unor date. OpenForwardOnly (dbOpenForwardOnly) Recordset de tip Snapshot, dar care nu poate fi parcurs dect o dat i numai nainte. II.3.10.3. Deschiderea unui set de nregistrri Metoda OpenRecordset Obiectul Recordset se creeaz numai la lansarea metodei OpenRecordset a obiectului Database. El este adugat automat la colec ia Recordsets, dar nu va fi salvat la nchiderea acestuia. Este un obiect temporar care dureaz pn la nchiderea sa prin metoda Recordset, Close. Obiectul Recordset va reprezenta practic o structur de tip nregistrri /cmpuri, care va ocupa un anumit spa iu de memorare, i care va avea o existen independent. Din aceast cauz se pot deschide mai multe obiecte Recordset, care provin din aceeai surs de date (tabel). n vederea prelucrrilor necesare, obiectul Recordset se introduce n variabile de tip Recordset. Deschiderea unui Recordset se face n felul urmtor: Dim DB As Database Dim RS As Recordset Set DB = CurrentDb 'Baza de date local Set RS = DB.OpenRecordset(Nume, {Tip}) n care: Nume este un string care reprezint numele tabelei sau cererii de selec ie din care se creeaz setul de nregistrri. Tip reprezint o constant care specific tipul setului de nregistrri care se creeaz, i anume: dbOpenTable dbOpenDynaset dbOpenSnapshot dbOpenForwardOnly Tipul este op ional. Dac nu se folosete, atunci setul de nregistrri se creeaz pentru primul tip (n ordinea prezentat mai sus) pentru care se poate defini. 1. Pentru tabelele legate din alte baze de date nu se poate folosi tipul Table. 2. Tipurile Dynaset, Snapshot, ForwardOnly se creeaz n memoria temporar Access, dac este loc. Din aceast cauz ele sunt mult mai rapide. 3. n parametrul "nume" se poate introduce direct o instruc iune SQL. n acest caz obiectul (tabel sau cerere) creat din aceasta va fi temporar, iar Recordsetul respectiv va func iona mai lent dect n cazul n care ar fi avut la baz un obiect (tabel sau cerere) salvat n baza de date. 4. La deschidere, Recordsetul se pozi ioneaz automat pe prima nregistrare. II.3.10.4. Propriet ile unui set de nregistrri Cteva din cele mai utilizate propriet i ale unui obiect Recordset sunt: RecordCount se poate numai citi, i reprezint numrul de nregistrri ale Recordsetului.
II-56

EOF se poate numai citi, i ia valoarea True, dac pointerul de nregistrri ncearc s depeasc ultima nregistrare. BOF se poate numai citi, i ia valoarea True, dac pointerul de nregistrri ncearc s se plaseze n fa a primei nregistrri. Type se poate numai citi, i arat care este tipul Recordsetului. Updatable se poate numai citi, i arat dac Recordsetul este actualizabil. NoMatch se poate numai citi, i se pozi ioneaz dup o metod Seek sau Find. Aceast proprietate va lua valoarea True, dac n urma metodei respective de cutare nu s-a putut pozi iona pointerul de nregistrri (nu s-a gsit nici o nregistrare care s satisfac condi ia de cutare). Pentru Recordsetul care nu are nici o nregistrare RecordCount=0 i att EOF ct i BOF sunt True. Pentru a citi valoarea corect a numrului de nregistrri ale unui Recordset este bine ca s se pozi ioneze mai nti pointerul de nregistrri pe ultima nregistrare (eventual cu metoda MoveLast). Exemplu. Public Sub Rst_TipRecordset(Optional BazaDate) 'Deschiderea unui Recordset n toate tipurile Dim DB As Database Dim RS As Recordset Dim Tip(4) As Integer Dim Eroare As String Dim i As Integer ' Dac parametrul "BazaDate" lipsete _ atunci se lucreaz cu baza de date intern If IsMissing(BazaDate) Then Set DB = CurrentDb ' Baz de date din aplica ia curent Else Set DB=OpenDatabase(BazaDate) ' Baz de date din alt aplica ie End If '---------------------------' Tipuri de seturi de nregistrri Tip(1) = dbOpenTable ' Constanta 1 ' pentru exemplul dat numai acest tip nu va fi admis Tip(2) = dbOpenDynaset ' Constanta 2 Tip(3) = dbOpenSnapshot ' Constanta 4 Tip(4) = dbOpenForwardOnly ' Constanta 8 For i = 1 To 4 ' Dac nu se poate deschide n tipul respectiv se va produce o eroare On Error GoTo Fis Set RS = DB.OpenRecordset("Cerere_B", Tip(i)) On Error GoTo Fis1 RS.MoveLast ' Se pozi ioneaz dac poate pe ultima nregistrare MsgBox RS.RecordCount ' Afieaz numrul de nregistrri al Recordsetului RS.Close Reia: Next i Sfirsit: Exit Sub Fis: Eroare = "Nu se poate deschide tipul de recorset " & Tip(i) _ & vbCr & "--Nr.eroare=" & err & " - " & err.Description MsgBox Eroare, vbCritical
II-57

Resume Reia ' trece la ncercarea deschiderii unui alt tip Fis1: MsgBox err & " - " & err.Description, vbCritical Resume Reia ' trece la ncercarea deschiderii unui alt tip End Sub II.3.10.5. Accesarea secven ial a unui set de nregistrri Exist 5 metode pentru deplasarea n mod secven ial ntr-un Recordset: MoveFirst pointerul de nregistrri se mut pe prima nregistrare; MoveLast pointerul de nregistrri se mut pe ultima nregistrare; MoveNext pointerul de nregistrri se mut pe urmtoarea nregistrare; MovePrevious pointerul de nregistrri se mut pe nregistrarea anterioar; Move(N) pointerul de nregistrri se mut n func ie de valoarea lui N. Astfel dac: N este pozitiv pointerul de nregistrri se mut nainte cu N nregistrri fa de nregistrarea curent; N este negativ pointerul de nregistrri se mut napoi cu N nregistrri fa de nregistrarea curent; N = 0 pointerul de nregistrri nu se modific. Se folosete de obicei pentru reactualizarea datelor din cmpurile unei nregistrri, n cazul modificrii acestora printr-o opera ie extern celei curente (de exemplu executarea unei cereri ac iune asupra datelor din Recordsetul respectiv); Cnd se parcurge secven ial un Recordset, trebuie testate propriet ile BOF i EOF, pentru a nu se depi limitele acestuia, la fiecare nou pozi ionare. Pentru tipul de nregistrri ForwardOnly, singura metod acceptat este MoveNext. II.3.10.6. Accesul direct ntr-un set de nregistrri II.3.10.6.a) Metoda Seek Metoda Seek a unui Recordset caut o nregistrare care s satisfac un anumit criteriu i n cazul gsirii acesteia, pozi ioneaz pe ea pointerul de nregistrri. Criteriul care se folosete cu metoda Seek, trebuie s se refere la un index al tabelei care st la baza Recordsetului. Deoarece Seek func ioneaz numai pe indeci, este evident c Recordsetul trebuie s fie obligatoriu numai de tip "table". Aplicarea metodei se face n trei pai: 1) Se introduce n proprietatea Index a Recordsetului, de tip string, numele indexului dup care se dorete efectuarea cutrii. n cazul n care indexul este chiar cheia primar a tabelei, numele folosit va fi 'PrimaryKey'. NumeRecordset.Index="NumeIndex" 2) Se aplic metoda Seek. Prin aceasta se introduce i expresia de cutare, prin doi parametri de tip string care reprezint n ordine: Operatorul rela ional al expresiei ce se formeaz cu indexul precizat n etapa anterioar. Se pot folosi urmtorii operatori rela ionali: (=) (>) (<) (>=) (<=); Un literal care reprezint valoarea pe care trebuie s o aib n nregistrare, indexul respectiv; NumeRecordset.Seek "operator_rela ional", "valoare" O metod este similar cu o procedur din punct de vedere al regulilor de sintax folosite. Ea se poate lansa i cu parametri, caz n care acetia sunt plasa i n continuarea numelui metodei, separa i prin virgul i fr s fie inclui ntre paranteze. 3) Se verific prin proprietatea NoMatch dac opera ia s-a efectuat cu succes (n caz de reuit proprietatea se seteaz pe False); Exemplu. Public Sub Rst_MetodaSeek() ' Caut o nregistrare folosind metoda Seek, _
II-58

pe un cmp indexat i pe un cmp cheie primar Dim DB As Database Dim RS As Recordset On Error GoTo Fis Set DB = CurrentDb ' Se deschide recordsetul n tipul Table Set RS = DB.OpenRecordset("Tabela_A", dbOpenTable) If RS.RecordCount = 0 Then ' Se verific existen a nregistrrilor. MsgBox "Nu exista inregistrari", vbInformation Exit Sub End If ' Seteaz indexul pentru care se face cutarea pe cheia primar RS.Index = "PrimaryKey" ' Caut nregistrarea cu cheia primar = 2 RS.Seek "=", "2" If RS.NoMatch Then MsgBox "Nu s-a gasit inregistrarea cautata" Else MsgBox "Ok - " & RS!N & ";" & RS!A End If '___________ ' Seteaz indexul pentru care se face o nou cutare pe cmpul "A" RS.Index = "A" ' Caut nregistrarea cu valoarea "unu" RS.Seek "=", "unu" If RS.NoMatch Then MsgBox "Nu s-a gasit inregistrarea cautata" Else MsgBox "Ok - " & RS!N & ";" & RS!A End If RS.Close Sfirsit: Exit Sub Fis: MsgBox err & " - " & Err.Description, vbCritical Resume Sfirsit End Sub -----------------Cnd se refer un cmp al unui Recordset, este obligatorie utilizarea semnului de calificare semn de exclamare (!), deoarece n faza de compilare sistemul nu "tie" care sunt cmpurile unui Recordset. Acest lucru se va cunoate abia n faza de execu ie, dup deschiderea respectivului Recordset prin metoda specific. Un obiect index con ine, aa cum am mai artat, o colec ie Fields. Din aceast cauz un index poate fi format din unul sau mai multe cmpuri. Metoda Seek permite introducerea unui criteriu de cutare i n cazul indecilor forma i din mai multe cmpuri, prin folosirea mai multor perechi de parametri valoare, i anume cte unul pentru fiecare cmp al indexului, n ordinea n care acetia se gsesc n colec ia Fields. II.3.10.6.b) Metodele FindFirst, FindLast, FindNext, FindPrevious Aceste metode func ioneaz asemntor metodei Seek, cutnd o nregistrare care s satisfac un anumit criteriu pentru a se pozi iona pe ea, dar nu folosete obligatoriu numai cmpurile indexate pentru efectuarea opera iei.
II-59

Tipul Recordsetului pentru aceste metode trebuie s fie obligatoriu Dynaset sau Snapshot. Este evident c deoarece cutarea nu se va face folosind numai indecii, durata de execu ie a acestor metode este mult mai mare dect la metoda Seek. Deoarece exist posibilitatea ca s existe mai multe nregistrri care s satisfac criteriul introdus, exist 4 metode de cutare care vor efectua urmtoarele tipuri de opera ii: FindFirst pozi ioneaz pointerul pe prima nregistrare care ndeplinete criteriul de cutare. La aceast metod cutarea pornete de la prima nregistrare a Recordsetului spre sfritul acestuia. FindLast pozi ioneaz pointerul pe ultima nregistrare care ndeplinete criteriul de cutare. La aceast metod cutarea pornete de la ultima nregistrare a Recordsetului spre nceputul acestuia. FindNext se aplic de obicei dup ce s-a efectuat o metod Find. Ea pozi ioneaz pointerul pe urmtoarea nregistrare care ndeplinete criteriul de cutare. La aceast metod cutarea pornete de la nregistrarea curent a Recordsetului, spre sfritul acestuia. FindPrevious se aplic de obicei dup ce s-a efectuat o metod Find. Ea pozi ioneaz pointerul pe nregistrarea anterioar care ndeplinete criteriul de cutare. La aceast metod cutarea pornete de la nregistrarea curent a Recordsetului, spre nceputul acestuia. -----------------Aplicarea metodei se face n doi pai: 1) Se aplic una din metodele Find. Toate metodele Find folosesc un parametru de tip string prin care se introduce o expresie care reprezint criteriul de cutare. Regulile de scriere ale expresiei sunt aceleai care au fost prezentate la formarea expresiilor din func iile agregate de domeniu. Reamintim c se pot folosi n aceste expresii orice fel de operatori accepta i n VBA (aritmetici, rela ionali sau logici) ct i orice fel de func ii vizibile i c termenii expresiei pot fi i numele de cmpuri din Recordsetul pe care se face cutarea. Recordset.FindFirst | FindLast | FindNext | FindPrevious "expresie" 2) Se verific prin proprietatea NoMatch dac opera ia s-a efectuat cu succes (n caz de reuit proprietatea se seteaz pe False). Exemplu. Public Sub Rst_MetodeFind() ' Caut toate nregistrrile care ndeplinesc un anumit criteriu _ folosind metode Find Dim DB As Database Dim RS As Recordset Dim I As Integer Dim Tp As String Dim Criteriu As String On Error GoTo Fis Set DB = CurrentDb ' Se deschide setul de nregistrri n tip Dynaset. Set RS = DB.OpenRecordset("Tabela_A", dbOpenDynaset) If RS.RecordCount = 0 Then ' Se verific existen a nregistrrilor. MsgBox "Nu exista inregistrari", vbInformation Exit Sub End If ' Caut prima nregistrare care are cmpul "A" la fel cu _ valoarea introdus prin InputBox Tp = InputBox("Valoarea care se va cauta pentru Cimpul A") I=0 Criteriu = "[A]=""" & Tp & """" ' TP este un string
' Aten ie la ghilimele func ie de tipul lui TP (string sau numeric)

RS.FindFirst Criteriu Do While RS.NoMatch = False


II-60

' a gsit o nregistrare cu criteriul introdus MsgBox "Ok - " & RS!N & ";" & RS!A I=I+1 RS.FindNext Criteriu ' caut urmtoarea nregistrare care respect acelai criteriu Loop MsgBox "Nr. de inregistrari gasite care au Cimpul A = """ & _ Tp & """ este: " & I RS.Close Sfirsit: Exit Sub Fis: MsgBox err & " - " & Err.Description, vbCritical Resume Sfirsit End Sub II.3.10.7. Prelucrarea datelor dintr-un Recordset II.3.10.7.a) Citirea datelor din cmpurile unui Recordset Un obiect Recordset con ine o colec ie de obiecte Fields. n aceast colec ie vor fi attea obiecte cte cmpuri are Recordsetul respectiv. Proprietatea implicit a unui obiect cmp este Value care reprezint valoarea care se gsete n cmpul respectiv. Ea se poate folosi att n citire ct i n scriere (pentru a fi modificat). Exemplu. Public Sub Rst_CitireSecveniala() ' Deschiderea unui Recordset i citirea secven ial a acestuia Dim DB As Database Dim RS As Recordset Dim Eroare As String On Error GoTo Fis Set DB = CurrentDb ' Se deschide n tipul implicit, _ adic cel mai semnificativ care se poate Table. ' La deschidere, Recordsetul se pozi ioneaz pe prima nregistrare. Set RS = DB.OpenRecordset("Tabela_A") If RS.RecordCount = 0 Then ' Se verific existen a nregistrrilor MsgBox "Nu exista inregistrari", vbInformation Exit Sub End If ' Se parcurge recordsetul de la prima la ultima nregistrare. Do While Not RS.EOF ' Ciclul se execut ct timp nu se atinge sfritul recordsetului. ' Se afieaz valorile din cmpuri prin proprietatea implicit Value. ' Pentru referirea unui obiect de tip cmp semnul de calificare este: (!) MsgBox RS!N & ";" & RS!A RS.MoveNext ' Pozi ionare pe urmtoarea nregistrare. Loop ' Afieaz numrul de nregistrri al Recordsetului MsgBox "Numarul de inregistrari = " & RS.RecordCount RS.Close ' Op ional. Se face automat la sfritul modulului _ n care s-a declarat Recordsetul. Sfirsit: Exit Sub Fis:
II-61

MsgBox err & " - " & err.Description, vbCritical Resume Sfirsit End Sub II.3.10.7.b) Actualizarea datelor din cmpurile unui Recordset Pentru fiecare tip de actualizare (modificare, adugare, tergere) care se efectueaz asupra datelor dintr-un Recordset, exist metode specifice. Pentru ca o actualizare s fie acceptat, n primul rnd trebuie ca s se respecte urmtoarele trei condi ii: Recordsetul s fie actualizabil. Pentru verificarea acestei condi ii se poate folosi proprietatea Updatable (s fie True). Recordsetul s fie deschis n tip Table sau Dynaset, adic n tipurile care accept efectuarea de actualizri. Actualizarea efectuat s respecte condi iile de integritate de domeniu, existen ial sau referen ial a tabelelor i rela iilor pe care setul de nregistrri este creat. Modificarea datelor dintr-un cmp al unui Recordset Modificarea datelor dintr-un cmp al unei nregistrri dintr-un Recordset se efectueaz folosind metodele Recordset Edit i Update, i proprietatea Field, Value, astfel: Modificarea efectiv a valorii dintr-un cmp al unui Recordset se efectueaz prin proprietatea Value (implicit) a cmpului respectiv, n scriere. Pentru ca acest lucru s fie posibil trebuie ca s se procedeze n felul urmtor: pointerul de nregistrri se pozi ioneaz pe nregistrarea ale crui cmpuri se vor modifica; se lanseaz metoda Recordset, Edit. Dup efectuarea modificrii cmpurilor din nregistrare, aceasta trebuie efectiv rescris n Recordset, prin metoda Update. Deci, modificarea unui cmp dintr-o nregistrare se face prin efectuarea acesteia ntre metodele Recordset Edit i Update. Dac modificarea efectuat nu va respecta propriet ile de integritate setate, metoda Update nu se va executa i va provoca o eroare de execu ie. Exemplu. Public Sub Rst_Modificare() Dim DB As Database Dim RS As Recordset Dim I As Integer Dim Tp As String Dim TM As String Dim Criteriu As String On Error GoTo Fis Set DB = CurrentDb ' Se deschide setul de nregistrri n tip Dynaset, _ care permite efectuarea actualizrilor Set RS = DB.OpenRecordset("Tabela_A", dbOpenDynaset) If RS.RecordCount = 0 Then ' Se verific existen a nregistrrilor. MsgBox "Nu exista inregistrari", vbInformation Exit Sub End If ' Se verific ca recordsetul s poat fi modificat If RS.Updatable = False Then MsgBox "Nu se pot efectua modificari", vbInformation Exit Sub End If ' ______Modificarea unui cmp_______ ' Introduce criteriul de selec ie pentru nregistrrile ce se vor modifica
II-62

Tp = InputBox("Valoarea care se va cauta pentru Cimpul A") ' Se introduce valoarea cu care se actualizeaz TM = InputBox("Valoarea care se va introduce in Cimpul A") I=0 Criteriu = "[A]=""" & Tp & """" RS.FindFirst Criteriu Do While RS.NoMatch = False ' a gsit o inregistrare ce respect criteriul MsgBox "nregistrare Veche:" & RS!N & ";" & RS!A RS.Edit RS!A = TM On Error GoTo Fis1 ' eroare nu se poate face modificarea RS.Update On Error GoTo Fis I=I+1 MsgBox "nregistrare Noua:" & RS!N & ";" & RS!A RS.FindNext Criteriu ' caut urmtoarea nregistrare care respect criteriul de selec ie Loop MsgBox "Nr. de inregistrari modificate este: " & I RS.Close Sfirsit: Exit Sub Fis: MsgBox err & " - " & err.Description, vbCritical Resume Sfirsit Fis1: MsgBox "Eroare Actualizare: " & vbCr & err & _ " - " & err.Description, vbCritical Resume Sfirsit End Sub Adugarea unei nregistrri noi ntr-un Recordset Adugarea unei nregistrri noi ntr-un set de nregistrri se efectueaz folosind metodele Recordset AddNew i Update, i proprietatea Field, Value, astfel: Se pozi ioneaz pointerul pe o nregistrare nou, prin metoda Recordset, AddNew. Se introduc n cmpurile nregistrrii valorile dorite, prin folosirea n scriere a propriet i Field, Value. Se scrie n Recordset nregistrarea nou prin metoda Update. Dac nregistrarea adugat nu va respecta propriet ile de integritate setate, metoda Update nu se va executa i va provoca o eroare de execu ie. Public Sub Rst_Adaugare() Dim DB As Database Dim RS As Recordset Dim TN As String Dim TA As String On Error GoTo Fis Set DB = CurrentDb ' Se deschide setul de nregistrri n tip Dynaset, _ care permite efectuarea actualizrilor Set RS = DB.OpenRecordset("Tabela_A", dbOpenDynaset) ' Se verific ca recordsetul s poat fi modificat
II-63

If RS.Updatable = False Then MsgBox "Nu se pot efectua modificari", vbInformation Exit Sub End If ' ______Adugarea unei nregistrri________ ' Se introduc de la tastatur valorile pentru cmpurile nregistrrii TN = InputBox("Valoarea pentru Cimpul N") TA = InputBox("Valoarea pentru Cimpul A") RS.AddNew RS!N = Val(TN) RS!A = TA On Error GoTo Fis1 ' eroare dac nu se poate face adugarea RS.Update On Error GoTo Fis MsgBox "Adaugare efectuata" RS.Close Sfirsit: Exit Sub Fis: MsgBox err & " - " & err.Description, vbCritical Resume Sfirsit Fis1: MsgBox "Eroare Adaugare: " & vbCr & _ err & " - " & err.Description, vbCritical Resume Sfirsit End Sub tergerea unei nregistrri dintr-un Recordset tergerea unei nregistrri dintr-un set de nregistrri se efectueaz folosind metoda Recordset Delete, astfel: Se pozi ioneaz pointerul pe nregistrare care se va terge. Se execut metoda Recordset, Delete. Dac nregistrarea tears va provoca o eroare de integritate referen ial (de exemplu se ncearc tergerea unei nregistrri dintr-o tabel printe, care are copii printr-o rela ie cu integritatea referen ial setat dar nu i cu tergerea n cascad) metoda Delete nu se va executa i va provoca o eroare de execu ie. Exemplu. Public Sub Rst_Stergere() Dim DB As Database Dim RS As Recordset Dim I As Integer Dim Tp As String Dim Criteriu As String On Error GoTo Fis Set DB = CurrentDb ' Se deschide setul de nregistrri n tip Dynaset,_ care permite efectuarea actualizrilor Set RS = DB.OpenRecordset("Tabela_A", dbOpenDynaset) If RS.RecordCount = 0 Then ' Se verific existen a nregistrrilor. MsgBox "Nu exista inregistrari", vbInformation Exit Sub End If
II-64

' Se verific ca recordsetul s poat fi modificat If RS.Updatable = False Then MsgBox "Nu se pot efectua modificari", vbInformation Exit Sub End If ' ______Stergerea unor nregistrri_____________ ' Se introduce un criteriu de selec ie pentru nreg. ce se vor terge Tp = InputBox("Valoarea care se va cauta pentru Cimpul A") I=0 Criteriu = "[A]=""" & Tp & """" RS.FindFirst Criteriu Do While RS.NoMatch = False ' a gsit o nregistrare cu criteriul introdus If MsgBox("nregistrarea care se sterge:" & _ RS!N & ";" & RS!A, vbOKCancel) = vbOk Then On Error GoTo Fis1 ' eroare nu se poate face tergerea RS.Delete On Error GoTo Fis I=I+1 End If RS.FindNext Criteriu ' caut urmtoarea nregistrare care respect acelai criteriu Loop MsgBox "Nr. de inregistrari sterse este: " & I RS.Close Sfirsit: Exit Sub Fis: MsgBox err & " - " & err.Description, vbCritical Resume Sfirsit Fis1: MsgBox "Eroare Stergere " & vbCr & _ err & " - " & err.Description, vbCritical Resume Sfirsit End Sub II.3.11. Recordseturi definite pe cereri O cerere de selec ie poate s fie obiectul de intrare al unui set de nregistrri n dou moduri: Direct, definind ca obiect al setului de nregistrri cererea respectiv (ca n exemplele de pn acum). Executnd n prealabil anumite ac iuni asupra cererii. De exemplu dac este necesar introducerea unor parametri n cerere, direct din cod. Crearea Recordsetului n acest caz se face aplicnd metoda OpenRecordset a cererii, ca n urmtorul exemplu. Exemplu. Public Sub Rst_Query() ' Creeaz un recordset pe baza unei cereri de selec ii cu parametri Dim DB As Database Dim QRY As QueryDef Dim RS As Recordset Const NumeCerere = "Cerere_A" ' Numele cererii Set DB = CurrentDb ' Baza de date din aplica ia curent ' Se introduce cererea n variabila obiect QRY
II-65

Set QRY = DB.QueryDefs(NumeCerere) ' se dau valori parametrilor cererii QRY.Parameters("Numar") = "2" Set RS = QRY.OpenRecordset ' Se definete recordsetul pe cerere If RS.RecordCount = 0 Then MsgBox "Nu exista inregistrari selectate", vbInformation Exit Sub End If Do While Not RS.EOF ' se parcurge secven ial RS MsgBox "nregistrare selectat:" _ & RS!N & ";" & RS!A RS.MoveNext Loop End Sub II.3.12. Recordseturi definite pe alte Recordseturi Un set de nregistrri poate fi definit pe un alt set de nregistrri, dup ce asupra acestuia se efectueaz anumite prelucrri. Aceast metod se aplic de obicei dac se dorete sortarea sau filtrarea n prealabil a setului de nregistrri. Crearea Recordsetului n acest caz se face aplicnd metoda OpenRecordset a primului Recordset, ca n urmtorul exemplu, folosit pentru sortarea unui Recordset. Pentru sortarea unui Recordset, se folosete proprietatea Sort a Recordsetului, care are urmtoarea form: recordset.Sort="CheieSort_1 [Asc] | Desc[,CheieSort_2 [Asc] | Desc].." Aa cum se observ se permite sortarea dup mai multe chei, n ordine ascendent (implicit) sau descendent. Recordsetul de tip Table, nu se poate sorta. Exemplu. Public Sub Rst_Sortare() ' Deschiderea unui Recordset i sortarea acestuia Dim DB As Database Dim RS As Recordset Dim RSS As Recordset On Error GoTo Fis Set DB = CurrentDb ' Se deschide n tipul Dynaset. Nu este permis sortarea pe tipul Table Set RSS = DB.OpenRecordset("Tabela_A", dbOpenDynaset) If RSS.RecordCount = 0 Then ' existen nregistrri? MsgBox "Nu exista inregistrari", vbInformation Exit Sub End If RSS.Sort = "N Desc" ' Se sorteaz recordsetul dup cheia N n ordine descresctoare Set RS = RSS.OpenRecordset ' Se deschide al doilea recordset, pe primul care e acum sortat ' Se parcurge recordsetul sortat de la prima la ultima nregistrare. Do While Not RS.EOF ' MsgBox RS!N & ";" & RS!A RS.MoveNext ' Pozi ionare pe urmtoarea nregistrare. Loop
II-66

' Afieaz numrul de nregistrri al Recordsetului MsgBox "Numarul de inregistrari = " & RS.RecordCount Sfirsit: Exit Sub Fis: MsgBox err & " - " & err.Description, vbCritical Resume Sfirsit End Sub II.3.13. Accesul la obiecte externe de date n Access este posibil ca s se foloseasc obiecte de date (de tip tabel) de o multitudine de tipuri create n alte aplica ii. Aceasta se poate face ori prin legare (Linked), ori prin ncapsulare (Embedded). Exist dou metode de realizare a acestui lucru: Din meniu prin comanda File | Get External Data Prin metodele obiectului DoCmd: DoCmd.TransferDatabase pentru obiecte din baze de date Access, Fox, DBase etc. DoCmd.TransferSpreadsheet pentru foi de calcul din MS Excel. DoCmd.TransferText pentru date introduse sub form de nregistrri (cu separatori sau de l ime fix pentru stabilirea cmpurilor (coloanelor) n fiiere de tip text. Pentru acest tip de transfer este necesar definirea unei specifica ii de import/export, care se creaz atunci cnd se efectueaz manual o opera ie de import (Get External Data) sau export (Save As). i opera ia invers, de export din Access a obiectelor acestuia, n diferite tipuri de baze de date, este posibil.

II-67

ANEXA I - Structura ierarhic a obiectelor din MS Word


Application 1 AutoCorrect AutoCorrectEntry FirstLetterException TwoInitialCaspExceptio AddIn Assistant AutoCaption Browser CaptionLabel CommandBar Dialog Dictionary FileConverter FileSearch FontNames KeyBinding KeysBoundTo Language Dictionary VBE ** ListLevel * * * MailMessage Options MailingLabel CustomLabel RecentFile Selection Range Document HeaderFooter SpellingSuggestion SynonymInfo Sistem Task Template Template ListTemplate VBProject ** Window Document Pane Zoom Selection View Zoom

DocumentProperty ListGallery ListTemplate

II-68

Microsoft Word (continuare 1)


1 ++ Adjustments
CalloutFormat

Document List ListParagraphs Mailer MailMerge


MailMergeDataSource

2 Shape Mailer Frame

Shape

FillFormat GroupShape Hyperlink

+ P

ListTemplate

Paragraph Format

MailMergeField PageSetup TextColumn


LineNumbering

Shading Border
TableOfAuthorities TableOfAuthorities Category

+ LinkFormat P ShapeNode OLEFormat PictureFormat FillFormat LineFormat


PictureFormat

InlineShape Field Hyperlink LinkFormat RoutingSlip StoryRanges


DocumentProperty

TableOfContents + TableOfFigures Template Variable VBProject + Version Window **

+ +

ShadowFormat P
TextEffectFormat

TextFrame WrapFormat
ThreeDFormat P

OLEFormat

FreeformBuilder

Envelope Index
LetterContent

II-69

Microsoft Word (continuare 2)


2 Range

Bookmark Border Character Comment Endnote Field Find Replacement Font Shading Border Footnote ShapeRange Style FormField CheckBox DropDown ListEntry

Frame Hyperlink Shape Table Cell Collumn Cell Row Cell ListFormat
ListParagraphs ParagrahpFormat

Paragraph DropCap
Paragraph Format

TabStop TextRetrieval Mode Proofreading Errors SubDocument


ReadabilityStatistics

Revision Sentences Words Shading Section PageSetup HeaderFooter

TextInput

PageNumber Shape ++

II-70

Anexa II - Structura ierarhic a obiectelor din MS Excel


Application 1 AutoCorrect DocumentProperty DocumentProperty VBProject Mailer Worksheet Shape ++ ChartObject Adjustments
CalloutFormat

RecentFile Addin Name CustomView Window Pane

Window Pane 2 CommandBar PivotCache RoutingSlip *

LinkFormat OLEFormat ShadowForm Hyperlink FillFormat


ControlFormat ConnectorFormat

Chart Scenario OLEObject Outline + Page Setup QueryTable + Parameter PivotTable PivotCache PivotFormula PivotField PivotItem

FreeformBuilder

GroupShapes + LineFormat
PictureFormat

ThreeDFormat
TextEffectFormat

Comment HPageBreak VPageBreak Hyperlink Name

ShapeNode TextFrame Characters

II-71

Microsoft Excel (continuare 1)


1
WorksheetFunction

FileSearch * FileFind

* *

VBE Assintat Style

* *

ODBCError Names Border Font

CommandBar 2

Chart Axis AxisTitle Gridlines 3 Range Areas Border Font Interior Name SoundNote Style Hyperlink Shape Range FormatCondition Validation Comment Characters Legend LegendEntry LegendKey TickLabels Comers PageSetup Shape Floor Walls ChartTitle Series ChartArea ++

ChartGroup DownBars UpBars SeriesLines DropLines HiLoLines TickLabels Series

Interior

ErrorBars Border DataLabel Point DataLabel Interior LeaderLine

ChartFillForma t

PlotArea DataTable Border Font

II-72

Bibliografie
Microsoft Office 97-Visual Basic, Programmer's Guide, MS Corp. 96 Building Applications with MS Access 97, MS Corporation 1996 Microsoft Office 97 - Object Model Guide, MS Corporation 1996 Brown A., Balter A., Bazele ACCESS 95, Ed. TEORA, 1997 John Clark Craig, Jeff Webb, Visual Basic 5.0, Ed. TEORA, 1998 Microsoft, Visual Basic 6 - ghidul programatorului, Ed. TEORA, 1998 Jennings R., Utilizare ACCESS 95, Ed. TEORA, 1997 Microsoft - SQL Server, MS Corporation 1995

II-73