Cap III. Utilizarea obiectelor in programare.

III.1 Obiecte.
III.1.1 Clase de obiecte, obiecte si colectii de obiecte.
Din cele prezentate pana acum, referitor la notiunea de obiect, putem sintetiza astfel:  Obiectul este o entitate bine definita(adica exista), care are o anumita structura, anumite caracteristici si anumite functii (realizeaza una sau mai multe actiuni). Un obiect se caracterizeaza prin: Proprietati - structura si atributele sale; Metode - actiunile pe care poate sa le efectueze; Evenimente - conditiile care determina momentul cand se lanseaza o anumita actiune(de exemplu Click pe un obiect). Exemplu. In aplicatia DAO.Mdb, in formularul F_CDialogContainer, exista un obiect cu numele Cmd. Acesta este un control buton de comanda, cu anumite proprietati(culoare, dimensiuni, pozitia in formular, textul afisat, etc.), care la evenimentul Click produs asupra sa executa o actiune(metoda) prin care se acceseaza o baza de date.  Clasa de obiecte contine toate definitiile unui obiect, adica tipurile de proprietati, metode si evenimente care vor determina structura unui obiect. Prin setarea caracteristicilor unei clase de obiecte(de exemplu atribuirea de valori proprietatilor) se obtine un obiect nou. Prin definirea unei clase de obiecte se creeaza practic un format, o structura pe care o vor avea toate obiectele ce se vor crea din aceasta. Relatia dintre o clasa de obiecte si obiectele care provin din ea este asemanatoare cu aceea dintre tipurile de date si variabile de tipul respectiv. Asa cum tipul de date este un concept, iar o variabila este materializarea(in memoria calculatorului) acestuia, tot asa clasa de obiecte este un concept, iar obiectele ce provin din ea reprezinta materializarea acesteia. Crearea unui nou obiect al unei clase, se numeste instanta a clasei respective. Exemplu. In Access, exista definite diferite clase de obiecte. De exemplu clasa Form, stabileste care este structura unui obiect formular, adica proprietatile(nume, culoare, dimensiuni, caption, etc.), evenimentele(open, close, click, etc.) si metode(refresh, requery, etc.). Formularul F_CDialogContainer, este o materializare(o instanta) a clasei Form, avand setate proprietatile

cu anumite valori, si atasate la anumite evenimente metode specifice prin scrierea unui cod de program.  Colectie de obiecte este constituita din totalitatea obiectelor care provin din aceeasi clasa de obiecte si care au din aceasta cauza aceleasi tipuri de proprietati si metode. Ele constituie deci instante ale aceleasi clase de obiecte. Obiectele dintr-o colectie pot fi privite si folosite ca un tablou de obiecte. Ele vor crea o structura de tip tablou, la care este posibila referirea la un anumit obiect prin indexul acestuia, deci printrun numar care reprezinta pozitia acestuia in tablou. Astfel la crearea primului obiect, acesta va primi indexul 0, la crearea celui de-al doilea indexul va fi 1, etc. O colectie de obiecte, deoarece, la randul ei reprezinta o entitate, cu propriile sale proprietati, constituie un obiect. Astfel o colectie de obiecte va avea printre altele proprietatile: Count - care contine numarul de obiecte din colectie; Parent . care contine obiectul superior din ierarhie de care apartine colectia; Numele obiectului colectie, este format din numele clasei de unde provin obiectele la care se adauga sufixul 's'. Exemplu. In aplicatia DAO.Mdb, in formularul F_CDialogContainer, colectia de obiecte Controls, contine toate obiectele control din formular. Procedura urmatoare, lansata de evenimentul DblClick, al sectiunii, trateaza colectia Controls, ca pe un tablou, afisand elementele componente ale acesteia(numarul acestora se gaseste in proprietatea Count) cat si obiectul de care apartine(proprietatea Parent). Private Sub FormHeader_DblClick(Cancel As Integer) ' Afiseaza obiectele ce se afla in colectia de controale a formularului Dim ST As String Dim i As Integer Dim N As Integer ST = '' ' Proprietatea Count a colectiei contine numarul de obiecte din colectie N = Me.Controls.Count - 1

For i = 0 To N 'Primul element dintr-o colectie are indexul 0 ST = ST & i & ': ' & Me.Controls(i).NAME & vbCr Next i ' Propritatea Parent a colectiei contine obiectul _ de care apartine colectia MsgBox ' Controalele din formularul parinte:' _

& vbCr & ''' ' & Me.Controls.Parent.NAME & _ ' '', sunt in ordine:' & vbCr & vbCr & ST ' vbCr este o constanta care determina saltul de rand _ la afisare vbCr = Chr(10) & Chr(13) End Sub

III.1.2 Provenienta obiectelor utilizate intr-o aplicatie.
Un obiect, asa cum am aratat este format atat din date(proprietati) cat si din cod de program(metode). Realizarea unei aplicatii prin crearea si utilizarea unor obiecte reprezinta o metoda moderna de programare, denumita programarea la nivel de obiect. Cel mai important avantaj al acestei metode este acela al utilizarii obiectelor create in mai multe aplicatii, ceea ce duc 434h71e e in afara de o crestere semnificativa a productivitatii la standardizarea aplicatiilor realizate. In Access obiectele din care se realizeaza o aplicatie pot proveni din mai multe surse: y Instante ale claselor de obiecte aflate in bibliotecile standard ale pachetului Access: DAO, Access Application si VBA. y Instante ale claselor de obiecte proprii(utilizator), create special de proiectant(prin modulele de clase de obiecte) y Instante ale unor clase de obiecte externe, realizate de aplicatii server sub forma unor controale sau biblioteci ActiveX realizate cu tehnologia(standardul industrial) Automation.

Utilizarea acestor clase de obiecte externe implica in prealabil, asa cum se va arata, crearea in aplicatia client(care foloseste obiectele produse de clasa respectiva) a unei referinte catre acestea.

III.1.3 Ierarhia obiectelor dintr-o aplicatie.
Obiectele folosite intr-o aplicatie se gasesc intr-o structura ierarhic-arborescenta. Fiecare element al acestei structuri apartine unei structuri superioare si la randul sau contine 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 colectie de obiecte. O aplicatie Access este realizata practic din doua categorii de obiecte, care provin din clasele celor doua modele de baza, respectand ierarhiile create in acestea: DAO - privind structurile de date; Access Application - privind interfata utilizator; Obiectele au de asemenea un nume, care poate fi implicit(adica stabilit de sistem) sau dat de utilizator. Deoarece exista posibilitatea ca mai multe obiecte sa aiba acelasi nume, atunci cand se face referire la un obiect este necesara calificarea numelui cu intreaga structura ascendenta a obiectelor de care acesta este dependent.(asemanator cu descrierea caii unui fisier sau folder de pe un disc). Acest lucru nu este obligatoriu daca nu se creeaza ambiguitati. Semnele de calificare sunt punctul (.) - care se foloseste in general pentru obiecte ale caror nume sunt date de sistem, sau semnul exclamarii(bang) (!), folosit la obiectele cu numele stabilit de utilizator. Referirea unei colectii se face folosind acelasi sistem, deoarece colectia este asa cum am vazut la randul ei un obiect. Referirea la un obiect dintr-o colectie se poate face in 3 feluri: y Fie folosind tot metoda prezentata, utilizand calificarea obiectului cu colectia din care face parte: <referirea la colectie> <semn de calificare> <numele obiectului> Exemplu: Me.Controls!CForm y Fie folosind indexarea colectiei cu un numar care reprezinta pozitia in colectie a obiectului respectiv(asemanator cu referirea unui element dintr-un tabel).

prin scrierea sub forma unei instructiuni a . in citire sau scriere. in codul VBA.Index='PrimaryKay' Daca se doreste citirea proprietatii unui obiect. in codul VBA.Controls('CForm') Observatia 1. La utilizarea proprietatilor unui obiect trebuie sa se tina cont de urmatoarele doua restrictii: Nu toate proprietatile au posibilitatea sa li se schimbe valoarea. se face la fel ca si cum s-ar lucra cu o procedura. se face prin: metoda descrisa la punctul precedent pentru referirea obiectului.1. Referirea la proprietatile sau metodele unui obiect. Semnele care se pot folosi pentru a se specifica un obiect sunt parantezele drepte <[nume_obiect]>. folosindu-se metoda de apelare fara Call. se poate folosi cuvantul cheie ME.ca pe un sir de caractere . Daca se doreste sa se faca referire in codul VBA la formularul sau raportul 'parinte'. fara a se mai face descrierea structurii ierarhice superioare.Numerotarea elementelor unei colectii de obiecte se porneste de la 0(zero). o proprietate este de un anumit tip de date. Daca se doreste atribuirea unei valori proprietatii unui obiect. folosind semnul de calificare 'punct'.numele obiectului in loc de index <referirea la colectie> <(> <'nume obiect'> <)> Exemplu: Me.Caption. de care trebuie tinut cont in utilizarea ei. se face la fel ca si cum s-ar lucra cu o variabila obisnuita. Exemplu de citire a proprietatii Caption a unui formular : MsgBox 'Numele formularului este: ' & Me. III.Caption='Nume Nou Form' sau a proprietatii Index. Aceste proprietati se numesc Read Only. Ca si o variabila. y Utilizarea proprietatii unui obiect. atunci aceasta va face parte dintr-o expresie obisnuita. si se folosesc numai in citire.Controls(0) y Fie la fel ca mai sus dar folosind .4 Utilizarea in cod VBA a proprietatilor si metodelor unui obiect. Ele sunt folosite obligatoriu atunci cand in numele obiectului se gasesc spatii. Exemplu de scriere a proprietatii Caption a unui formular: Me. urmat de numele proprietatii sau metodei. atunci aceasta se introduce in partea din dreapta a unei instructiuni de atribuire. a unui Recordset: Rs. Observatia 2. y Utilizarea metodelor unui obiect. <referirea la colectie> <(> <numar in cadrul colectiei> <)> Exemplu: Me.

RecordSource . y Forms![vinzari]!valoare .identic cu mai sus. este aratat succint in figura de mai jos.5 Exemple de referire a obiectelor din modelul . daca este cazul.se face referire la formularul deschis cu numele ' Date'.FilterOn . primind indexul 0 in cadrul colectiei Forms) y Me. din modulul de cod al aplicatiei.identic cu mai sus. a formularelor deschise. y Forms!(0)!valoare . Exemplu de apelare a unei metode cu doi parametrii de tip string: Rs. y Me!Altul.1.se face referire la proprietatea Record Source al formularului deschis 'vinzari'. 'unu' III. urmata. y Forms!Date . Parantezele drepte pot fi scoase. Public Sub Col_Form_Controale() .se refera proprietatea Visible a controlului 'Altul' a formularului in care se gaseste codul VBA Exemplu. Observati punctul. Din el se observa in special cum functioneaza colectia Forms. y Forms![date de bilant] .Seek '='. Exemplul prezentat anterior. y Forms![vinzari].Visible . dar se foloseste alta posibilitate de precizare a unui obiect dintr-o colectie si anume printr-un string care reprezinta numele obiectului. Observati parantezele drepte folosite pentru ca numele formularului contine spatii. de parametrii acesteia(fara a fi introdusi intre paranteze) separati prin virgula. y Forms!('vinzari')!valoare . dar executia lui nu se mai face chiar din formular.metodei.Application Access Modelul ierarhic Application. este reluat. prin care se realizeaza instantele obiectelor si colectiilor care constituie interfata utilizator a unei aplicatii.se refera controlul 'valoare' a formularul deschis 'vinzari'. semnul de calificare pentru o proprietate sau metoda.se refera formularul deschis 'date de bilant'.se refera proprietatea FilterOn a formularului in care se gaseste codul VBA. ci extern. dar se foloseste precizarea unui obiect dintr-o colectie prin folosirea numarului de ordine al obiectului in cadrul colectiei.(am presupus ca formularul 'vinzari' a fost primul deschis.

1 On Error GoTo 0 For i = 0 To N 'Primul element dintr-o colectie are indexul 0 ST = ST & i & ': ' & Forms(0).NAME & vbCr Next i ' Propritatea Parent a colectiei contine obiectul de care apartine colectia MsgBox ' Controalele din formularul parinte:' & vbCr & _ ''' ' & Forms(0).Controls(i).Parent. sunt in ordine:' & vbCr & vbCr & ST Sfirsit: Exit Sub Fis: MsgBox 'Nu exista nici un formular deschis'.Controls.' Afiseaza obiectele ce se afla in colectia de controale a primului formular deschis Dim ST As String Dim i As Integer Dim N As Integer ST = '' ' Proprietatea Count a colectiei contine numarul de obiecte din colectie On Error GoTo Fis ' Daca nu este nici un formular deschis se produce eroare N = Forms(0).NAME & _ ' ''.Count . vbCritical Resume Sfirsit End Sub ------------------ .Controls.

Tot asa daca mai declaram o variabila obiect. se va schimba valoarea din AI. intr-o variabila obiect nu se va gasi efectiv obiectul respectiv. entitatea care ia locul datelor este obiectul. este necesara definirea unor variabile specifice. III. Totusi in majoritatea prelucrarilor manifestarea variabilelor obiect este similara cu a celor clasice. Variabilele obiect ocupa o zona de memorie de 32-bit(4-byte).6. O variabila obiect este asemanatoare unei variabile ce contine un anumit tip de date. daca avem o variabila de tip integer. Daca (vezi urmatorul exemplu care se va da) avem o variabila obiect FM1. dar cea din BI va ramane neschimbata. vom avea si in aceasta numarul 3. formularul F_CDialogContainer. atunci efectiv in AI. totusi ele au o caracteristica specifica si anume. In programare variabilele sunt elementele prin care se fac referiri la date. atunci in FM1. acest lucru are importanta(ca in exemplul).6 Variabile obiect. Acum. Desi lucrul cu variabile obiect nu este deosebit de cel cu variabilele obisnuite. in anumite prelucrari. si introducem in ea ce se gaseste in FM1. Daca mai declaram una BI si o facem egala cu AI. AI.Nota: Modelul DAO va fi tratat intr-un capitol separat. Public. vom avea pe 16 biti data(informatia) numerica 3. Declararea ei se face cu aceleasi instructiuni(Dim. este o variabila obiect generica. . ci o referire(adresa) la acesta. prin care sa se poata manipula mai eficient obiectele. III. ele referind practic acelasi obiect. si introducem in ea un obiect. FM2. Astfel. executand AI=5. Nu acelasi lucru se intampla si in cazul variabilelor obiect. Daca vom citi aceiasi proprietate din FM2. Sa modificam acum o proprietate a lui FM1. Deci. variabile obiect. Deoarece in programarea la nivel de obiect. Evident. AI si BI au deci existente independente.1. si executam AI=3. Private sau Static) ca si la celelalte variabile. O variabila obiect se poate declara in mai multe feluri si anume ca:  Variabila obiect generica Dim nume_var As Object Variabila declarata in acest fel.1 Tipuri de variabile obiect. Vom avea acum doua variabile obiect care vor referi acelasi obiect.1. vom avea nu formularul respectiv ci o referire(adresa) la aceasta. cele doua variabile obiect nu au existente independente. deoarece in ea se poate introduce orice obiect. vom observa ca modificarea este efectuata si in acesta.

prin referinte la obiecte externe sau creata de utilizator.colectia rapoartelor deschise. . CommandButton .pentru colectia tuturor controalelor dintr-un formular sau raport.pentru control boolean buton radio. exista tipuri specifice de variabile obiect.colectia formularelor deschise.pentru un obiect formular. variabile obiect specifice. exista pentru fiecare tip din acestea.pentru control eticheta. Astfel pentru obiectele provenite din biblioteca Application Access.pentru un obiect raport.pentru un control dintr-un formular sau raport.pentru control boolean de tip tasta. ToggleButton . exista tipuri de variabile obiect: y y y y y y y Forms . Astfel mai sunt pentru controale urmatoarele tipuri specifice de variabile obiect: y y y y y y y y TextBox . CheckBox . existand tipuri specifice de variabile obiect cu numele acestora.pentru control lista ascunsa.pentru control lista derulanta. Controls . De asemenea. Variabila obiect specifica Pentru fiecare obiect care se obtine dintr-o clasa vizibila in aplicatie.pentru control caseta de text.pentru control buton de comanda.pentru control boolean caseta de validare. ComboBox . la randul lor provin din clase diferite de obiecte. Control . acelasi lucru se intampla si pentru colectiile de obiecte. Form . Button . ListBox . indiferent ca aceasta provine din bibliotecile standard. cu acelasi nume ca al clasei respective. Form . Label . etc. Reports . Deoarece controalele.

implicit introducandu-se pentru a arata ca este atribuita o valoare unei variabile clasice. Nota: Desi nu s-a folosit in prezentare decat forma instructiunii Dim. Deci pentru variabilele obiect instructiunea de atribuire este: Set var_obiect = expresie_obiect y in care expresie obiect este o expresie al carui rezultat este un obiect. la care atribuirea consta practic in crearea unei referinte catre un obiect.2 SET . Pentru variabilele obiect. este obligatorie folosirea la instructiunea respectiva a cuvantului cheie SET. In acest moment. executia cu acest tip de variabile este mai rapida Din cele prezentate se deduce ca este indicata utilizarea variabilelor obiect specifice.y etc. Din aceasta cauza. Efectul instructiunii de atribuire este introducerea in variabila obiect a adresei obiectului(referirea la acesta) care rezulta din expresia din dreapta si nu realizarea unei copii a obiectului respectiv. cuvantul Let. Private sau Static sunt valabile si functioneaza la fel ca la variabilele clasice. Totusi forma completa a acesteia este Let var = expresie. III. Acest lucru se va cunoaste la prima incarcare cu un obiect al variabilei.6. se va configura variabila obiect cu proprietatile si metodele specifice tipului de obiect respectiv. sistemul nu stie ce fel de obiect va fi in aceasta. Deci configurarea variabilei este realizata in partea de compilare a aplicatiei si nu in cea de executie. Deci aceasta configurare este realizata in partea de executie a aplicatiei La declararea unei variabile obiect specifice. pentru declararea variabilelor obiect si celelalte declaratii si anume Public.Instructiunea de atribuire pentru variabile obiect.1. sistemul stie de la inceput care sunt proprietatile si metodele tipului de obiect respectiv. se refera la urmatorul aspect: La declararea unei variabile obiect generice. . Dim nume_var As tip_obiect Diferenta dintre utilizarea unei variabile obiect specifice sau generice. Instructiunea de atribuire pentru variabilele clasice este var = expresie. -----------------Declararea unei variabile obiect specifice se face folosind numele clasei sau colectiei care va fi referita de variabila respectiva.

Daca totusi se doreste eliberarea imediata a spatiului ocupat de o variabila obiect se foloseste instructiunea: Set var_obiect = Nothing Exemplu.Caption FM1.Caption ' Schimbarea se face practic in obiectul referit.1. obiect FM2. va contine referinta catre primul formular deschis MsgBox 'Primul formular deschis este: ' & FM1. III. Deci si in FM2 ' Se reface proprietatea Caption. orice modificare a acestuia(cauzata eventual prin una din variabile) va fi reflectata imediat de toate aceste variabile care refera obiectul respectiv (vezi exemplul care va urma).Caption = ST MsgBox FM2.Din aceasta cauza daca mai multe variabile refera acelasi obiect. la terminarea modulului in care a fost declarata variabila obiect. obiect FM1.Caption = 'TEST Variabile Obiect' ' Se schimba proprietatea Caption in FM1 MsgBox FM2. ' Aceasta schimbare se produce si in FM2 . ca la orice variabila. O variabila obiect are nevoie de un spatiu(memorie) de lucru pentru a functiona.Caption ' Var.NAME On Error GoTo 0 Set FM2 = Forms(0) ST = FM1. va contine aceaiasi referinta ca variabila FM1 ' Proprietatea Caption a var obiect FM1 este salvata in ST FM1.3 Eliberarea resurselor folosite de o variabile obiect. Acesta este eliberat automat. Cuvantul cheie NOTHING.6. Public Sub Var_Obiect() ' Demonstraza ca o variabila obiect reprezinta referinta catre un obiect Dim ST As String Dim FM1 As Form Dim FM2 As Form On Error GoTo Fis ' Daca nu este nici un formular deschis se produce eroare Set FM1 = Forms(0) ' Var.

s-a aratat cum pot fi parcurse cu o instructiune FOR obisnuita obiectele unei colectii. vbCritical Resume Sfirsit End Sub III. El produce crearea unei noi instante pentru clasa respectiva. folosindu-se proprietatea Count a colectiei pentru stabilirea numarului de cicluri necesar.6. Instructiunea For«Each In primul exemplu din acest capitol.7 Parcurgerea unei colectii de obiecte. se poate folosi atat la declararea unei variabile obiect cat si la instructiunea de atribuire Set. Nu trebuie confundat folosirea acestui cuvant cheie cu aceia de creare a unor obiecte noi in modelele standard ale Access(de exemplu nu se poate crea prin New.4 Crearea unei instante noi pentru o clasa de obiecte. Dim nume_var As New tip_obiect Set var_obiect = New expresie_obiect Efectul acestuia se manifesta numai la clasele de obiecte create prin modulele de cod ale aplicatiei. adica practic al unui spatiu separat de existenta pentru variabila respectiva. un control nou intr-un formular) III. se elibereaza spatiul ocupat de toate variabilele obiect _ declarate in el. Cuvantul cheie NEW.1. Deci spatiul ocupat de FM2 se elibereaza si el Fis: MsgBox 'Nu exista nici un formular deschis'. Cuvantul cheie New. Acelasi lucru se poate face mai eficient cu forma speciala a instructiunii For«Each: For Each var_obiect In colectie_obiecte [instructiuni] .Set FM1 = Nothing Sfirsit: Exit Sub ' Se elibereaza spatiul ocupat de FM1 ' La terminarea rutinei.1.

Public Sub Afis_Forms() 'Afiseaza toate formularele deschise Dim FM As Form Dim ST As String ST = '' For Each FM In Forms ' FM va referi la fiecare ciclu un formular deschis ST = ST & ' ' & FM. var_obiect. trebuie sa fie compatibila cu tipul colectiei specificate dupa cuvantul cheie IN. Functionarea buclei For consta in faptul ca la fiecare iteratie. Exemplu. variabilei obiect.[Exit For] [instructiuni] Next var_obiect -----------------y Variabila obiect folosita. i se va atribui pe rand cate un element al colectiei specificate.NAME & vbCr Next If Len(ST) > 0 Then MsgBox 'Formulare deschise: ' & vbCr & vbCr & ST Else MsgBox 'Nici un formular nu este deschis' ' Nu s-a executat nici un ciclu din ForEach End If End Sub . Deci instructiunea For«Each. va avea atatea cicluri cate obiecte contine colectia specificata in instructiune.

-----------------Nota: Instructiunea For Each se poate folosi si pentru variabile de tip tablou (Array). .

care permite crearea de catre aplicatiile server a unor obiecte independente(acestea nu mai au nevoie de aplicatia server pentru a fi manipulate). functie de locul unde va fi memorat obiectul respectiv. este prezent un astfel de obiect creat in Word. in cazul metodei OLE. nu se va produce si in aplicatia client sau invers.2.2 Metoda Automation.obiectul este memorat in aplicatia clint. III. prin lansarea acesteia chiar in aplicatia client. permite ca intr-o aplicatie client sa se foloseasca obiecte provenite dintr-o aplicatie server. Metoda OLE.1. Linked(legare) . si anume: Embedded(incapsulare) . in scopul manipularii obiectului respectiv. Evident. Obiecte ActiveX. obiectul respectiv daca va fi eventual modificat. Exista doua forme de implementare a acestei metode. Lansarea aplicatiei server prin care a fost creat obiectul.2 Utilizarea in Access a obiectelor provenite din clase externe.mdb. obiectul respectiv va exista efectiv in ambele aplicatii si eventuala modificare a obiectului din aplicatia server.2.III. In aplicatia DAO. Folosirea controalelor standard Windows. in aplicatia client memoranduse numai adresa acestuia pentru a putea fi folosit si din aceasta. Platforma Windows. Deci . Automation este un standard industrial. si plasat in controlul ObiectOLE.1 Utilizarea intr-o aplicatie a obiectelor create in alte aplicatii.obiectul va exista numai in aplicatia server. III.1. este necesar ca aplicatia server sa fie instalata pe sistemul de calcul in care se utilizeaza aplicatia client. Exista doua metode(standarde industriale) care permit acest lucru si anume: Metoda OLE(Object Linked and Embedded) Metoda Automation OLE(sau pe scurt Automation) III.1 Metoda OLE.2. aceasta modificare se va realiza automat si in cealalta aplicatie(exista un singur obiect folosit de ambele aplicatii). Deci. ori in aplicatia server ori in aplicatia client. avand o existenta independenta. permite utilizarea intr-o aplicatie(numita client) a obiectelor provenite din alte aplicatii(numite server). se face de obicei prin dublu click pe acesta(sau din meniul contextual al obiectului). in formularul F_OLE. Deci.

Evident pentru utilizarea unui obiect extern. Obiectele create prin metoda Automation. in care se deschide o foaie de calcul ce se gaseste intr-un fisier aflat in acelasi director cu aplicatia Access. la actionarea evenimentului click al butonului de comanda.mdb. j As Integer Dim App As Object Set BD = CurrentDb . ofera sub forma de ActiveX obiectele din bibliotecile standard. Deci o aplicatie Excel poate fi considerata ca un obiect ActiveX.un obiect creat prin aceasta metoda va putea fi utilizat intr-o aplicatie client. prin care se creeaza o instanta noua a unei aplicatii Excel. in formularul F_OLE. GetObject. se pot crea clase noi de obiecte. creat deja si aflat intr-un fisier. obiecte ActiveX si anume: CreateObject. si sunt definite de clasele de obiecte aflate sau create de aplicatiile server. metodelor si evenimentelor sale. au implementat standardul Automation(ca si standardul OLE). Private Sub ButonExcel_Click() Dim DirectorAplicatie As String Dim AplicatiaMdb As String Dim BD As Database Dim i As Integer. si utilizata intr-o aplicatie Access. De exemplu in Access. este necesara cunoasterea structurii acestuia. a proprietatilor. structura unei biblioteci de obiecte se poate afla prin comanda View | Object Browser. In Access exista doua functii prin care se pot folosi in VBA. indiferent daca este sau nu instalata aplicatia server. In aplicatia DAO. Excel. este lansata procedura eveniment de mai jos. Word etc.. prin care se pot crea noi instante ale unui ActiveX. dar utilizarea obiectelor provenite din acestea este numai interna aplicatiei. Totusi aplicatiile MS Office nu pot crea clase noi de obiecte care sa furnizeze in exterior obiectele sub forma unor ActiveX. Exemplu. Majoritatea produselor create de firma Microsoft. In Access. se numesc ActiveX. prin care se poate utiliza un obiect ActiveX. Ele pot fi controale sau biblioteci de obiecte. Aplicatiile MS Office: Access.

2 Crearea referintei catre un obiect extern La proiectarea unui formular(sau raport) Access. implicit.AplicatiaMdb = BD. pe bara cu instrumente sunt plasate cele mai utilizate controale folosite.2.NAME ' Se preia numele complet al fisierului cu aplicatia curenta Do ' Se stabileste pozitia ultimului ''. Text Box. AplicatiaMdb.Workbooks. Totusi.Application') 'Se creaza un obiect ActiveX. Combo Box. realizarea standardizata a acestor controale de tipul unor ActiveX.xls' End Sub -----------------Microsoft Visual Basic. care sa-si ofere obiectele sub forma unor ActiveX(controale. permite utilizarea intr-o aplicatie client. care delimiteaza directorul unde este fisierul i = InStr(j + 1. este un produs care permite si crearea de clase noi de obiecte. biblioteci) aplicatiilor client. j) 'Directorul unde este fisierul cu aplicatia curenta Set App = CreateObject('Excel. Label. Option Button. prin tehnologia Automation. indiferent de firma producatoare sau de aplicatia server in care au fost realizate. In cele ce urmeaza ne vom referi la utilizarea in aplicatiile client(Access) a obiectelor create din clase de obiecte externe. Command Button. care sunt livrate in pachetul Access. prin folosirea standardului Automation. Aplicatia Excel 'Se deschide aplicatia Excel 'Foaie.Visible = True 'Se face vizibil obiectul ActiveX. a tuturor controalelor provenite din clase de obiecte. Excel App. .xls' _ ce se gaseste in acelasi director cu aplicatia curenta App. etc.Open DirectorAplicatie & 'Foaie. III. '') If i = 0 Then Exit Do j=i Loop DirectorAplicatie = Left(AplicatiaMdb.

introducerea intr-un formular(raport) a unui control ActiveX.OLB sau .OCX. permit atat crearea cat si anularea referintelor la controale ActiveX. Nota: Atat controalele cat si bibliotecile ActiveX. pentru a-l inregistra. y Dupa actionarea butonului: Register.2. nu permite insa folosirea lor de catre aplicatia client. in vederea utilizarii acestuia se mai numeste inregistrarea obiectului. in directorul C:WindowsSystem. Access foloseste in principal 3 biblioteci. se gasesc de obicei intr-un fisier cu extensia . este necesar ca pentru acesta sa se creeze o referinta in aplicatia Access(sau alta aplicatie client). ACCESS. Pentru utilizarea unui control ActiveX. Totusi se pot folosi(cu aceiasi tehnologie. inregistrarea unui ActiveX. DAO. se face prin selectia unui control dupa care se apasa pe butonul Unregister. dupa copierea fisierului cu biblioteca (de obicei cu extensia . III. trebuie creata referinta printr-o comanda similara. Tools | References. In Access. Pentru utilizarea acestora. sunt considerate niste aplicatii independente. C:WindowsSystem. prezentata in figura alaturata. Automation. sistemul solicita utilizatorului sa introduca numele complet al fisierului care contine un ActiveX.DLL) in acelasi director. Nota: Asa cum am mai aratat. y Operatia inversa. Simpla plasare a acestora pe discul calculatorului. se face prin comanda: Tools | ActiveX Controls. intr-un formular(raport) Dupa inregistrare. Cele doua butoane ale comenzii. Utilizarea lor impune aceleasi restrictii privind drepturile de folosire(licenta) ca si la orice alt produs.Controalele ActiveX. Operatia de creare intr-o aplicatie client a unei referinte catre un obiect extern.1 Plasarea unui control ActiveX. VBA. ca si la controalele ActiveX) si alte biblioteci create de aplicatii server. se poate face in doua feluri: .2. de anulare a inregistrarii unui ActiveX. Register si Unregister.

y Din fereastra din dreapta.3 Controlul ProgressBar Controlul ProgressBar. Pentru aceasta se va proceda astfel: y Se lanseaza comanda Customize. y Pozitia curenta a controlului. adica cat din suprafata acestuia este umpluta(zona albastra din figura). minima si maxima. denumit rangul controlului. ale evolutiei procesului respectiv. ProgressBar.Prin comanda 'Insert ActiveX Controls'. pe bara de instrumente. printr-o valoare care apartine unui anumit interval. Deci el defineste intreaga durata a operatiei. Commands. care stabileste valorile extreme.Prin plasarea controlului direct pe bara de instrumente(in cazul utilizarii frecvente a unui control ActiveX). ----------------- Aceste valori sunt introduse prin proprietatile cele mai semnificative ale controlului ProgressBar: Min . se trage(Drag and Drop) cu mouse-ul controlul respectiv. 2. care stabileste pozitia relativa pe care o are 'clepsidra' in control. III. . se selecteaza 'ActiveX Controls'. Commands.1. reprezentata printr-o valoare numerica aflata in intervalul definit de rangul controlului. este deci definit prin: y Intervalul. lansata ori de pe bara cu instrumente ori din meniul Access. prin meniul contextual al oricarui taskbar.defineste valoarea minima a rangului(intervalului) controlului ProgressBar. Categories. este folosit pentru a prezenta vizual cum evolueaza in timp executia unei operatii al carei nivel de realizare poate fi cuantificat numeric in codul de program.2. y In fereastra stanga. y Se pozitioneaza comanda Customize in pagina a doua.

etc. functionarea unui cronometru.pentru clepsidra controlului plina ' Controlul ProgressBar initial nu va fi vizibil.Max . Figura prezentata la inceputul acestui modul este cea a formularului in timpul executiei sale.Max = Timp ' Valoarea maxima .Visible = False End Sub -----------------Private Sub CTimp_AfterUpdate() ' Dupa introducerea unei valori in TextBox Dim Timp As Variant Timp = Me!CTimp If IsNumeric(Timp) And Timp >= 1 Then ' Se stabileste domeniul de valori pentru controlul Progress Bar. atunci se va produce o eroare de executie. Scrolling .defineste valoarea pozitiei curente a controlului ProgressBar. Exemplu. Daca valoarea introdusa depaseste rangul. Option Compare Database Option Explicit Private Sub Form_Open(Cancel As Integer) Me!PBar. in scroll(continuu ca in exemplu) sau in trepte(standard). Me!PBar. Doua proprietati specifice se refera la forma de afisare a controlului si anume: Orientation . . Acesta simuleaza printr-un control ProgressBar. Mai jos se prezinta codul aflat in formularul F_ ProgressBar.Mdb. PBar.  Restul proprietatilor controlului ProgressBar. din fisierul DAO.pentru felul in care se deplaseaza clepsidra. care va fi initializat cu o valoare introdusa in caseta de text. orizontal sau vertical. Value . CTimp si va porni automat dupa introducerea acesteia. de vizibilitate. sunt cele obisnuite de configurare a marginilor.pentru directia controlului.defineste valoarea maxima a rangului(intervalului) controlului ProgressBar.

' Clepsidra s-a golit / timpul in sec.4 Controlul Common Dialog .Value = Me!PBar.TimerInterval = 0 Me!PBar.Min = 0 ' Valoarea minima .2.pentru clepsidra controlului goala Me!PBar. care se gasesc in fisierul COMCTL32. face parte din grupul de controale ActiveX.Value = Me!CTimp ' se stabileste valoarea clepsidrei la nivelul actual al timpului ramas If Me!PBar.TimerInterval = 1000 Else MsgBox 'Este necesar introducerea unui numar de secunde!!'.Visible = False End If End Sub -----------------Nota: Controlul ProgressBar.Max ' Valoarea initiala a clepsidrei controlului .1 ' Se decrementeaza contorul de secunde cu o unitate Me!PBar.Value = 0 Then Me. Me!CTimp = Me!CTimp .Me!PBar. vbCritical End If End Sub -----------------Private Sub Form_Timer() ' Se executa o data la fiecare secunda ' Se face vizibil controlul ' Se porneste intreruperea de timp cu o durata de 1 sec. care face parte din pachetul de distributie al pachetului Visual Basic. a expirat ' se opreste intreruperea de timp ' se face invizibil controlul Progress Bar III.Visible = True Me.OCX.umplut Me!PBar.

reprezinta calea care va indica directorul al carui continut se vizualizeaza.  Proprietatile cele mai utilizate in folosirea controlului in operatiile de salvare /deschidere de fisiere sunt: y Title . dar evident inainte de lansarea metodei Action.Controlul Common Dialog este utilizat foarte des in aplicatiile Windows in special pentru introducerea unui nume complet de fisier(cu extensie si cale) in modulele de salvare sau deschidere de fisiere. care va controla ce fisiere vor fi afisate din directorul selectat. Controlul este invizibil. Aceasta va fi afisata in zona Look in y DefaultExt . y InitDir . in care se introduc mai multe informatii(multiplu de 2) separate prin caracterul ( | ).este o extensie care va fi intoarsa daca nu se specifica in mod explicit tipul fisierului. Configurarea controlului se face prin setarea unor proprietati ale acestuia. Ea reprezinta un string.prin acesta se configureaza caseta Files of Type.?) si care va genera o multime de nume care vor constitui un filtru pentru fisierele care se afiseaza. De exemplu perechea : .se introduce un text care se va afisa in partea de sus a controlului(zona albastra de titlu a ferestrei). O pereche de 2 informatii reprezinta: 1-Textul afisat in casuta(in exemplu Fisier Access) 2-Un nume de fisier(cu extensie) in care sunt permise caracterele generice (*. y Filter . fereastra specifica acestuia(vezi figura alaturata) devenind activa numai din momentul lansarii metodei Action* si pana cand se inchide fereastra acestuia prin 'apasarea' pe butoanele Open sau Cancel (echivalent cu butonul X al ferestrei).

se foloseste pentru selectionarea dintr-o lista a unei fonte(de exemplu cu care se poate configura dinamic fonta folosita intr-un control Text Box). Save . Action = 2. ShowColor.butonul (X) din coltul dreapta sus.se foloseste pentru aflarea codului unei anumite culori selectionate dintr-o lista(de exemplu cu care se pot configura dinamic culorile unui control). Explicatie. y FileName . Font . . va determina afisarea tuturor fisierelor care au extensia din 3 caractere dintre care primele doua sunt 'MD'. ShowPrinter. Totusi ea avand o actiune in momentul setarii ei(vizualizarea controlului in una din cele 5 forme specificate).se foloseste de obicei pentru preluarea din fereastra Windows Explorer.care face ca proprietatea FileName.md? '. se poate provoca aparitia unei erori de executie specifice. daca in prealabil se seteaza proprietatea acestuia CancelError cu True. Color . deoarece aceasta proprietate va contine la iesire numele complet(cu cale si extensie) ales de utilizator prin folosirea controlului. de obicei fisier. sa se configureze corespunzator. ShowSave. adica calea afisata + numele introdus + extensia implicita (daca numele nu o contine explicit) sau y Cancel** . Action = 4. care se pot folosi in locul lui Action. este o proprietate. ShowFont. Action = 3. ** Daca se iese din controlul Common Dialog. Versiunile mai noi ale controlului au introdus 5 metode. Action = 5. practic se comporta ca o metoda. Acelasi lucru se produce daca se inchide fereastra prin comanda Close de inchidere a ferestrei .  Asa cum am mai aratat metoda controlului este Action*. * Action. Este folosit atat ca parametru de intrare(daca se doreste o initializare a casetei) dar in special ca parametru de iesire. sa nu se modifice. asupra caruia se vor efectua anumite prelucrari in citire. prin butonul Cancel.se foloseste de obicei pentru introducerea unui nume complet de fisier (nou sau existent) care va fi creat(sau eventual rescris daca exista deja). Explicatie. Aceste metode sunt: ShowOpen. Exista 5 forme ale controlului specific pentru anumite operatii si anume: Action = 1. asa cum se vede si din utilizarea ei. a unui nume complet de obiect.care face ca proprietatea FileName.' Toate tipurile Access | *. Print Iesirea din metoda se face prin apasarea butonului: y Open (Save) . cu codul 32755. Open .corespunde numelui introdus in caseta File Name a controlului.

se gaseste in formularul F_CdialogContainer al aplicatiei DAO.Mdb Private Function CitireCD() As Variant ' Intoarce numele complet introdus prin controlul Common Dialog _ Daca functia intoarce NULL atunci s-a iesit prin butonul Cancel din Common Dialog '-------------------------------------------------------------------------------------------------------------------' Parametrii de initializare pentru configurarea controlului Common Dialog 'Intrare .Extensia implicita a numelui de fisier introdus _ Se foloseste de obicel la Comanda de salvare Me!CD.Save _ .Mdb|All|*.*' ' Comenzile posibile ce se pot efectua : _ Action = 1 .InitDir = '' 'Intrare . Functia CitireCD.DefaultExt = 'Mdb' 'Intrare .Filtrul de selectie pentru fisierele afisate _ Se introduc cate doua informatii(separatorul este caracterul (|) _ pentru fiecare rand afisat in caseta de selectie: _ 1.Titlul pus in caseta Common Dialog Me!CD.Numele afisat pentru precizarea selectiei ce se efectueaza _ 2.Filter = 'Fisier Access|*.Multimea numelor care se vor selectiona prin folosirea caracterelor generice (*) si (?) Me!CD.-----------------Exemplu.DialogTitle = 'Selectati fisierul cu Baza de date' 'Intrare .Open _ Action = 2 .Directorul implicit pentru pozitionarea initiala a casetei Common Dialog Me!CD.

FileName = '' 'Initializare Me!CD.Font _ Action = 5 . care face parte din pachetul de distributie al pachetului Visual Basic.Action = 1 'Open .OCX. se gaseste in fisierul COMDLG32.Se da controlul casetei Common Dialog 'Iesire .FileName = '' Then CitireCD = Null ' iesire prin Cancel Else CitireCD = Me!CD.Color _ Action = 4 . .Numele complet(cu cale si extensie) a fisierului selectionat _ Daca se intoarce un string gol('') atunci s-a iesit prin apasarea pe Cancel If Me!CD.Action = 3 .Print Me!CD.FileName End If End Function -----------------Nota: Controlul Common Dialog.

precum si o serie de rutine. Structura acesteia este data in figura de mai jos. tipuri de date. Modelul DAO contine toate colectiile de obiecte si obiectele bazei de date.mdb . Data Access Objects(DAO) permite ca printr-un limbaj de programare sa se acceseze o baza de date .locala(din aplicatia curenta) sau din alta aplicatie(fisier).III. necesare manipularii acestora. etc. constante. help-uri.1 Structura DAO.. III. Ea se refera la baza de date din fisierul DAO. Ea permite gestionarea structurii(schema) si a informatiilor acesteia.3 Obiecte pentru acces la date .Data Access Objects ± DAO.3.

VBA va contine pentru toate tipurile de colectii. pe cand altele(Database sau Recordset). VBA are alte tipuri de date care au tot numele colectiei. Acesta este deosebit fata de celelalte obiecte din modelul DAO. Obiectele care se deschid au metode de inchidere Close. III. Toate obiectele isi pastreaza numele in proprietatea Name.3. a bazei de date locale a aplicatiei DAO. al carui nivel superior il constituie obiectul DBEngine. tipuri de date care au chiar numele colectiei. Fields si Indexes. pentru obiectele care apartin unei colectii. care face parte din colectia TableDefs. atunci cand se termina modulul in care au fost declarate. y In primul rand modelul DAO are o structura ierarhic arborescenta. pentru a se introduce structura unei tabele). De asemenea el contine la randul sau una sau mai multe colectii de obiecte.) De asemenea. variabile de tip TableDefs. -----------------y Obiectele(cu exceptia celor din colectia Errors) au proprietatiProperty care sunt constituite in colectia de proprietati a obiectului respectiv . este un obiect de tip TableDef. (De exemplu se pot crea pentru colectia care contine structura tuturor tabelelor din baza de date. Totusi acestea se pot inchide si automat. Fiecare obiect din structura DAO face parte dintr-o colectie de obiecte. Obiectul Tabela_A. De asemenea cu metoda Delete se pot sterge obiecte din colectii y Unele obiecte sunt create deja (TableDef de exemplu) si se folosesc ca atare indicandu-se numele lor(cu regulile obisnuite de calificare). Exemplu.Properties. (De exemplu se poate folosi o variabila de tip TableDef. y Obiectele(exceptie obiectele Error) au posibilitatea ca prin metode de tip Create si Append sa creeze si adauge obiecte la colectiile de obiecte din structura lor. dar la singular. Fiecare obiect are o proprietate implicita. De obicei aceasta este proprietatea Value.Cateva din caracteristicile modelului DAO sunt prezentate in continuare. fiind tratat ca o exceptie. mai intai trebuie deschise cu metode de tip Open.mdb. DBEngine. ca sa fie folosite.2 Obiectul DBEngine. y DAO contine 17 tipuri diferite de obiecte. El este singular si nu apartine nici unei colectii. El contine doua colectii de obiecte. asa cum am aratat este obiectul din varful modelului ierarhic arborescent DAO. .

Aceasta aplicatie va trebui accesata de mai multi utilizatori. prin care se pot accesa servere specializate de baze de date(de exemplu Microsoft SQL) prin metoda ODBC(Open Data Base Connectivity). DBEngine contine intreaga structura DAO.Folosirea lui intr-o aplicatie Access pentru referirea obiectelor din DAO. y ODBCDirect Workspace. mai multe agentii ale acesteia. DAO nu ofera posibilitatea crearii altor obiecte DBEngine. Presupunem ca avem o baza de date(o colectie de date. III. Trebuie sa se faca distinctie intre un server de aplicatie si un server de fisiere. Exemplu. iar in cazul unei noi rezervari. Astfel putem avea o companie de aviatie si pentru rezervarea locurilor la un zbor. raspandite geografic. care permite folosirea motorului Microsoft Jet.mdb) sau surse ISAM : FoxPro. Lotus. DAO poate functiona in doua medii specifice unor anumite tipuri de baze de date.spatiul(mediul) de lucru. Metoda de realizare a unei aplicatii. este obiectul catre care trebuie facuta aceasta operatie. si anume: y Microsoft Jet Workspace.) daca se doreste folosirea unei baza de date Access. el fiind considerat implicit. DBase. Din alte aplicatii care au implementata tehnologia de transfer de date Automation (de exemplu: MS Excel. Visual Basic etc. stergeri sau modificari) sau extrag informatiile necesare derularii activitatii respective. este optionala. specifice unei anumite activitati) si niste programe(aplicatii) care gestioneaza datele respective. Workspace reprezinta suportul in care o baza de date poate fi utilizata.3 Workspaces . impreuna cu sistemul de securitate folosit.3. Aplicatii server/client. MS Word. DBEngine contine doua colectii de obiecte: Workspaces si Errors. Paradox. in care cereri sau proceduri sunt formulate de aplicatia client. in care se pot utiliza baze de date Access(fisiere . . sa informeze imediat acest lucru. In felul acesta se pot crea aplicatii care pot 'lega' mai multe tipuri de baze de date. de clienti(in special agentiile de turism). trebuie sa stie precis care este starea ocuparii locurilor. de unde sa fie accesata 'on line'. adica le actualizeaza(adaugari. urmand ca executia lor sa se faca pe serverul de aplicatie. cu baza de date a zborurilor plasata pe un anumit calculator. Urmatorul exemplu va lamuri acest lucru. Evident trebuie sa avem o retea de calculatoare. care va contine baza de date(back-end server).

vom avea si o parte din programele aplicatie si anume cele care acceseaza direct baza de date. ce pot fi atasate in memorie colectiei Workspaces prin metoda Append. In primul caz. DAO are un spatiu de lucru. O astfel de aplicatie. vom plasa pe un server baza de date. La o statie de lucru . Cand se face referire la baza de date locala. Observatia 3. toate informatiile de la toate zborurile companiei. in afara bazei de date. Observam ca pe retea se vor transmite atat informatii utile cat si cele care nu sunt necesare la un moment dat. unul de tip Microsoft Jet.Exista in continuare doua posibilitati de realizarea a acestui lucru si anume cu un server de fisiere sau un server de aplicatii. O astfel de aplicatie se numeste server/client. Acesta va efectua extragerea din baza de date numai a informatilor necesare. reducerea substantiala a informatiei transmise prin retea. al serverului de fisiere. pe server. chiar daca este mult mai complexa. pe care le va trimite pe retea inapoi utilizatorului. #Default Workspace# de tip Microsoft Jet. se pot crea si alte obiecte Workspace. programele aplicatiei. dupa care. referirea obiectelor poate sa nu contina nici DBEngine nici spatiul de lucru . aici se vor extrage datele de la zborul care intereseaza. O cerere de prelucrare se va desfasura in felul urmator: se vor aduce prin retea. se va prezenta numai Microsoft Jet Workspace. al serverului de aplicatii. Prin metoda DBEngine. De creare a doua obiecte Workspace. Sub Prop_Workspace() Dim WS1 As Workspace Dim WS2 As Workspace Dim WS As Workspace Dim PR As Property ' obiect din colectia Properties . Implicit. In al doilea caz. se numeste aplicatie client. Observam in acest caz. -----------------In cadrul acestui capitol. in care este plasata si baza de date locala. iar pe toate statiile de lucru de la agentii. Exemplu. daca s-a facut o rezervare. va fi trimis acest lucru imediat la serverul de date. celalalt ODBCDirect si de vizualizare a proprietatilor acestora. ceea ce face aplicatia mult mai performanta.Workspaces(0).o cerere de prelucrare(datele despre un zbor) va fi trimisa serverului de aplicatii. CreateWorkspace. deoarece amandoua sunt implicite. de la serverul cu datele la statia de lucru.unde exista cealalta parte a programelor aplicatiei si anume interfata cu utilizatorul .

Numele utilizatorului care are acces la el _ 3.NAME.' Se creaza doua spatii de lucru cu metoda CreateWorkspace _ . 'admin'.Mediu ODBCDirect _ .CreateWorkspace('WorkspaceJet'. 'admin'.Microsoft Jet _ -ODBCDirect ' Parametrii sunt in ordine: _ 1.Append WS1 ' Nu s-a folosit DBEngine.Tipul mediului de lucru. si anume se foloseste constanta: _ .dbUseJet .Numele spatiului de lucru _ 2. ''. deoarece e implicit Workspaces. dbUseJet) ' Dupa crearea unui spatiu de lucru ODBC acesta se ataseaza _ in memorie colectiei Workspaces cu metoda Append Workspaces. dbUseODBC) Set WS2 = DBEngine. vbOKCancel + vbCritical) = vbOk Then On Error Resume Next ' ignora erorile care pot aparea.Mediu ODBCDirect Set WS1 = DBEngine.CreateWorkspace('WorkspaceODBC'.NAME & ' = ' & PR.Value Next PR .Properties MsgBox ' Proprietatea :' & PR.Append WS2 ' Colectia Workspace si proprietatile obiectelor din aceasta For Each WS In Workspaces If MsgBox('Spatiul :' & WS. Vezi colectia Errors For Each PR In WS. ''.Parola _ 4.dbUseODBC .

Tratarea erorilor de executie in VBA. In momentul producerii unei erori de executie intr-o rutina. Colectia Errors. functioneaza in contextul sistemului general de erori implementat in VBA. locala sau din afara. care va fi prezentat in cele ce urmeaza.care va contine unul sau mai multe obiecte Database. contine 3 colectii de obiecte.4 Colectia Errors. III. y Butonul Debug . In continuare utilizatorul poate apasa pe: y Butonul End . cursorul de instructiuni(linia galbena) pozitionandu-se pe instructiunea care a produs eroarea si permitand utilizatorului sa depaneze eventual programul prin modificarea instructiunilor. Acest sistem se poate folosi numai in perioada de testare de catre proiectant a aplicatiei.se va afisa codul de program care a generat eroarea. pastrarea lui in exploatarea aplicatiei fiind extrem de periculoasa.On Error GoTo 0 End If Next WS End Sub ' Reface sistemul de erori standard Nota: Acest exemplu ca si celelalte din cadrul acestui modul se gasesc in fisierul DAO. Users si Groups.3. nu se va mai afisa nici aceasta descriere).3.1 Tratarea standard a unei erori de executie produsa in VBA. prin care se implementeaza sistemul de protectie al spatiului de lucru. in care se poate vedea numarul erorii si o descriere sumara a acesteia(daca se lucreaza intr-un mediu Run Time. si anume: Databases . III.4.mdb -----------------Un obiect Workspace. Aceste obiecte nu vor fi prezentate in acest modul. Este evident ca sunt sanse mici ca aplicatia sa poata fi reluata de utilizator in conditii corecte. in fiecare putandu-se deschide cate o baza de date. sistemul va intrerupe executia si va afisa mesajul din casuta alaturata.se opreste executia codului si se re initializeaza toate variabilele aplicatiei. .

de tip numeric. _ instructiunile ce urmeaza nu se vor mai executa!! MsgBox 'Rezultatul lui ' & A1 & '/' & A2 & '=' & R Eroare_Standard = R End Function III.4. in vederea rezolvarii mai 'elegante' a unor cazuri normale de prelucrare. De asemenea proiectantii de aplicatii pot folosi producerea unor erori previzibile. Daca se introduce in variabila A2. Un astfel de modul se numeste rutina de tratare a erorilor(Error-handling). Controlul erorilor de executie se realizeaza prin doua instructiuni si doua obiecte create special in acest scop: .Nota: Butonul Debug este activ numai daca se lucreaza pe un fisier MDB. care are codul de program si in limbajul sursa(daca aplicatia este intr-un fisier de tip MDE. De asemenea daca se va introduce 0 in A2 se va afisa mesajul de eroare datorita impartirii la 0. un caracter atunci se va afisa mesajul prezentat mai sus.2 Tratarea erorilor de executie prin module special create de proiectant. ofera posibilitatea ca la producerea unei erori de executie. sistemul sa dea controlul la un modul special creat de proiectant prin care sa se trateze in mod corespunzator eroarea.3. Public Function Eroare_Standard() As Variant ' Functie care va trata o eventuala 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 'Daca o eroare se va produce pana aici. butonul este inactiv). Exemplu. VBA.

care se va gasi dupa aceasta eticheta. . Deci. De asemenea inversa acestei afirmatii este si ea valabila.1 Instructiunea: On Error. 2. Nota: O eticheta se declara printr-un nume scris la inceputul unei linii urmat de semnul doua puncte(:). Deci. in cazul aparitiei unei erori de executie. III. deoarece exista anumite proprietati care nu au valoare si care ar provoca o eroare la executia instructiunii(MsgBox) care afiseaza mesajul cu valoarea proprietatii. aceasta va fi practic ignorata in cazul producerii unui asemenea eveniment. care atunci cand este intalnita si executata.III. Errorhandling. in rutina respectiva se produce la un moment dat o eroare de executie.  Pozitia pe care se va plasa cursorul de instructiuni. doua actiuni(indirecte):  Dezactivarea sistemului standard de tratare a erorilor de executie. adica daca intr-o rutina se produce o eroare de executie inainte de a se executa instructiunea On Error. Exemplu. On Error Resume Next . prin incadrarea ei intre instructiunile On Error Resume Next si On Error GoTo 0. produce asupra codului VBA care urmeaza dupa aceasta. este o instructiune. atunci aceasta va preciza si care este urmatoarea instructiune care se va executa in cazul producerii unui asemenea eveniment. daca dupa executia instructiunii On Error. 3.4. prelucrarea va continua cu urmatoarea instructiune care se gasesc dupa aceea care a produs eroarea. daca dupa executia instructiunii On Error. Prop_Workspace.la producerea unei erori. Aceasta forma este folosita atunci cand se va folosi o rutina speciala pentru tratarea erorii. On Error GoTo eticheta . On Error. Deci practic prin aceasta forma prelucrarea va continua fara a se mai executa instructiunea care a produs eroarea. prelucrarea va continua cu instructiunile care se gasesc dupa eticheta.2.3. Resume. in rutina respectiva se produce o eroare de executie.2 Instructiunea: Resume. O eticheta este vizibila numai in rutina in care a fost declarata.la producerea unei erori.2. atunci nu mai este afisat mesajul de eroare pe care l-am prezentat inainte. On Error GoTo 0 .3. In procedura prezentata mai inainte. Exista trei forme ale instructiunii On Error.reinstaleaza sistemul standard de tratare a erorilor. functie de locul de unde se va continua executia in cazul aparitiei erorii de executie: 1.4. se va continua prelucrarea prin sistemul standard de tratare a erorilor prin afisarea mesajului respectiv. este instructiunea prin care se iese din rutina de tratare a erorilor(Error-handling).

Deci. * Numarul tuturor erorilor posibile se gaseste in Help. III. si se pastreaza in cazul trecerii la noi versiuni. 2. dupa executia rutinei de tratare a erorii.4.prelucrarea va continua cu urmatoarea instructiune care se gasesc dupa aceea care a produs eroarea. Description .prelucrarea va continua cu instructiunile care se gasesc dupa eticheta. i se vor seta automat de sistem proprietatile functie de eroarea produsa. se va relua executia instructiunii care nu sa putut executa.care va contine numarul* erorii produse. 3.4.3. sa fie initializat(golit). Sfirsit: .2. Err. este necesar ca obiectul Err. Exit Function sau Exit Property. Resume 0 sau Resume . Acest lucru se face numai la: executia instructiunilor: On Error sau Resume. prin instructiunile: Exit Sub. Resume Next .prelucrarea va continua chiar cu instructiunea care a produs eroarea. Function XYZ() On Error GoTo Fis ' activarea rutinei Error-handling ' Codul care poate genera eroarea. si care in momentul producerii unei erori. 1. la comanda prin executia metodei Clear.2. fara a se mai executa instructiunea care a produs eroarea.care va contine un text care expliciteaza aceasta eroare. Explicatie.3 Obiectul: Err. III. Aceasta proprietate este implicita.4 Structura unei rutine care are modul de Error-handling. Resume eticheta . la terminarea rutinei care a produs ultima eroare. a obiectului Err.3. Pentru ca sistemul sa incarce proprietatile la producerea unei erori. functie de locul de unde se va continua executia dupa ce se termina executia rutinei de tratare a erorilor. este un obiect care se gaseste in VBA. Cele mai importante proprietati ale acestui obiect sunt: Number .Exista trei forme ale instructiunii Resume. Deci practic prin aceasta forma prelucrarea va continua dupa tratarea erorii.

Exit Function ' Iesirea in cazul in care nu se produce nici o eroare se va face pe aici Fis: ' Modulul de tratare a erorii Resume «. Const Er_Div0 = 11 ' codul erorii de impartire la 0 Const Er_Tip = 13 ' codul erorii de data de alt tip Dim A1 As Double Dim A2 As Double Dim R As Double A1 = 1000 On Error GoTo Fis 'Producerea unei erori in continuare se va trata prin _ modulul care se afla dupa eticheta FIS Reia: A2 = InputBox('A2=') R = A1 / A2 MsgBox 'Rezultatul lui ' & A1 & '/' & A2 & '=' & R Eroare_Handling = R Sfirsit: . ' Instructiunea care urmeaza dupa executia modulului de tratare a erorii End Function Exemplu. In continuare se prezinta aceiasi functie de la inceput dar in care se prelucreaza eventuala eroare printr-un modul specializat. Public Function Eroare_Handling() As Variant ' Exemplu de control al erorilor printr-un modul specializat.

' & err. _ dupa care se opreste executia functiei MsgBox 'Eroare Nr=' & err & ' .Number = 13 Then If MsgBox(' .Description Resume Sfirsit End If End Function ------------------ . pentru a fi functional in cazul producerii unei alte erori Else Eroare_Handling = Null Resume Sfirsit ' Se termina functia fara a se reintroduce data _ functia va intoarce NULL in acest caz End If Else ' Se produce o alta eroare care va fi afisata.S-a produs o eroare datorita datei introduse' & vbCr & _ 'Reintroduce-ti data?'. vbExclamation + vbYesNo) = vbYes Then Resume Reia ' Se reia de la introducerea valorii pentru A2 _ se reseteaza ERR.Exit Function ' Iesirea din functie se face numai pe aici Fis: If err.Number = 11 Or err.

Nota: In cazul in care se produce o eroare intr-o rutina(A) care nu are modul de tratare a erorii, dar ea este apelata de o alta rutina(B) care are un astfel de modul, eroarea va fi tratata de modulul de eroare al acesteia din urma(B).
III.3.4.2.5 Colectia Errors si obiecte Error.

In cazul in care un obiect DAO va provoca o eroare de executie, exista posibilitatea generarii mai multe erori in cascada. Dupa producerea unei asemenea erori, in colectia Errors, se va crea un obiect Error - similar obiectului prezentat anterior Err din VBA - pentru fiecare eroare generata. In acelasi timp, prima eroare produsa va seta si obiectul VBA - Err. Deoarece Err reprezinta un singur obiect, acesta nu va putea prelua decat datele despre o singura eroare, si anume prima produsa. Colectia Errors, pentru a functiona corect, trebuie sa aiba sterse toate obiectele Error componente. Aceasta actiune sistemul o efectueaza in momentul executiei unei noi operatii DAO. In cazul in care se doreste o prezentare detaliata a erorilor de executie produse de un obiect DAO, se pot folosi obiectele Error ale colectiei Errors ca in exemplul urmator: Exemplu. 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 colectiei Errors On Error GoTo Fis ' Producerea unei eventuale erori va da controlul la instructiunile 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 in variabila Eroare, pentru fiecare obiect din colectia Errors, _ cite un rand 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 si primul obiect din colectia Errors si _ obiectul Err au acelasi numar de eroare MsgBox EROARE, vbCritical Else ' Eroare ce nu se produce in DAO MsgBox 'Eroare VBA nr=' & err.Number & ' - ' & err.Description, vbExclamation

End If Resume Next ' trece la executia urmatoarei instructiuni End Sub

III.3.5 Colectia Databases
Colectia Databases, contine obiecte Database, care contin descrierea completa a structurii si informatiile dintr-o baza de date. Pentru ca o baza de date(sau un obiect component) sa fie accesata, aceasta trebuie mai intai deschisa, operatie care produce crearea unui obiect Database, care se va adauga automat la colectia Databases. VBA, contine tipurile de date Databases si Database care permit declararea de variabile specifice. Deschiderea unei baze de date se poate face in urmatoarele doua moduri:  Cu functia CurrentDb, care intoarce un obiect de tip Database, care contine baza de date locala, adica aceea definita in aplicatie. Dim Db As Database Set Db = CurrentDb  Prin metoda Workspace, OpenDatabase, care permite descrierea unei baze de date externe ( care poate sa fie chiar in format ISAM - FoxPro, Dbase, Paradox). Dim Db As Database Set Db = [workspace].OpenDatabase (dbnume [, options] [, read-only] [, connect]) Asa cum se observa, singurul parametru obligatoriu este: Dbnume - numele complet(cu extensie si cale) al fisierului care contine baza de date. Daca nu se precizeaza, spatiul de lucru este cel implicit(Default Workspace) -----------------Obiectul Database, contine urmatoarele colectii in care sunt incluse toate informatiile referitoare la baza de date respectiva. y TableDefs ± Structura tabelelor bazei de date.

y y y y

QueryDefs ± Cererile din baza de date. Relations ± Relatiile din baza de date. Recordsets ± Inregistrarile(datele) din tabelele bazei de date. Containers ± Informatii de securitate despre obiectele din baza de date.

Nota: Referirea colectiilor si a obiectelor din baza de date se face prin calificarea acestora, de jos in sus, trecand prin toate colectiile si obiectele ascendente pana la, obligatoriu, cel putin nivelul bazei de date. Exemplu. In baza de date DAO.Mdb, pentru a se referi obiectul campul 'N' al tabelei 'Tabela_A' in vederea afisarii proprietatilor Name si Type, se face: Dim Db As Database Dim Fd as Field Set Db = CurrentDb Set Fd = Db.TableDefs!Tabela_A.Fields!N ' In variabila Fd se introduce obiectul campul N Msgbox 'Campul cu numele :' & Fd.Name & ' este de tip :' & Fd.Type -----------------Obiectul Database, contine metode prin care: y se pot crea obiecte noi si atasa colectiilor din structura sa:

CreateTableDef - pentru crearea unui obiect cu structura unei tabele noi si adaugarea acestuia la colectia TableDefs; p.Properties.Append ; CreateRelation - pentru crearea unei relatii noi si adaugarea acesteia la colectia Relations; CreateQueryDef - pentru crearea unei cereri noi si adaugarea acesteia la colectia QueryDefs; CreateProperty - pentru definirea unei noi proprietati a bazei de date sau a altui obiect DAO(adaugarea acesteia la colectia de proprietati a bazei de date se face prin metoda Append, a colectiei Properties);.

daca lipseste parametrul 'BazaDate' _ sau a unei baze de date externe . Public Sub Prop_Database(Optional BazaDate as Variant) 'Afiseaza proprietatile bazei de date locale .Properties MsgBox ' Proprietatea :' & PR. vbCritical ' Proprietatea Name a bazei de date contine _ numele complet(cu extensie si path) al fisierului care o contine On Error Resume Next ' Pentru a nu se opri prelucrarea daca apare o eroare _ datorata faptului ca unele proprietati nu au valoare For Each PR In DB.NAME.y se pot defini si deschide obiecte Recordset prin metoda OpenRecordset Exemplu.Value. vbInformation Next PR 'Baza de date din alta aplicatie 'Baza de date din aplicatia curenta .NAME & ' = ' & PR.cu numele fisierului in parametrul 'BazaDate' Dim DB As Database Dim PR As Property 'Daca parametrul 'BazaDate' lipseste atunci se lucreaza cu baza de date interna If IsMissing(BazaDate) Then Set DB = CurrentDb Else Set DB = OpenDatabase(BazaDate) End If '---------------------------MsgBox 'Proprietatile bazei de date :' & DB.

6 Colectia Containers Colectia Containers a unei baze de date.Toate relatiile permanente 4 din MS Access: Forms . permisiuni.Rapoartele salvate in baza de date. etc. Aceasta descriere se face printr-o noua colectie. este evident ca nu este permisa crearea sau stergerea de obiecte din aceste colectii. reflecta structura unei baze de date. Explicatie. se va observa existenta unor tabele.) despre un obiect de tipul respectiv existent(salvat) in baza de date. fie ca provin din structura DAO fie din alte aplicatii. in care fiecare obiect Document. . 3 provin din structura DAO: Databases . Ea este constituita din 8 obiecte Container.Modulele de cod Reports .Macro instructiunile 1 din sistemul de administrare(protectie) SYSrel -----------------Deoarece colectiile Containers si Documents. Scripts .On Error GoTo 0 ' Reface sistemul standard de tratare a erorilor End Sub III. Fiecare din acestea contine descrierea tuturor obiectelor de un anumit tip din baza de date(de exemplu formulare). care incep cu prefixul 'MSyS'.Formularele salvate in baza de date.3. Din cele 8 obiecte Container. * In colectia Tables. Documents. informatiile(nume. Modules . Acestea reprezinta tabelele sistem ale MS Access. contine informatii despre toate obiectele existente(salvate) intr-o baza de date Access.Baza de date curenta(deschisa) Tables* .Toate tabelele si cererile din baza de date Relationships . va contine prin proprietatile sale.

Prin procedura de mai jos se pot cunoaste care sunt toate obiectele existente intr-o baza de date(locala sau externa). Public Sub Structua_Containers(Optional BazaDate) 'Structura colectiei .tabele si query '----------------------------------------------Dim DB As Database Dim CT As Container Dim DC As Document 'Daca parametrul 'BazaDate' lipseste atunci se lucreaza cu baza de date interna If IsMissing(BazaDate) Then Set DB = CurrentDb Else 'Baza de date din aplicatia curenta .Containers 'Obiectele colectiei Containers sunt: ' 0=Databases ' 1=Forms ' 2=Modules ' 3=Relationships ' 4=Reports ' 5=Scripts .Nota: Desi au acelasi nume nu trebuie confundat obiectul Container Forms sau Reports(care contine informatii despre toate formularele /rapoartele din baza de date) si colectia Access(Application) Forms sau Reports(care contine chiar formularele /rapoartele. Acest lucru se obtine prin proprietatea Name a obiectelor Document din fiecare obiect Container a colectiei Containers.macro ' 6=SYSrel ' 7=Tables . dar numai pe cele care sunt deschise in momentul respectiv) Exemplu.

.Close ' Nu e necesara deoarece la sfirsitul procedurii toate obiectele declarate _ in aceasta se inchid si elibereaza automat variabilele obiect folosite End Sub Exemplu.NAME. CForm si CRap. vbOKCancel + vbExclamation) = vbOk Then Else Exit For End If Next DC End If Next CT '----------------DB. vbOKCancel + vbCritical) = vbOk Then For Each DC In CT. se poate alege o baza de date externa sau baza de date locala(daca se iese din CD cu Cancel).NAME. printr-un control Common Dialog CD. si un buton de comanda Cmd.NAME & ' /' & DC.Set DB = OpenDatabase(BazaDate) End If '---------------------------For Each CT In DB.Documents ' Parcurge colectia de Documente ale containerului If MsgBox('Documentul ' & CT. Formularul F_CDialogContainer are doua controale Combo Box. La actionarea butonului Cmd.Containers 'Baza de date din alta aplicatie ' Parcurge colectia de Containers If MsgBox('Container : ' & CT.

vor avea ca lista de valori numele formularelor respectiv rapoartelor din baza de date specificata. al carui nume se va afisa in titlul formularului. CForm si CRap.Caption = 'BD:' & NF End If On Error GoTo 0 ' din nou sistemul standard de erori 'Baza de date din alta aplicatie selectionata prin CD . 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 Dim Rapoarte As Variant Reia: NF = CitireCD ' foloseste controlul Common Dialog pentru preluarea unui nume complet de fisier On Error GoTo Fis 'Deschide Baza de date precizata prin controlul Common Dialog _ .Caption = 'Baza de date locala' Else Set DB = OpenDatabase(NF) Me.daca nu se introduce un nume valid se va produce _ o eroare tratata prin modulul specializat 'FIS' If IsNull(NF) Then Set DB = CurrentDb 'Baza de date locala Me.In urma acestei actiuni cele doua controale.

Containers('Forms').' Next DOC If IsEmpty(Formulare) Then ' Nu exista nici un formular in Baza de date deschisa Me!CForm. salvate Rapoarte = Rapoarte & DOC.RowSource = Left(Rapoarte. salvate Formulare = Formulare & DOC.Documents 'Se pargurg toate form.Containers('Reports').RowSource = 'Nici un Formular!!' Else ' Se configureaza cu numele formularelor lista de valori a controlului Combo Me!CForm. Len(Formulare) .1) End If '===Se configureaza un string cu rapoartele existente(separate cu .1) End If Sfirsit: .' Next DOC If IsEmpty(Rapoarte) Then ' Nu exista nici un raport in Baza de date deschisa Me!CRap.) in BD deschisa _ cu care se configureaza proprietatea RowSource a controlului Combo CForm Formulare = Empty For Each DOC In DB.Documents 'Se pargurg toate rap.RowSource = 'Nici un Raport!!' Else ' Se configureaza cu numele rapoartelor lista de valori a controlului Combo Me!CRap.RowSource = Left(Formulare. Len(Rapoarte) .NAME & '.NAME & '.) in BD deschisa _ cu care se configureaza proprietatea RowSource a controlului Combo CRap Rapoarte = Empty For Each DOC In DB.'===Se configureaza un string cu formularele existente(separate cu .

Fisierul introdus nu este o Baza de date Access!!' & vbCr & _ 'Il reintroduce-ti ?'.DialogTitle = 'Selectati fisierul cu Baza de date' 'Intrare .Exit Sub Fis: If MsgBox(' .Caption = ' ???? ' Resume Sfirsit ' Se renunta End If End Sub '========Functii interne========= Private Function CitireCD() As Variant ' Intoarce numele complet introdus prin controlul Common Dialog _ Daca functia intoarce NULL atunci s-a iesut prin butonul Cancel din Common Dialog '-------------------------------------------------------------------------------------------------------------------' Parametrii de initializare pentru configurarea controlului Common Dialog 'Intrare .Extensia implicita a numelui de fisier introdus _ Se foloseste de obicel la Comanda de salvare Me!CD. vbExclamation + vbYesNo) = vbYes Then Resume Reia ' Se reia introducerea prin controlul Common Dialog Else Me.Titlul pus in caseta Common Dialog Me!CD.DefaultExt = 'Mdb' .

FileName = '' 'Initializare Me!CD.Numele complet(cu cale si extensie) a fisierului selectionat _ Daca se intoarce un string gol('') atunci s-a iesit prin apasarea pe Cancel If Me!CD.Se da controlul casetei Common Dialog 'Iesire .'Intrare .Print Me!CD.Filtrul de selectie pentru fisierele afisate _ Se introduc cate doua informatii(separatorul este caracterul (|) _ pentru fiecare rand afisat in caseta de selectie: _ 1.Directorul implicit pentru pozitionarea initiala a casetei Common Dialog Me!CD.Font _ Action = 5 .*' ' Comenzile posibile ce se pot efectua : _ Action = 1 .Numele afisat pentru precizarea selectiei ce se efectueaza _ 2.Open _ Action = 2 .FileName = '' Then CitireCD = Null ' iesire prin Cancel Else CitireCD = Me!CD.Mdb|All|*.FileName End If .Action = 1 'Open .Multimea numelor care se vor selectiona prin folosirea caracterelor generice (*) si (?) Me!CD.InitDir = '' 'Intrare .Save _ Action = 3 .Color _ Action = 4 .Filter = 'Fisier Access|*.

fiecare din acestea reprezentand structura(nu datele introduse) unei tabele din baza de date deschisa. Validation Text.NAME.3.End Function III. Fiecare obiect TableDef. vbOKCancel + vbCritical) = vbOk Then On Error Resume Next For Each PR In TD. contine obiecte de tip TableDef. Procedura urmatoare afiseaza numele(Name) si valoarea(Value) proprietatilor tuturor tabelelor dintr-o baza de date deschisa Sub Prop_TableDef() ' Proprietatile tabelelor _ -Name : numele proprietatii respective _ -Value(implicita) : 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. sirul de conectare pentru tabelele legate. este chiar acela al tabelei respective.TableDefs If MsgBox('Tabela : ' & TD.7 Colectia TableDefs Colectia TableDefs. contine proprietatile specifice tabelei(Validation Rule.NAME & ' = ' & PR Next PR On Error GoTo 0 End If .) Exemplu. Numele obiectului TableDef.Properties MsgBox ' Proprietatea :' & PR. etc.

Colectia Indexes cu 2 obiecte. si anume: y Colectia Fields .TableDefs Dim DB As Database Dim TD As TableDef .[A] Explicatie. care la randul lui contine: Colectia Fields cu un obiect .Close End Sub -----------------Fiecare obiect TableDef. urmand ca prin colectia Fields al indexului sa se specifice care este efectiv numele campului din tabela. si anume: PrimaryKey.Next TD DB. Fields. Exemplu. Deci se poate ca numele indexului si al campului sa nu fie acelasi. Tabela_A din fisierul DAO. contine la randul sau alte doua colectii.formata din obiecte Index.formata din obiecte Field. Fiecare index reprezinta un obiect cu un nume(care e deobicei numele campului sau pentru cheia primara PrimaryKey). [N] si [A]. y Colectia Indexes . sau chiar ca un index sa fie definit pe mai multe campuri. care la randul lui contine: Colectia Fields cu un obiect . Exemplu. fiecare din acestea descriind prin proprietatile sale(Nume. contine: y y y Colectia Fields cu 2 obiecte Field. Caption. etc.) un camp al tabelei. Regula de validare pentru camp. care la randul lor contin fiecare o colectie de campuri.Mdb. prezentata schematic in figura de la inceputul modulului.[N] y A. Size. Tip de data. Public Sub Structua_TableDefs(Optional BazaDate) 'Structura colectiei de tabele .

TableDefs ' Parcurge colectia de Tabele 'Baza de date din alta aplicatie 'Baza de date din aplicatia curenta If MsgBox('Tabela : ' & TD.Indexes ' Parcurge colectia de Indexi ale tabelei If MsgBox('Indexul: ' & TD.NAME & ' /' & FD. vbOKCancel + vbCritical) = vbOk Then For Each FD In TD.Fields ' Parcurge colectia de Cimpuri ale tabelei If MsgBox('Cimpul: ' & TD.NAME.NAME. vbOKCancel + _ vbInformation) = vbOk Then .NAME & ' /' & ID.NAME. vbOKCancel + _ vbExclamation) = vbOk Then Else Exit For End If Next FD '------------------------For Each ID In TD.Dim FD As Field 'Cimpurile tabelei Dim ID As Index Dim FID As Field 'Cimpurile indexului 'Daca parametrul 'BazaDate' lipseste atunci se lucreaza cu baza de date interna If IsMissing(BazaDate) Then Set DB = CurrentDb Else Set DB = OpenDatabase(BazaDate) End If '---------------------------For Each TD In DB.

Codul de program al acestui formular este: Private Sub Form_Open(Cancel As Integer) Dim DB As Database .NAME. La deschiderea formularului(evenimentul Open).NAME & ' /' & _ FID. CTabel si CCimp. La introducerea unei nume de tabel in CTabel(evenimentul After Update). se completeaza lista de valori a controlului CCimp cu numele campurilor tabelei respective.NAME & ' /' & ID.For Each FID In ID. vbOKCancel + vbExclamation) = vbOk Then Else Exit For End If Next FID End If Next ID End If Next TD '--------------DB. Formularul F_TableDef are doua controale Combo Box.Close ' Nu e necesara deoarece la sfirsitul procedurii toate obiectele _ declarate in aceasta se inchid si elibereaza automat variabilele obiect folosite End Sub Exemplu. CTabel va avea completata lista de valori cu numele tabelelor din baza de date locala.Fields ' Parcurge colectia de Cimpuri ai indexului If MsgBox('Cimpul indexului: ' & TD.

Len(sTabele) .RowSource = Left(sTabele.TableDefs 'Se pargurg toate tabelele sTabele = sTabele & TB.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 locala '===Se configureaza un string cu cimpurile existente (separate cu .Dim TB As TableDef Dim sTabele As Variant Set DB = CurrentDb 'Baza de date locala '===Se configureaza un string cu tabelele existente(separate cu .NAME & '.RowSource = 'Nici un tabel??!!' Else ' Se configureaza cu numele tabelelor lista de valori a controlului Combo Me!CTabel.) in BD deschisa _ cu care se configureaza proprietatea RowSource a controlului Combo CTabel sTabele = Empty For Each TB In DB.' Next TB If IsEmpty(sTabele) Then ' Nu exista nici un tabel Me!CTabel.) in tabela Me!CTabel _ cu care se configureaza proprietatea RowSource a controlului Combo CCimp sCimpuri = Empty .

fiecare din acestea reprezentand structura(nu datele introduse) unei cereri salvate din baza de date deschisa. tot asa la nivelul unui obiect TableDef. numele acestora fiind acelasi cu al cererii respective. Exemplu. cu specificarea faptului ca obiectele QueryDef componente. adica structura cererilor din baza de date curenta. Fiecare obiect QueryDef. contine obiecte de tip QueryDef.NAME & '. in locul colectiei de indecsi vor avea o colectie de parametrii. Colectia QueryDefs.Fields 'Se pargurg toate cimpurile tabelei sCimpuri = sCimpuri & FD. exista metoda CreateField. III. contine proprietatile specifice ale cererii.RowSource = 'Nici un Cimp??!!' Else ' Se configureaza cu numele cimpurilor lista de valori a controlului Combo Me!CCimp. la colectia de campuri a obiectului TableDef.RowSource = Left(sCimpuri. este foarte asemanatoare colectiei TableDefs. Colectia QueryDefs. pentru crearea structurii unei tabele. prin care se pot defini campuri. care dupa aceea se pot adauga prin metoda Append.For Each FD In DB(Me!CTabel).' Next FD If IsEmpty(sCimpuri) Then ' Nu exista nici un cimp Me!CCimp. Len(sCimpuri) . Sub Prop_QueryDef() ' Proprietatile cererilor _ -Name : numele proprietatii respective _ -Value(implicita) : Valoarea pe care o are o proprietate .3.8 Colectia QueryDefs.1) End If End Sub -----------------Asa cum la nivelul obiectului bazei de date exista metoda CreateTableDef.

daca cererea a fost creata cu parametrii.QueryDefs If MsgBox('Cererea :' & Qry. fiecare din acestea reprezentand un camp al cererii.formata din obiecte Parameter. Cerere_A din fisierul DAO.formata din obiecte Field. prezentata schematic in figura de la inceputul modulului.Properties MsgBox ' Proprietatea :' & PR. contine la randul sau alte doua colectii. y Colectia Parameters . contine: y y Colectia Fields cu 3 obiecte Field: [N] .Dim DB As Database Dim Qry As QueryDef Dim PR As Property Set DB = CurrentDb For Each Qry In DB. vbOKCancel + vbCritical) = vbOk Then On Error Resume Next For Each PR In Qry.Close End Sub -----------------Fiecare obiect QueryDef.NAME.NAME & ' = ' & PR Next PR On Error GoTo 0 End If Next Qry DB. Exemplu.Mdb. [A] si [A1] Colectia Parameters cu 1 obiect Parameter : [Numar] . si anume: y Colectia Fields .

vbOKCancel + _ vbExclamation) = vbOk Then Else Exit For End If Next FD .NAME.NAME & ' /' & FD.QueryDefs Dim DB As Database Dim Qry As QueryDef Dim FD As Field Dim PT As Parameter 'Cimpurile cererii 'Parametrii cererii 'Daca parametrul 'BazaDate' lipseste atunci se lucreaza cu baza de date interna If IsMissing(BazaDate) Then Set DB = CurrentDb Else Set DB = OpenDatabase(BazaDate) End If '---------------------------For Each Qry In DB.Fields ' Parcurge colectia de Cimpuri ale cererii If MsgBox('Cimpul: ' & Qry.QueryDefs ' Parcurge colectia de Cereri 'Baza de date din alta aplicatie 'Baza de date din aplicatia curenta If MsgBox('Cererea : ' & Qry. Public Sub Structua_QueryDefs(Optional BazaDate) 'Structura colectiei de cereri .NAME.Exemplu. vbOKCancel + vbCritical) = vbOk Then For Each FD In Qry.

Exemplu.Close End Sub -----------------La nivelul obiectului bazei de date exista metoda CreateQueryDef.NAME & ' /' & PT. descrierea cererii facandu-se direct in SQL. Cererea. vbOKCancel + _ vbInformation) = vbOk Then Else Exit For End If Next PT End If Next Qry DB. Cerere_B este creata daca se executa urmatoarea secventa de instructiuni. pentru crearea unei cereri permanente prin cod VBA.* FROM Tabela_B. Public Sub Fac_Query() ' Creaza o cerere Dim DB As Database Const NumeCerere = 'Cerere_B' ' Numele cu care va fi salvata cererea 'Instructiunea SQL de descriere a cererii Const SQL = 'SELECT Tabela_B.NAME.Parameters ' Parcurge colectia de Parametri ai cererii If MsgBox('Parametrul: ' & Qry.'------------------------For Each PT In Qry.' Set DB = CurrentDb 'Baza de date din aplicatia curenta ' Se creaza cererea si se salveaza in BD deschisa .

si are ca efect executia efectiva a cererii. Aceasta metoda se aplicata numai cererilor actiune.Parameters('Text2') = 'XXX' ' Executia cererii actiune Update face ca toate inregistrarile _ care au cimpul [A] = 'unu' (parametrul: Text1) sa si-l modifice _ in 'XXX' (parametrul: Text2) QRY. Exemplu.Parameters('Text1') = 'unu' QRY.Execute End Sub ------------------ . Public Sub Executa_Query() ' Executa o cerere actiune cu parametrii / Update Query Dim DB As Database Dim QRY As QueryDef Const NumeCerere = 'Cerere_C' ' Numele cererii Set DB = CurrentDb 'Baza de date din aplicatia curenta ' Se introduce cererea in variabila obiect QRY Set QRY = DB. SQL End Sub -----------------Metoda Execute.DB.CreateQueryDef NumeCerere.QueryDefs(NumeCerere) ' se dau valori parametrilor cererii QRY.

ca in exemplul de mai sus. fiecare din acestia reprezentand o relatie permanenta a bazei de date. Parametrii unei cereri pot fi introdu-si direct prin cod VBA. vbOKCancel + vbCritical) = vbOk Then For Each FD In REL. contine o colectie Fields. Exemplu. care evident nu se pot executa.Fields ' Parcurge colectia de Cimpuri ale relatiilor . contine obiecte de tip Relation.9 Colectia Relations Colectia Relations. Observatia 2. Numele relatiei va fi constituit din concatenarea numelor obiectelor intre care se creeaza relatia. Public Sub Structua_Relations(Optional BazaDate) 'Structura colectiei de relatii . Fiecare obiect Relation. III. ale carui obiecte definesc campul de relatie. Cererile de selectie(cu eventuali parametrii).3. pot sa constituie suportul pentru crearea unor Recordseturi.Relations ' Parcurge colectia de Relatii 'Baza de date din alta aplicatie 'Baza de date din aplicatia curenta If MsgBox('Relatia : ' & REL.Observatia 1.NAME.Relations Dim DB As Database Dim REL As Relation Dim FD As Field 'Cimpurile relatiei 'Daca parametrul 'BazaDate' lipseste atunci se lucreaza cu baza de date interna If IsMissing(BazaDate) Then Set DB = CurrentDb Else Set DB = OpenDatabase(BazaDate) End If '---------------------------For Each REL In DB.

Obiectul Recordset permite accesul la datele din baza de date. al inregistrarii.NAME. Un Recordset este asemanator deci cu un fisier clasic. sunt utilizate pentru a manipula datele dintr-o baza de date la nivel de multime(prin implementarea operatiilor de algebra relationala).10. vbOKCancel + _ vbExclamation) = vbOk Then Else Exit For End If Next FD End If Next REL End Sub III. formata din obiecte Field.Set de inregistrari. III. sunt folosite in acelasi scop dar la nivelul elementar. sau cele care rezulta in urma executarii unei cereri de selectie. un obiect Recordset. Asa cum cererile.(Cererile de selectie sunt considerate asa cum am mai aratat tabele virtuale). . fiecare din acestea reprezentand un camp al inregistrarii respective. contine inregistrarile care se gasesc intr-o tabela. obiectele Recordset. La randul sau.NAME & ' /' & FD. si avand de asemenea acelasi nume cu al campului.If MsgBox('Cimpul: ' & REL. in modalitatea in care se procedeaza cu un fisier clasic.3. contine colectia Fields. ca tabele virtuale).1 Functionarea unui set de inregistrari.10 Colectia Recordsets . obiectele Recordset sunt formate din datele(informatiile) care se gasesc in acestea. Colectia Recordsets. Un obiect Recordset.3. este formata din obiecte Recordset(set de inregistrari). El este constituit din campuri(coloane) si inregistrari(randuri). Deci daca obiectele TableDef(sau QueryDef) definesc structura tabelelor(cererilor. prin parcurgerea unui tabel sau a unei cereri de selectie.

permit marirea sau micsorarea pointerului de inregistrari. este format ca un tabel(matrice). y acces direct la o inregistrare . memorii tampon etc.  Sa fie accesata o anumita inregistrare. se poate face in mai multe feluri: y acces secvential la o inregistrare . Deci Recordsetul. Cand se efectuau prelucrari prin cereri. Metoda Recordset folosita este Close. asezate una dupa alta si pentru a efectua orice prelucrare trebuie mai intai sa se pozitioneze pointerul de inregistrari pe respectiva inregistrare.Pentru a manevra un Recordset(sau un fisier clasic) trebuie sa se parcurga niste etape. Pozitionarea pointerului de inregistrari. se refera la acest aspect. Metoda folosita este OpenRecorset(a obiectului Database). mai intai trebuie sa se faca pozitionarea pe inregistrarea(randul) respectiv. cu o valoare fixa. Metodele Recordset folosite. Un Recordset.) folosite de Recordset. din randuri si coloane. al inregistrarii care la un moment dat poate fi accesata. Termenul de pointer(cursor) de inregistrari.prin parcurgerea inregistrarilor una dupa alta.metoda OpenRecorset este a obiectului Database) :  Sa fie deschis(obligatoriu primul pas). in ordine pana la cea care intereseaza. prin care se va face in continuare referire la el. Cand se lucreaza cu Recordsetul. are un anumit numar de inregistrari. se lucra cu multimi(multimea inregistrarilor dintr-o tabela) pe care se efectuau niste operatii de algebra relationala. Functie de mecanismul de efectuare a acestei operatii sunt doua categorii de metode. denumite Move. operatiile se fac la nivel punctual('ma duc' mai intai pe inregistrarea respectiva pentru a face o prelucrare). se numeste inregistrarea curenta. Inregistrarea pe care se gaseste la un moment dat pointerul de inregistrari.  Sa fie inchis(obligatoriu ultimul pas).plasarea directa pe o inregistrare in functie de un criteriu de cautare. In urma acestei operatii se efectueaza operatiile fizice de sfarsit si se elibereaza toate resursele(variabile. Pentru a putea ajunge la datele dintr-o anumita celula(element). prin lansarea unor metode ale obiectului Recordset(o singura exceptie . si anume: . ceea ce se materializeaza de obicei prin citirea inainte sau inapoi a urmatoarei inregistrari. adica sa fie definit din punct de vedere fizic si sa i se atribuie un nume logic.

Metodele Recordset Find . in citire. prezentate mai sus. a obiectelor campuri(Field) si metodele Recordset: Edit si Update. conform provenientei sale.3. Metoda Recordset folosita: Delete.pozitionare rapida folosind cheia de indexare. Astfel exista 4 tipuri de seturi de inregistrari: . in citire. Un obiect Recordset. care la randul ei poate fi: actualizabila (updatable). Adaugarea unei inregistrari noi. in citire.  Prelucrarea inregistrarii. de exemplu o cerere cu clauza Total sau in care este setata proprietatea Unique Value. campul.10.pozitionare mai lenta. implicita.Metoda Recordset Seek . adica: Modificarea datelor dintr-un camp.2 Tipuri de seturi de inregistrari. a obiectelor campuri(Field) si metodele Recordset: AddNew si Update. neactualizabila In momentul definirii(deschiderii) unui Recordset. a obiectelor campuri(Field) *. y Actualizarea. Se foloseste proprietatea Value. III. nu este updatable). trebuie precizat si tipul acestuia. Nota: Se poate sintetiza ceea ce s-a prezentat la acest punct prin urmatoarea observatie: Accesul nu este permis decat la campurile inregistrarii curente. adica in care se pot actualiza inregistrarile obtinute din executia cererii(campurilor din iesirea cererii li se poate stabili precis originea: tabela. care nu foloseste cheia de indexare. inregistrarea. Se foloseste proprietatea Value. Accesarea unei inregistrari se face in doua scopuri: y Citirea datelor din campurile inregistrarii. Se foloseste proprietatea Value. printr-o cerere din datele mai multor tabele. poate proveni din urmatoarele surse: y y datele unei singure tabele. Stergerea unei inregistrari. ceea ce va permite efectuarea unor numai anumitor operatii asupra sa.

Snapshot(dbSnapshotTable) . dar nu va fi salvat la inchiderea acestuia. Close. Este un obiect temporar care dureaza pana la inchiderea sa prin metoda Recordset.este un string care reprezinta numele tabelei sau cererii de selectie din care se creeaza setul de inregistrari. Obiectul Recordset. Este folosit numai in scopul cautarii sau al afisarii unor date.reprezinta o constanta care specifica tipul setului de inregistrari care se creeaza.Set de inregistrari de tip instantaneu de date .Recordset ce provine din inregistrarile unei singure tabele. Deschiderea unui Recordset se face in felul urmator: Dim DB As Database Dim RS As Recordset Set DB = CurrentDb 'Baza de date locala Set RS = DB. si anume: dbOpenTable . III.Recordset ce provine printr-o cerere neactualizabila din inregistrarile mai multor tabele. Din aceasta cauza se pot deschide mai multe obiecte Recordset. y Tip .Table(dbOpenTable) . Dynaset(dbDynasetTable) .OpenRecordset(Nume. ) in care: y Nume . si care permite actualizari in acestea.Set de inregistrari de tip tabel . se creeaza numai la lansarea metodei OpenRecordset a obiectului Database.Recordset de tip Snapshot. Metoda OpenRecordset. Obiectul Recordset. obiectul Recordset se introduce in variabile de tip Recordset.10.3 Deschiderea unui set de inregistrari. si care permite actualizari in acestea. OpenForwardOnly(dbOpenForwardOnly) . care provin din aceiasi sursa de date(tabela). El este adaugat automat la colectia Recordsets. dar care nu poate fi parcurs decat o data si numai inainte. si care va avea o existenta independenta. va reprezenta practic o structura de tip inregistrari /campuri. In vederea prelucrarilor necesare. care va ocupa un anumit spatiu de memorare. si care nu permite actualizari in acestea.3.Recordset ce provine printr-o cerere actualizabila din inregistrarile mai multor tabele.Set de inregistrari de tip dinamic de date .

10. si ia valoarea True. In parametrul 'nume' se poate introduce direct o instructiune SQL. iar Recordsetul respectiv va functiona mai lent decat in cazul in care ar fi avut la baza un obiect(tabela sau cerere) salvat in baza de date.se poate numai citi. Cateva din cele mai utilizate proprietati ale unui obiect Recordset sunt: y RecordCount . si arata care este tipul Recordsetului. Snapshot. y EOF . si reprezinta numarul de inregistrari ale Recordsetului. III.4 Proprietatile unui set de inregistrari. atunci setul de inregistrari se creeaza pentru primul tip(in ordinea prezentata mai sus) pentru care se poate defini.se poate numai citi. Nota: 1. Pentru tabelele legate din alte baze de date nu se poate folosi tipul Table. Nota: 4. NoMatch . si se pozitioneaza dupa o metoda Seek sau Find. si arata daca Recordsetul este actualizabil.se poate numai citi. La deschidere. daca pointerul de inregistrari incearca sa se plaseze in fata primei inregistrari.3. Type . Daca nu se foloseste. ForwardOnly se creeaza in memoria temporara Access. Updatable . . BOF . Aceasta proprietate va lua valoarea True.dbOpenDynaset dbOpenSnapshot dbOpenForwardOnly Tipul este optional. Tipurile Dynaset. y y y y Nota: Pentru Recordsetul care nu are nici o inregistrare RecordCount=0 si atat EOF cat si BOF sunt True.se poate numai citi. si ia valoarea True. Recordsetul se pozitioneaza automat pe prima inregistrare. daca pointerul de inregistrari incearca sa depaseasca ultima inregistrare.se poate numai citi. Nota: 2. daca este loc. daca in urma metodei respective de cautare nu s-a putut pozitiona pointerul de inregistrari(nu s-a gasit nici o inregistrare care sa satisfaca conditia de cautare). Din aceasta cauza ele sunt mult mai rapide. In acest caz obiectul(tabela sau cerere) creat din aceasta. va fi temporar.se poate numai citi. Nota: 3.

Public Sub Rst_TipRecordset(Optional BazaDate) 'Deschiderea unui Recordset in toate tipurile Dim DB As Database Dim RS As Recordset Dim Tip(4) As Integer Dim Eroare As String Dim i As Integer 'Daca parametrul 'BazaDate' lipseste atunci se lucreaza cu baza de date interna If IsMissing(BazaDate) Then Set DB = CurrentDb Else Set DB = OpenDatabase(BazaDate) End If '---------------------------' Tipuri de seturi de inregistrari Tip(1) = dbOpenTable ' Constanta 1 .(eventual cu metoda MoveLast) Exemplu.Nota: Pentru a citi valoarea corecta a numarului de inregistrari ale unui Recordset este bine ca sa se pozitioneze mai intai pointerul de inregistrari pe ultima inregistrare.pentru exemplul dat numai acest tip nu va fi admis 'Baza de date din alta aplicatie 'Baza de date din aplicatia curenta Tip(2) = dbOpenDynaset ' Constanta 2 Tip(3) = dbOpenSnapshot ' Constanta 4 Tip(4) = dbOpenForwardOnly ' Constanta 8 For i = 1 To 4 .

Close Reia: Next i Sfirsit: Exit Sub Fis: Eroare = 'Nu se poate deschide tipul de recorset ' & Tip(i) & vbCr & _ '--Nr.OpenRecordset('Cerere_B'.10. Tip(i)) On Error GoTo Fis1 RS.RecordCount ' Afiseaza numsrul de inregistrari al Recordsetului RS. vbCritical Resume Reia ' trece la incercarea deschiderii unui alt tip Fis1: MsgBox err & ' .Description.' Daca nu se poate deschide in tipul respectiv se va produce o eroare On Error GoTo Fis Set RS = DB.3.MoveLast ' Se pozitioneaza daca poate pe ultima inregistrare MsgBox RS.5 Accesarea secventiala a unui set de inregistrari.eroare=' & err & ' . Exista 5 metode pentru deplasarea in mod secvential intr-un Recordset: y MoveFirst ± pointerul de inregistrari se muta pe prima inregistrare.Description MsgBox Eroare.' & err.' & err. . vbCritical Resume Reia ' trece la incercarea deschiderii unui alt tip End Sub III.

pozitioneaza pe ea pointerul de inregistrari. Astfel daca: N este pozitiv ± pointerul de inregistrari se muta inainte cu N inregistrari fata de inregistrarea curenta. Se aplica metoda Seek. Deoarece Seek functioneaza numai pe indecsi. Nota: Cand se parcurge secvential un Recordset. trebuie testate proprietatile BOF si EOF. Metoda Seek a unui Recordset. In cazul in care acesta este cheie primara a tabelei numele lui este 'PrimaryKey'. prin doi parametrii de tip string care reprezinta: Operatorul relational al expresiei ce se formeaza cu indexul precizat in etapa anterioara: .Index='NumeIndex' 2. Nota: Pentru tipul de inregistrari ForwardOnly. NumeRecordset.3. III. N=0 . MovePrevious ± pointerul de inregistrari se muta pe inregistrarea anterioara. III.1 Metoda Seek. la fiecare noua pozitionare. de tip string.10.3. Se seteaza proprietatea Index. Aplicarea metodei se face in trei pasi: 1. singura metoda acceptata este MoveNext. Prin aceasta se introduce si expresia de cautare. N este negativ ± pointerul de inregistrari se muta inapoi cu N inregistrari fata de inregistrarea curenta. cauta o inregistrare care sa satisfaca un anumit criteriu si in cazul gasirii acesteia. trebuie sa se refere la un index al tabelei care sta la baza Recordsetului.6 Accesul direct intr-un set de inregistrari.y y y y MoveLast ± pointerul de inregistrari se muta pe ultima inregistrare din Recordset. MoveNext ± pointerul de inregistrari se muta pe urmatoarea inregistrare. pentru a nu se depasi limitele acestuia. cu numele indexului dupa care se doreste efectuarea cautarii. a Recordsetului. este evident ca Recordsetul trebuie sa fie obligatoriu numai de tip 'table'.pointerul de inregistrari nu se modifica.6. Criteriul care se foloseste cu metoda Seek. Move(N) ± pointerul de inregistrari se muta functie de valoarea lui N.10.

separati prin virgula si fara sa fie inclusi intre paranteze.Index = 'PrimaryKey' ' Cauta inregistrarea cu cheia primara = 2 . 3. vbInformation Exit Sub End If ' Seteaza indexul pentru care se face cautarea pe cheia primara RS. Se verifica prin proprietatea NoMatch daca operatia s-a efectuat cu succes(in caz de reusita proprietatea se seteaza pe False). Ea se poate lansa si cu parametrii. dbOpenTable) 'Se verifica ca recordsetul sa aiba inregistrari If RS. Exemplu. 'valoare' Nota: O metoda este similara cu o procedura din punct de vedere al regulilor de sintaxa folosite. pe un camp indexat si pe un camp cheie primara Dim DB As Database Dim RS As Recordset On Error GoTo Fis Set DB = CurrentDb ' Se deschide in tipul Table Set RS = DB. caz in care acestia sunt plasati in continuarea numelui metodei.RecordCount = 0 Then MsgBox 'Nu exista inregistrari'.Seek 'operator_relational'.= > < >= <= Un literal care reprezinta valoarea pe care trebuie sa o aiba in inregistrare indexul respectiv. Public Sub Rst_MetodaSeek() ' Cauta o inregistrare folosind metoda Seek. NumeRecordset.OpenRecordset('Tabela_A'.

' & err.' & RS!N & '. '2' If RS.Index = 'A' ' Cauta inregistrarea cu valoarea 'unu' RS. vbCritical Resume Sfirsit End Sub .' & RS!N & '.Seek '='.' & RS!A End If '___________ ' Seteaza indexul pentru care se face urmatoarea cautare pe campul 'A' RS.NoMatch Then MsgBox 'Nu s-a gasit inregistrarea cautata' Else MsgBox 'Ok .Close Sfirsit: Exit Sub Fis: MsgBox err & ' .RS.Description.NoMatch Then MsgBox 'Nu s-a gasit inregistrarea cautata' Else MsgBox 'Ok . 'unu' If RS.Seek '='.' & RS!A End If RS.

Ea pozitioneaza pointerul pe urmatoarea inregistrare care indeplineste criteriul de cautare.se aplica de obicei dupa ce s-a efectuat o metoda Find. prin folosirea mai multor parametrii valoare(cate unul pentru fiecare camp al indexului) III.2 Metodele FindFirst. Ea pozitioneaza pointerul pe inregistrarea anterioara care indeplineste criteriul de cautare. spre sfarsitul lui y FindPrevious .. dar nu foloseste obligatoriu numai campurile indexate pentru efectuarea operatiei. .pozitioneaza pointerul pe prima inregistrare care indeplineste criteriul de cautare.se aplica de obicei dupa ce s-a efectuat o metoda Find. Se aplica una din metodele Find. spre inceputul lui. FindPrevious. Tipul Recordsetului pentru aceste metode trebuie sa fie obligatoriu Dynaset sau Snapshot. y FindNext . spre sfarsitul lui y FindLast . Deci un index poate fi format nu numai dintr-un singur camp.pozitioneaza pointerul pe ultima inregistrare care indeplineste criteriul de cautare. spre inceputul lui -----------------Aplicarea metodei se face in doi pasi: 1. exista 4 metode de cautare care vor: y FindFirst . La aceasta metoda cautarea porneste de la inregistrarea curenta a Recordsetului. permite introducerea unui criteriu de cautare si in acest caz. La aceasta metoda cautarea porneste de la prima inregistrare a Recordsetului.-----------------Nota: Un obiect index contine asa cum am mai aratat o colectie Fields.10. Este evident ca deoarece cautarea nu se va face folosind numai indecsii durata de executie a acestor metode este mult mai mare decat la metoda Seek. Metoda Seek. y Toate metodele Find folosesc un parametru de tip string prin care se introduce o expresie care reprezinta criteriul de cautare. FindNext.6. La aceasta metoda cautarea porneste de la inregistrarea curenta a Recordsetului. La aceasta metoda cautarea porneste de la ultima inregistrare a Recordsetului. cautand o inregistrare care sa satisfaca un anumit criteriu pentru a se pozitiona pe ea. Deoarece exista posibilitatea ca sa existe mai multe inregistrari care sa satisfaca criteriul introdus.3. Aceste metode functioneaza asemanator ca metoda Seek. FindLast.

Se verifica prin proprietatea NoMatch daca operatia s-a efectuat cu succes(in caz de reusita proprietatea se seteaza pe False). NumeRecordset.Regulile de scriere ale expresiei sunt aceleasi care au fost prezentate la formarea expresiilor din functiile agregate de domeniu.OpenRecordset('Tabela_A'. dbOpenDynaset) 'Se verifica ca recordsetul sa aiba inregistrari If RS.FindFirst | FindLast | FindNext | FindPrevious 'expresie' 2. Set RS = DB. Reamintim ca se pot folosi in aceste expresii orice fel de operatori acceptati in VBA(aritmetici. Public Sub Rst_MetodeFind() ' Cauta toate inregistrarile care indeplinesc 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 inregistrari in tip Dynaset. relationali sau logici) si ca termenii expresiei pot fi si numele de campuri din Recordsetul pe care se face cautarea. Exemplu. vbInformation Exit Sub .RecordCount = 0 Then MsgBox 'Nu exista inregistrari'.

1 Citirea campurilor dintr-un set de inregistrari. Un obiect Recordset contine o colectie de obiecte Fields.7. In aceasta colectie vor fi atatea obiecte cate campuri are Recordsetul respectiv.7 Prelucrarea datelor dintr-un set de inregistrari. vbCritical Resume Sfirsit End Sub III.' & RS!A I=I+1 RS.' & RS!N & '.End If ' Cauta prima inregistrare care are campul 'A' la fel cu _ valoarea introdusa prin InputBox Tp = InputBox('Valoarea care se va cauta pentru Cimpul A') I=0 Criteriu = '[A]=''' & Tp & '''' RS.3.Close Sfirsit: Exit Sub Fis: MsgBox err & ' . III.' & err.FindNext Criteriu ' cauta urmatoarea inregistrare care respecta acelasi criteriu Loop MsgBox 'Nr.10.NoMatch = False 'a gasit o inregistrare cu criteriul introdus MsgBox 'Ok .10.FindFirst Criteriu Do While RS. de inregistrari gasite care au Cimpul A = ''' & Tp & ''' este: ' & I RS. .Description.3.

adica cel mai semnificativ care se poate .OpenRecordset('Tabela_A') 'Se verifica ca recordsetul sa aiba inregistrari If RS.' & RS!A RS.Table ' La deschidere automat Recordsetul se pozitioneaza pe prima inregistrare.EOF ' Ciclul se executa cat timp nu se atinge sfarsitul recordsetului ' Se afiseaza valorile din campuri folosindu-se proprietatea implicita Value.Proprietatea implicita a unui obiect camp este Value care reprezinta valoarea care se gaseste in campul respectiv.RecordCount = 0 Then MsgBox 'Nu exista inregistrari'. Exemplu. vbInformation Exit Sub End If 'Se parcurge recordsetul de la prima la ultima inregistrare. _ Se observa folosirea semnului de calificare (!) pentru a se referi un obiect de tip camp MsgBox RS!N & '. Public Sub Rst_CitireSecveniala() 'Deschiderea unui Recordset si citirea secvensiala a acestuia Dim DB As Database Dim RS As Recordset Dim Eroare As String On Error GoTo Fis Set DB = CurrentDb ' Se deschide in tipul implicit. . Do While Not RS.MoveNext ' Pozitionare pe urmatoarea inregistrare. Ea se poate folosi atat in citire cat si in scriere(pentru a fi modificata). Set RS = DB.

Description. sa respecte conditiile de integritate de domeniu. Pentru fiecare tip de actualizare(modificare.2_1 Modificarea datelor dintr-un camp al unui set de inregistrari.3. si proprietatea Field. in scriere. Recordsetul sa fie deschis in tip Table sau Dynaset.Close ' Optionala Se face automat la inchiderea procedurii in care s-a declartat Recordsetul Sfirsit: Exit Sub Fis: MsgBox err & ' . Pentru ca acest lucru sa fie posibil trebuie ca sa se procedeze in prealabil in felul urmator: . adica in tipurile care accepta efectuarea de actualizari. in primul rand trebuie ca sa se respecte urmatoarele trei conditii: Recordsetul sa fie actualizabil. astfel: y Modificarea efectiva a valorii dintr-un camp al unui Recordset. se efectueaza prin proprietatea Value(implicita) a campului. adaugare.10. exista metode specifice.7. Pentru ca o actualizare sa fie acceptata. Value. existentiala sau referentiala a tabelelor si relatiilor pe care setul de inregistrari este creat III.RecordCount RS. Pentru verificarea acestei conditii se poate folosi proprietatea Updatable(sa fie True). Modificarea datelor dintr-un camp al unei inregistrari dintr-un Recordset se efectueaza folosind metodele Recordset Edit si Update.10.3.2 Actualizarea unui set de inregistrari. vbCritical Resume Sfirsit End Sub III.7.' & err. Actualizarea efectuata.Loop ' Afiseaza numarul de inregistrari al Recordsetului MsgBox 'Numarul de inregistrari = ' & RS. stergere) care se efectueaza asupra datelor dintr-un Recordset.

y Dupa efectuarea modificarii campurilor din inregistrare. aceasta trebuie efectiv rescrisa in Recordset. care permite efectuarea actualizarilor Set RS = DB.RecordCount = 0 Then MsgBox 'Nu exista inregistrari'. Nota: Daca modificarea efectuata nu va respecta proprietatile de integritate setate. Exemplu.pointerul de inregistrari se pozitioneaza pe inregistrarea ale carui campuri se vor modifica. metoda Update nu se va executa si va provoca o eroare de executie. vbInformation Exit Sub End If . prin metoda Update. se lanseaza metoda Recordset Edit. dbOpenDynaset) 'Se verifica ca recordsetul sa aiba inregistrari If RS. Deci modificarea unui camp dintr-o inregistrare. 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 inregistrari in tip Dynaset. se face prin efectuarea acesteia intre metodele Recordset Edit si Update.OpenRecordset('Tabela_A'.

vbInformation Exit Sub End If ' ______Modificarea unui cimp ' Se introduce un criteriu de selectie pentru inregistrarile ce se vor modifica Tp = InputBox('Valoarea care se va cauta pentru Cimpul A') ' Se introduce valoarea cu care se actualizeaza TM = InputBox('Valoarea care se va introduce in Cimpul A') I=0 Criteriu = '[A]=''' & Tp & '''' RS.Edit RS!A = TM On Error GoTo Fis1 ' eroare daca nu se poate face modificarea RS.'Se verifica ca recordsetul sa poata fi modificat If RS.FindNext Criteriu ' cauta urmatoarea inregistrare care respecta acelasi criteriu .NoMatch = False 'a gasit o inregistrare cu criteriul introdus MsgBox 'Inregistrare Veche :' & RS!N & '.Updatable = False Then MsgBox 'Nu se pot efectua modificari'.' & RS!A RS.Update On Error GoTo Fis I=I+1 MsgBox 'Inregistrare Noua :' & RS!N & '.' & RS!A RS.FindFirst Criteriu Do While RS.

vbCritical Resume Sfirsit Fis1: MsgBox 'Eroare Actualizare: ' & vbCr & err & ' . y Se introduc in campurile inregistrarii valorile dorite prin folosirea in scriere a proprietatii Value a acestora.3.Description. si proprietatea Field.10. Value. de inregistrari modificate este: ' & I RS.' & err.Description. Nota: Daca inregistrarea adaugata nu va respecta proprietatile de integritate setate. astfel: y Se pozitioneaza pointerul pe o inregistrare noua. Public Sub Rst_Adaugare() Dim DB As Database Dim RS As Recordset . vbCritical Resume Sfirsit End Sub III. y Se scrie in Recordset inregistrarea noua prin metoda Update. Exemplu.7. metoda Update nu se va executa si va provoca o eroare de executie. Adaugarea unei inregistrari noi intr-un set de inregistrari se efectueaza folosind metodele Recordset AddNew si Update.2_2 Adaugarea unei inregistrari intr-un set de inregistrari.Loop MsgBox 'Nr. prin metoda Recordset AddNew.' & err.Close Sfirsit: Exit Sub Fis: MsgBox err & ' .

OpenRecordset('Tabela_A'. vbInformation Exit Sub End If ' ______Adaugarea unei inregistrari ' Se introduc de la tastatura valorile pentru cimpurile inregistrarii TN = InputBox('Valoarea pentru Cimpul N') TA = InputBox('Valoarea pentru Cimpul A') RS.Update On Error GoTo Fis MsgBox 'Adaugare efectuata' RS.AddNew RS!N = Val(TN) RS!A = TA On Error GoTo Fis1 ' eroare daca nu se poate face adaugarea RS. care permite efectuarea actualizarilor Set RS = DB.Dim TN As String Dim TA As String On Error GoTo Fis Set DB = CurrentDb ' Se deschide setul de inregistrari in tip Dynaset. dbOpenDynaset) 'Se verifica ca recordsetul sa poata fi modificat If RS.Close .Updatable = False Then MsgBox 'Nu se pot efectua modificari'.

vbCritical Resume Sfirsit End Sub III.10.3. astfel: y y Se pozitioneaza pointerul pe inregistrare care se va sterge. vbCritical Resume Sfirsit Fis1: MsgBox 'Eroare Adaugare: ' & vbCr & err & ' .2_3 Stergerea unei inregistrari dintr-un set de inregistrari. Exemplu.' & err. Public Sub Rst_Stergere() Dim DB As Database Dim RS As Recordset Dim I As Integer Dim Tp As String Dim Criteriu As String .Sfirsit: Exit Sub Fis: MsgBox err & ' .Description. Se executa metoda Recordset Delete. Nota: Daca inregistrarea stearsa va provoca o eroare de integritate referentiala(de exemplu se incearca stergerea unei inregistrari dintr-o tabela parinte.' & err. care are copii printr-o relatie cu integritatea referentiala setata dar nu si cu stergere in cascada) metoda Delete nu se va executa si va provoca o eroare de executie.7.Description. Stergerea unei inregistrari dintr-un set de inregistrari se efectueaza folosind metoda Recordset Delete.

vbOKCancel) = vbOk _ Then .RecordCount = 0 Then MsgBox 'Nu exista inregistrari'.On Error GoTo Fis Set DB = CurrentDb ' Se deschide setul de inregistrari in tip Dynaset. dbOpenDynaset) 'Se verifica ca recordsetul sa aiba inregistrari If RS.FindFirst Criteriu Do While RS.' & RS!A. vbInformation Exit Sub End If ' ______Stergerea unor inregistrari ' Se introduce un criteriu de selectie pentru inregistrarile ce se vor sterge Tp = InputBox('Valoarea care se va cauta pentru Cimpul A') I=0 Criteriu = '[A]=''' & Tp & '''' RS.OpenRecordset('Tabela_A'. vbInformation Exit Sub End If 'Se verifica ca recordsetul sa poata fi modificat If RS. care permite efectuarea actualizarilor Set RS = DB.Updatable = False Then MsgBox 'Nu se pot efectua modificari'.NoMatch = False 'a gasit o inregistrare cu criteriul introdus If MsgBox('Inregistrarea care se sterge:' & RS!N & '.

De exemplu daca este necesar introducerea unor parametrii in cerere direct din cod.' & err.Close Sfirsit: Exit Sub Fis: MsgBox err & ' . .FindNext Criteriu ' cauta urmatoarea inregistrare care respecta acelasi criteriu Loop MsgBox 'Nr.3.Description. O cerere de selectie. vbCritical Resume Sfirsit Fis1: MsgBox 'Eroare Stergere ' & vbCr & err & ' .On Error GoTo Fis1 ' eroare daca nu se poate face stergerea RS.Delete On Error GoTo Fis I=I+1 End If RS. definind ca obiect al setului de inregistrari cererea(ca in exemplele de pana acum) y Executand in prealabil anumite actiuni asupra cererii. poate sa fie obiectul de intrare a unui set de inregistrari in doua moduri: y Direct.11 Seturi de inregistrari definite pe cereri. de inregistrari sterse este: ' & I RS. vbCritical Resume Sfirsit End Sub III.' & err.Description.

Exemplu.EOF ' se parcurge secvential RS MsgBox 'Inregistrare selectata:' & RS!N & '.QueryDefs(NumeCerere) ' se dau valori parametrilor cererii QRY. Public Sub Rst_Query() ' Creaza un recordset pe baza unei cereri de selectii cu parametrii 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 aplicatia curenta ' Se introduce cererea in variabila obiect QRY Set QRY = DB.RecordCount = 0 Then MsgBox 'Nu exista inregistrari selectate'. ca in urmatorul exemplu. vbInformation Exit Sub End If Do While Not RS.Parameters('Numar') = '2' Set RS = QRY.OpenRecordset ' Se defineste recordsetul pe cerere If RS.Crearea Recordsetului in acest caz se face aplicand metoda OpenRecordset a cererii.MoveNext Loop End Sub .' & RS!A RS.

RecordCount = 0 Then MsgBox 'Nu exista inregistrari'.III. dupa ce asupra acestuia se efectueaza anumite prelucrari. Nota: Pentru sortarea unui Recordset. nu se poate sorta. vbInformation . Exemplu.Sort = 'cheia_sortare_1 [Asc] | Desc « ' Asa cum se observa se permite sortarea dupa mai multe chei . Crearea Recordsetului in acest caz se face aplicand metoda OpenRecordset a primului Recordset. se foloseste proprietatea Sort a Recordsetului. care are urmatoarea forma: recordset. dbOpenDynaset) 'Se verifica ca recordsetul sa aiba inregistrari If RSS. Aceasta metoda se aplica de obicei daca se doreste sortarea sau filtrarea in prealabil a setului de inregistrari.3. in ordine ascendenta(implicit) sau descendenta.OpenRecordset('Tabela_A'.12 Seturi de inregistrari definite pe alte seturi de inregistrari. Un set de inregistrari poate fi definit pe un alt set de inregistrari. folosit pentru sortarea unui Recordset. Public Sub Rst_Sortare() 'Deschiderea unui Recordset si sortarea acestuia Dim DB As Database Dim RS As Recordset Dim RSS As Recordset On Error GoTo Fis Set DB = CurrentDb ' Se deschide in tipul Dynaset / Nu este permisa sortarea pe tipul Table Set RSS = DB. ca in urmatorul exemplu. Nota: Recordsetul de tip Table.

MoveNext ' Pozitionare pe urmatoarea inregistrare.Exit Sub End If RSS. . pe primul care e sortat 'Se parcurge recordsetul sortat de la prima la ultima inregistrare.3.13 Accesul la obiecte externe de date.pentru obiecte din baze de date Access. Exista doua metode de realizarea a acestui lucru: y y Din meniu prin comanda File | Get External Data Prin metodele obiectului DoCmd: DoCmd.RecordCount Sfirsit: Exit Sub Fis: MsgBox err & ' .EOF ' MsgBox RS!N & '. vbCritical Resume Sfirsit End Sub III. Loop ' Afiseaza numarul de inregistrari al Recordsetului MsgBox 'Numarul de inregistrari = ' & RS.TransferDatabase . In Access este posibil ca sa se foloseasca obiecte de date(de tip tabel) de o multitudine de tipuri create in alte aplicatii.Sort = 'N Desc' ' Se sorteaza recordsetul dupa cheia N in ordine descrescatoare Set RS = RSS. Fox. Aceasta se poate face ori prin legare.OpenRecordset ' Se deschide al doilea recordset. Do While Not RS.Description. DBase etc. ori prin incapsulare.' & err.' & RS!A RS.

pentru foi de calcul din MS. de export din Access a obiectelor acestuia.pentru date introduse sub forma de inregistrari (cu separatori sau de latime fixa pentru stabilirea campurilor(coloanelor) in fisiere de tip text).TransferText . Excel.TransferSpreadsheet . Nota: Si operatia inversa. .DoCmd. DoCmd. in diferite tipuri de baze de date este posibila.