Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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).
Evenimente - conditiile care determina momentul cand se lanseaza o anumita actiune(de
exemplu Click pe un obiect).
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 printr-
un 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.
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'.
Dim ST As String
Dim i As Integer
Dim N As Integer
ST = ''
N = Me.Controls.Count - 1
For i = 0 To N 'Primul element dintr-o colectie are indexul 0
Next i
End Sub
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:
Instante ale claselor de obiecte aflate in bibliotecile standard ale pachetului Access: DAO,
Access Application si VBA.
Instante ale claselor de obiecte proprii(utilizator), create special de proiectant(prin modulele
de clase de obiecte)
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.
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:
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.
Fie folosind tot metoda prezentata, utilizand calificarea obiectului cu colectia din care face
parte:
Fie folosind indexarea colectiei cu un numar care reprezinta pozitia in colectie a obiectului
respectiv(asemanator cu referirea unui element dintr-un tabel).
Numerotarea elementelor unei colectii de obiecte se porneste de la 0(zero).
Fie la fel ca mai sus dar folosind - ca pe un sir de caractere - numele obiectului in loc de
index
Observatia 1. Daca se doreste sa se faca referire in codul VBA la formularul sau raportul
'parinte', fara a se mai face descrierea structurii ierarhice superioare, se poate folosi cuvantul
cheie ME.
Observatia 2. Semnele care se pot folosi pentru a se specifica un obiect sunt parantezele drepte
<[nume_obiect]>. Ele sunt folosite obligatoriu atunci cand in numele obiectului se gasesc spatii.
urmat de numele proprietatii sau metodei, folosind semnul de calificare 'punct'.
Utilizarea proprietatii unui obiect, in codul VBA, se face la fel ca si cum s-ar lucra cu o
variabila obisnuita, in citire sau scriere.
Daca se doreste atribuirea unei valori proprietatii unui obiect, atunci aceasta se introduce
in partea din dreapta a unei instructiuni de atribuire; Exemplu de scriere a proprietatii Caption a
unui formular: Me.Caption='Nume Nou Form' sau a proprietatii Index, a unui Recordset:
Rs.Index='PrimaryKay'
Daca se doreste citirea proprietatii unui obiect, atunci aceasta va face parte dintr-o
expresie obisnuita. Exemplu de citire a proprietatii Caption a unui formular : MsgBox 'Numele
formularului este: ' & Me.Caption.
La utilizarea proprietatilor unui obiect trebuie sa se tina cont de urmatoarele doua restrictii:
Ca si o variabila, o proprietate este de un anumit tip de date, de care trebuie tinut cont in
utilizarea ei.
Utilizarea metodelor unui obiect, in codul VBA, se face la fel ca si cum s-ar lucra cu o
procedura, folosindu-se metoda de apelare fara Call, prin scrierea sub forma unei instructiuni a
metodei, urmata, daca este cazul, de parametrii acesteia(fara a fi introdusi intre paranteze)
separati prin virgula. Exemplu de apelare a unei metode cu doi parametrii de tip string: Rs.Seek
'=', 'unu'
Modelul ierarhic Application, prin care se realizeaza instantele obiectelor si colectiilor care
constituie interfata utilizator a unei aplicatii, este aratat succint in figura de mai jos.
Forms![vinzari].RecordSource - se
face referire la proprietatea Record Source
al formularului deschis 'vinzari'.
Parantezele drepte pot fi scoase. Observati
punctul, semnul de calificare pentru o
proprietate sau metoda.
Forms!('vinzari')!valoare - identic cu mai sus, dar se foloseste alta posibilitate de precizare
a unui obiect dintr-o colectie si anume printr-un string care reprezinta numele obiectului.
Forms!(0)!valoare - identic cu mai sus, 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, primind indexul 0 in cadrul colectiei Forms)
Me.FilterOn - se refera proprietatea FilterOn a formularului in care se gaseste codul VBA.
Exemplu. Exemplul prezentat anterior, este reluat, dar executia lui nu se mai face chiar din
formular, ci extern, din modulul de cod al aplicatiei. Din el se observa in special cum
functioneaza colectia Forms, a formularelor deschise.
Dim i As Integer
Dim N As Integer
ST = ''
On Error GoTo Fis ' Daca nu este nici un formular deschis se produce eroare
N = Forms(0).Controls.Count - 1
On Error GoTo 0
Next i
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
End Sub
------------------
In programare variabilele sunt elementele prin care se fac referiri la date. Deoarece in
programarea la nivel de obiect, entitatea care ia locul datelor este obiectul, este necesara
definirea unor variabile specifice, variabile obiect, prin care sa se poata manipula mai eficient
obiectele.
O variabila obiect este asemanatoare unei variabile ce contine un anumit tip de date. Declararea
ei se face cu aceleasi instructiuni(Dim, Public, Private sau Static) ca si la celelalte variabile.
Desi lucrul cu variabile obiect nu este deosebit de cel cu variabilele obisnuite, totusi ele au o
caracteristica specifica si anume, intr-o variabila obiect nu se va gasi efectiv obiectul respectiv,
ci o referire(adresa) la acesta.
Astfel, daca avem o variabila de tip integer, AI, si executam AI=3, atunci efectiv in AI, vom
avea pe 16 biti data(informatia) numerica 3. Daca mai declaram una BI si o facem egala cu AI,
vom avea si in aceasta numarul 3. Acum, executand AI=5, se va schimba valoarea din AI, dar
cea din BI va ramane neschimbata. AI si BI au deci existente independente.
Nu acelasi lucru se intampla si in cazul variabilelor obiect. Daca (vezi urmatorul exemplu care se
va da) avem o variabila obiect FM1, si introducem in ea un obiect, formularul
F_CDialogContainer, atunci in FM1, vom avea nu formularul respectiv ci o referire(adresa) la
aceasta. Tot asa daca mai declaram o variabila obiect, FM2, si introducem in ea ce se gaseste in
FM1. Vom avea acum doua variabile obiect care vor referi acelasi obiect. Sa modificam acum o
proprietate a lui FM1. Daca vom citi aceiasi proprietate din FM2, vom observa ca modificarea
este efectuata si in acesta. Deci, cele doua variabile obiect nu au existente independente, ele
referind practic acelasi obiect.
Evident, in anumite prelucrari, acest lucru are importanta(ca in exemplul). Totusi in majoritatea
prelucrarilor manifestarea variabilelor obiect este similara cu a celor clasice.
Variabila declarata in acest fel, este o variabila obiect generica, deoarece in ea se poate
introduce orice obiect.
Astfel pentru obiectele provenite din biblioteca Application Access, exista tipuri de variabile
obiect:
Controls - pentru colectia tuturor controalelor dintr-un formular sau raport;
etc.
Deoarece controalele, la randul lor provin din clase diferite de obiecte, exista pentru fiecare tip
din acestea, variabile obiect specifice. Astfel mai sunt pentru controale urmatoarele tipuri
specifice de variabile obiect:
etc.
------------------
Declararea unei variabile obiect specifice se face folosind numele clasei sau colectiei care va fi
referita de variabila respectiva.
Diferenta dintre utilizarea unei variabile obiect specifice sau generice, se refera la urmatorul
aspect:
La declararea unei variabile obiect generice, sistemul nu stie ce fel de obiect va fi in aceasta.
Acest lucru se va cunoaste la prima incarcare cu un obiect al variabilei. In acest moment, se va
configura variabila obiect cu proprietatile si metodele specifice tipului de obiect respectiv. Deci
aceasta configurare este realizata in partea de executie a aplicatiei
La declararea unei variabile obiect specifice, sistemul stie de la inceput care sunt proprietatile si
metodele tipului de obiect respectiv. Deci configurarea variabilei este realizata in partea de
compilare a aplicatiei si nu in cea de executie. Din aceasta cauza, executia cu acest tip de
variabile este mai rapida
Din cele prezentate se deduce ca este indicata utilizarea variabilelor obiect specifice.
Nota: Desi nu s-a folosit in prezentare decat forma instructiunii Dim, pentru declararea
variabilelor obiect si celelalte declaratii si anume Public, Private sau Static sunt valabile si
functioneaza la fel ca la variabilele clasice.
Instructiunea de atribuire pentru variabilele clasice este var = expresie. Totusi forma completa a
acesteia este Let var = expresie, cuvantul Let, implicit introducandu-se pentru a arata ca este
atribuita o valoare unei variabile clasice.
Pentru variabilele obiect, la care atribuirea consta practic in crearea unei referinte catre un obiect,
este obligatorie folosirea la instructiunea respectiva a cuvantului cheie SET.
in care expresie obiect este o expresie al carui rezultat este un obiect.
O variabila obiect are nevoie de un spatiu(memorie) de lucru pentru a functiona. Acesta este
eliberat automat, ca la orice variabila, la terminarea modulului in care a fost declarata variabila
obiect.
Daca totusi se doreste eliberarea imediata a spatiului ocupat de o variabila obiect se foloseste
instructiunea:
Exemplu.
Dim ST As String
On Error GoTo Fis ' Daca nu este nici un formular deschis se produce eroare
Set FM1 = Forms(0) ' Var. obiect FM1, va contine referinta catre primul formular deschis
On Error GoTo 0
Set FM2 = Forms(0) ' Var. obiect FM2, va contine aceaiasi referinta ca variabila FM1
MsgBox FM2.Caption ' Schimbarea se face practic in obiectul referit. Deci si in FM2
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
End Sub
III.1.6.4 Crearea unei instante noi pentru o clasa de obiecte. Cuvantul cheie NEW.
Cuvantul cheie New, se poate folosi atat la declararea unei variabile obiect cat si la instructiunea
de atribuire Set.
Efectul acestuia se manifesta numai la clasele de obiecte create prin modulele de cod ale
aplicatiei. El produce crearea unei noi instante pentru clasa respectiva, adica practic al unui
spatiu separat de existenta pentru variabila respectiva.
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, un control nou intr-un
formular)
In primul exemplu din acest capitol, s-a aratat cum pot fi parcurse cu o instructiune FOR
obisnuita obiectele unei colectii, folosindu-se proprietatea Count a colectiei pentru stabilirea
numarului de cicluri necesar.
Acelasi lucru se poate face mai eficient cu forma speciala a instructiunii For…Each:
[instructiuni]
[Exit For]
[instructiuni]
Next var_obiect
------------------
Variabila obiect folosita, trebuie sa fie compatibila cu tipul colectiei specificate dupa
cuvantul cheie IN.
Functionarea buclei For consta in faptul ca la fiecare iteratie, variabilei obiect, var_obiect, i se
va atribui pe rand cate un element al colectiei specificate.
Deci instructiunea For…Each, va avea atatea cicluri cate obiecte contine colectia specificata in
instructiune.
Exemplu.
Dim FM As Form
Dim ST As String
ST = ''
Next
Else
MsgBox 'Nici un formular nu este deschis' ' Nu s-a executat nici un ciclu din ForEach
End If
End Sub
------------------
Nota: Instructiunea For Each se poate folosi si pentru variabile de tip tablou (Array).
III.2 Utilizarea in Access a obiectelor provenite din clase
externe. Folosirea controalelor standard Windows.
III.2.1 Utilizarea intr-o aplicatie a obiectelor create in alte aplicatii.
Platforma Windows, permite utilizarea intr-o aplicatie(numita client) a obiectelor provenite din
alte aplicatii(numite server).
Metoda OLE, permite ca intr-o aplicatie client sa se foloseasca obiecte provenite dintr-o
aplicatie server, prin lansarea acesteia chiar in aplicatia client, in scopul manipularii obiectului
respectiv.
Lansarea aplicatiei server prin care a fost creat obiectul, se face de obicei prin dublu click pe
acesta(sau din meniul contextual al obiectului).
Evident, in cazul metodei OLE, este necesar ca aplicatia server sa fie instalata pe sistemul de
calcul in care se utilizeaza aplicatia client.
Exista doua forme de implementare a acestei metode, functie de locul unde va fi memorat
obiectul respectiv, si anume:
Obiectele create prin metoda Automation, se numesc ActiveX. Ele pot fi controale sau biblioteci
de obiecte, si sunt definite de clasele de obiecte aflate sau create de aplicatiile server.
In Access exista doua functii prin care se pot folosi in VBA, obiecte ActiveX si anume:
CreateObject, prin care se pot crea noi instante ale unui ActiveX.
GetObject, prin care se poate utiliza un obiect ActiveX, creat deja si aflat intr-un fisier.
Aplicatiile MS Office: Access, Excel, Word etc., ofera sub forma de ActiveX obiectele din
bibliotecile standard. Deci o aplicatie Excel poate fi considerata ca un obiect ActiveX, si utilizata
intr-o aplicatie Access.
Evident pentru utilizarea unui obiect extern, este necesara cunoasterea structurii acestuia, a
proprietatilor, metodelor si evenimentelor sale. In Access, structura unei biblioteci de obiecte se
poate afla prin comanda View | Object Browser.
Totusi aplicatiile MS Office nu pot crea clase noi de obiecte care sa furnizeze in exterior
obiectele sub forma unor ActiveX. De exemplu in Access, se pot crea clase noi de obiecte, dar
utilizarea obiectelor provenite din acestea este numai interna aplicatiei.
Dim BD As Database
Do ' Se stabileste pozitia ultimului '', care delimiteaza directorul unde este fisierul
If i = 0 Then Exit Do
j=i
Loop
End Sub
------------------
Microsoft Visual Basic, este un produs care permite si crearea de clase noi de obiecte, care sa-si
ofere obiectele sub forma unor ActiveX(controale, biblioteci) aplicatiilor client.
In cele ce urmeaza ne vom referi la utilizarea in aplicatiile client(Access) a obiectelor create din
clase de obiecte externe, prin folosirea standardului Automation.
La proiectarea unui formular(sau raport) Access, implicit, pe bara cu instrumente sunt plasate
cele mai utilizate controale folosite, Text Box, Combo Box, Label, Option Button, Command
Button, etc, care sunt livrate in pachetul Access.
Totusi, realizarea standardizata a acestor controale de tipul unor ActiveX, prin tehnologia
Automation, permite utilizarea intr-o aplicatie client, a tuturor controalelor provenite din clase de
obiecte, indiferent de firma producatoare sau de aplicatia server in care au fost realizate.
Controalele ActiveX, se gasesc de obicei intr-un fisier cu extensia .OCX, in directorul
C:WindowsSystem. Simpla plasare a acestora pe discul calculatorului, nu permite insa folosirea
lor de catre aplicatia client.
Pentru utilizarea unui control ActiveX, este necesar ca pentru acesta sa se creeze o referinta in
aplicatia Access(sau alta aplicatie client).
Operatia de creare intr-o aplicatie client a unei referinte catre un obiect extern, in vederea
utilizarii acestuia se mai numeste inregistrarea obiectului.
In Access, inregistrarea unui ActiveX, se face prin comanda: Tools | ActiveX Controls,
prezentata in figura alaturata.
Nota: Asa cum am mai aratat, Access foloseste in principal 3 biblioteci, DAO, ACCESS,
VBA. Totusi se pot folosi(cu aceiasi tehnologie, Automation, ca si la controalele ActiveX) si alte
biblioteci create de aplicatii server.
Pentru utilizarea acestora, dupa copierea fisierului cu biblioteca (de obicei cu extensia .OLB sau
.DLL) in acelasi director, C:WindowsSystem, trebuie creata referinta printr-o comanda similara,
Tools | References.
Nota: Atat controalele cat si bibliotecile ActiveX, sunt considerate niste aplicatii independente.
Utilizarea lor impune aceleasi restrictii privind drepturile de folosire(licenta) ca si la orice alt
produs.
Dupa inregistrare, introducerea intr-un formular(raport) a unui control ActiveX, se poate face in
doua feluri:
1- Prin comanda 'Insert ActiveX Controls', lansata ori de pe bara cu instrumente ori din
meniul Access.
Din fereastra din dreapta, Commands, se trage(Drag and Drop) cu mouse-ul controlul
respectiv, pe bara de instrumente.
Intervalul, denumit rangul controlului, care stabileste valorile extreme, minima si maxima,
ale evolutiei procesului respectiv. Deci el defineste intreaga durata a operatiei.
Pozitia curenta a controlului, reprezentata printr-o valoare numerica aflata in intervalul
definit de rangul controlului, care stabileste pozitia relativa pe care o are 'clepsidra' in control,
adica cat din suprafata acestuia este umpluta(zona albastra din figura).
------------------
Aceste valori sunt introduse prin proprietatile cele mai semnificative ale controlului
ProgressBar:
Value - defineste valoarea pozitiei curente a controlului ProgressBar. Daca valoarea
introdusa depaseste rangul, atunci se va produce o eroare de executie.
Exemplu. Mai jos se prezinta codul aflat in formularul F_ ProgressBar, din fisierul
DAO.Mdb.
Acesta simuleaza printr-un control ProgressBar, PBar, functionarea unui cronometru, care va fi
initializat cu o valoare introdusa in caseta de text, CTimp si va porni automat dupa introducerea
acesteia.
Figura prezentata la inceputul acestui modul este cea a formularului in timpul executiei sale.
Option Explicit
End Sub
------------------
Timp = Me!CTimp
Else
End If
End Sub
------------------
End If
End Sub
------------------
Nota: Controlul ProgressBar, face parte din grupul de controale ActiveX, care se gasesc in
fisierul COMCTL32.OCX, care face parte din pachetul de distributie al pachetului Visual Basic.
Configurarea controlului se face prin setarea unor proprietati ale acestuia, dar evident inainte de
lansarea metodei Action.
Proprietatile cele mai utilizate in folosirea controlului in operatiile de salvare /deschidere de
fisiere sunt:
Title - se introduce un text care se va afisa in partea de sus a controlului(zona albastra de
titlu a ferestrei);
InitDir - reprezinta calea care va indica directorul al carui continut se vizualizeaza. Aceasta
va fi afisata in zona Look in
DefaultExt - este o extensie care va fi intoarsa daca nu se specifica in mod explicit tipul
fisierului.
Filter - prin acesta se configureaza caseta Files of Type, care va controla ce fisiere vor fi
afisate din directorul selectat.
2-Un nume de fisier(cu extensie) in care sunt permise caracterele generice (*,?) si care va genera
o multime de nume care vor constitui un filtru pentru fisierele care se afiseaza. De exemplu
perechea :
' Toate tipurile Access | *.md? ', va determina afisarea tuturor fisierelor care au extensia din 3
caractere dintre care primele doua sunt 'MD'.
FileName - corespunde numelui introdus in caseta File Name a controlului. Este folosit atat
ca parametru de intrare(daca se doreste o initializare a casetei) dar in special ca parametru de
iesire, deoarece aceasta proprietate va contine la iesire numele complet(cu cale si extensie) ales
de utilizator prin folosirea controlului.
Asa cum am mai aratat metoda controlului este Action*. Exista 5 forme ale controlului
specific pentru anumite operatii si anume:
Action = 1; Open - se foloseste de obicei pentru preluarea din fereastra Windows Explorer,
a unui nume complet de obiect, de obicei fisier, asupra caruia se vor efectua anumite prelucrari in
citire;
Action = 2; Save - se foloseste de obicei pentru introducerea unui nume complet de fisier
(nou sau existent) care va fi creat(sau eventual rescris daca exista deja);
Action = 3; Color - se foloseste pentru aflarea codului unei anumite culori selectionate
dintr-o lista(de exemplu cu care se pot configura dinamic culorile unui control);
Action = 4; Font - 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);
Open (Save) - care face ca proprietatea FileName, sa se configureze corespunzator, adica
calea afisata + numele introdus + extensia implicita (daca numele nu o contine explicit) sau
Cancel** - care face ca proprietatea FileName, sa nu se modifice. Acelasi lucru se produce
daca se inchide fereastra prin comanda Close de inchidere a ferestrei - butonul (X) din coltul
dreapta sus.
Explicatie. * Action, asa cum se vede si din utilizarea ei, este o proprietate. Totusi ea avand o
actiune in momentul setarii ei(vizualizarea controlului in una din cele 5 forme specificate),
practic se comporta ca o metoda.
Versiunile mai noi ale controlului au introdus 5 metode, care se pot folosi in locul lui Action.
Aceste metode sunt: ShowOpen, ShowSave, ShowColor, ShowFont, ShowPrinter.
Explicatie. ** Daca se iese din controlul Common Dialog, prin butonul Cancel, se poate
provoca aparitia unei erori de executie specifice, cu codul 32755, daca in prealabil se seteaza
proprietatea acestuia CancelError cu True.
------------------
Daca functia intoarce NULL atunci s-a iesit prin butonul Cancel din Common Dialog
'--------------------------------------------------------------------------------------------------------------------
Me!CD.DefaultExt = 'Mdb'
Me!CD.InitDir = ''
2- Multimea numelor care se vor selectiona prin folosirea caracterelor generice (*) si (?)
Action = 1 - Open _
Action = 2 - Save _
Action = 3 - Color _
Action = 4 - Font _
Action = 5 - Print
Daca se intoarce un string gol('') atunci s-a iesit prin apasarea pe Cancel
Else
CitireCD = Me!CD.FileName
End If
End Function
------------------
Nota: Controlul Common Dialog, se gaseste in fisierul COMDLG32.OCX, care face parte din
pachetul de distributie al pachetului Visual Basic.
III.3 Obiecte pentru acces la date - Data Access Objects –
DAO.
III.3.1 Structura DAO.
Modelul DAO contine toate colectiile de obiecte si obiectele bazei de date, precum si o serie de
rutine, constante, tipuri de date, help-uri, etc., necesare manipularii acestora.
Structura acesteia este data in figura de mai jos. Ea se refera la baza de date din fisierul
DAO.mdb
In primul rand modelul DAO are o structura ierarhic arborescenta, al carui nivel superior il
constituie obiectul DBEngine. Acesta este deosebit fata de celelalte obiecte din modelul DAO.
El este singular si nu apartine nici unei colectii, fiind tratat ca o exceptie.
Fiecare obiect din structura DAO face parte dintr-o colectie de obiecte. De asemenea el contine la
randul sau una sau mai multe colectii de obiecte.
Exemplu. Obiectul Tabela_A, este un obiect de tip TableDef, care face parte din colectia
TableDefs, a bazei de date locale a aplicatiei DAO.mdb. El contine doua colectii de obiecte,
Fields si Indexes.
------------------
Obiectele(cu exceptia celor din colectia Errors) au proprietatiProperty care sunt constituite
in colectia de proprietati a obiectului respectiv - Properties.
Fiecare obiect are o proprietate implicita. De obicei aceasta este proprietatea Value.
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. De asemenea cu metoda
Delete se pot sterge obiecte din colectii
Unele obiecte sunt create deja (TableDef de exemplu) si se folosesc ca atare indicandu-se
numele lor(cu regulile obisnuite de calificare), pe cand altele(Database sau Recordset), ca sa fie
folosite, mai intai trebuie deschise cu metode de tip Open.
Obiectele care se deschid au metode de inchidere Close. Totusi acestea se pot inchide si automat,
atunci cand se termina modulul in care au fost declarate.
VBA va contine pentru toate tipurile de colectii, tipuri de date care au chiar numele colectiei.
(De exemplu se pot crea pentru colectia care contine structura tuturor tabelelor din baza de date,
variabile de tip TableDefs.)
De asemenea, pentru obiectele care apartin unei colectii, VBA are alte tipuri de date care au tot
numele colectiei, dar la singular. (De exemplu se poate folosi o variabila de tip TableDef, pentru
a se introduce structura unei tabele).
DBEngine, asa cum am aratat este obiectul din varful modelului ierarhic arborescent DAO.
Folosirea lui intr-o aplicatie Access pentru referirea obiectelor din DAO, este optionala, el fiind
considerat implicit.
DBEngine contine intreaga structura DAO. Din alte aplicatii care au implementata tehnologia de
transfer de date Automation (de exemplu: MS Excel, MS Word, Visual Basic etc.) daca se doreste
folosirea unei baza de date Access, este obiectul catre care trebuie facuta aceasta operatie.
DAO poate functiona in doua medii specifice unor anumite tipuri de baze de date, si anume:
Microsoft Jet Workspace, care permite folosirea motorului Microsoft Jet, in care se pot
utiliza baze de date Access(fisiere .mdb) sau surse ISAM : FoxPro, DBase, Paradox, Lotus.
In felul acesta se pot crea aplicatii care pot 'lega' mai multe tipuri de baze de date.
ODBCDirect Workspace, prin care se pot accesa servere specializate de baze de date(de
exemplu Microsoft SQL) prin metoda ODBC(Open Data Base Connectivity).
Aplicatii server/client. Metoda de realizare a unei aplicatii, in care cereri sau proceduri sunt
formulate de aplicatia client, urmand ca executia lor sa se faca pe serverul de aplicatie, care va
contine baza de date(back-end server).
Exemplu. Presupunem ca avem o baza de date(o colectie de date, specifice unei anumite
activitati) si niste programe(aplicatii) care gestioneaza datele respective, adica le
actualizeaza(adaugari, stergeri sau modificari) sau extrag informatiile necesare derularii
activitatii respective.
Astfel putem avea o companie de aviatie si pentru rezervarea locurilor la un zbor, mai multe
agentii ale acesteia, raspandite geografic, trebuie sa stie precis care este starea ocuparii locurilor,
iar in cazul unei noi rezervari, sa informeze imediat acest lucru.
Evident trebuie sa avem o retea de calculatoare, cu baza de date a zborurilor plasata pe un anumit
calculator, de unde sa fie accesata 'on line', de clienti(in special agentiile de turism).
In primul caz, al serverului de fisiere, vom plasa pe un server baza de date, iar pe toate
statiile de lucru de la agentii, programele aplicatiei. O cerere de prelucrare se va desfasura in
felul urmator: se vor aduce prin retea, de la serverul cu datele la statia de lucru, toate informatiile
de la toate zborurile companiei, aici se vor extrage datele de la zborul care intereseaza, dupa
care, daca s-a facut o rezervare, va fi trimis acest lucru imediat la serverul de date. Observam ca
pe retea se vor transmite atat informatii utile cat si cele care nu sunt necesare la un moment dat.
O astfel de aplicatie, se numeste aplicatie client.
In al doilea caz, al serverului de aplicatii, in afara bazei de date, pe server, vom avea si o
parte din programele aplicatie si anume cele care acceseaza direct baza de date. La o statie de
lucru - unde exista cealalta parte a programelor aplicatiei si anume interfata cu utilizatorul - o
cerere de prelucrare(datele despre un zbor) va fi trimisa serverului de aplicatii. Acesta va efectua
extragerea din baza de date numai a informatilor necesare, pe care le va trimite pe retea inapoi
utilizatorului. Observam in acest caz, reducerea substantiala a informatiei transmise prin retea,
ceea ce face aplicatia mult mai performanta, chiar daca este mult mai complexa. O astfel de
aplicatie se numeste server/client.
------------------
Implicit, DAO are un spatiu de lucru, #Default Workspace# de tip Microsoft Jet, in care este
plasata si baza de date locala.
Observatia 3. Cand se face referire la baza de date locala, referirea obiectelor poate sa nu
contina nici DBEngine nici spatiul de lucru - Workspaces(0), deoarece amandoua sunt implicite.
Prin metoda DBEngine, CreateWorkspace, se pot crea si alte obiecte Workspace, ce pot fi
atasate in memorie colectiei Workspaces prin metoda Append.
Exemplu. De creare a doua obiecte Workspace, unul de tip Microsoft Jet, celalalt
ODBCDirect si de vizualizare a proprietatilor acestora.
Sub Prop_Workspace()
Dim WS As Workspace
- Microsoft Jet _
-ODBCDirect
Workspaces.Append WS2
On Error Resume Next ' ignora erorile care pot aparea. Vezi colectia Errors
MsgBox ' Proprietatea :' & PR.NAME & ' = ' & PR.Value
Next PR
End If
Next WS
End Sub
Nota: Acest exemplu ca si celelalte din cadrul acestui modul se gasesc in fisierul DAO.mdb
------------------
Un obiect Workspace, contine 3 colectii de obiecte, si anume:
Databases - care va contine unul sau mai multe obiecte Database, in fiecare putandu-se
deschide cate o baza de date, locala sau din afara.
Users si Groups, prin care se implementeaza sistemul de protectie al spatiului de lucru.
Aceste obiecte nu vor fi prezentate in acest modul.
Colectia Errors, functioneaza in contextul sistemului general de erori implementat in VBA, care
va fi prezentat in cele ce urmeaza.
Butonul End - se opreste executia codului si se re initializeaza toate variabilele aplicatiei.
Este evident ca sunt sanse mici ca aplicatia sa poata fi reluata de utilizator in conditii corecte.
Butonul Debug - se va afisa codul de program care a generat eroarea, 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, pastrarea lui in
exploatarea aplicatiei fiind extrem de periculoasa.
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, butonul este inactiv).
Exemplu. Daca se introduce in variabila A2, de tip numeric, un caracter atunci se va afisa
mesajul prezentat mai sus. De asemenea daca se va introduce 0 in A2 se va afisa mesajul de
eroare datorita impartirii la 0.
Dim A2 As Double
Dim R As Double
A1 = 1000
A2 = InputBox('A2=')
R = A1 / A2
MsgBox 'Rezultatul lui ' & A1 & '/' & A2 & '=' & R
Eroare_Standard = R
End Function
VBA, 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. Un astfel
de modul se numeste rutina de tratare a erorilor(Error-handling).
De asemenea proiectantii de aplicatii pot folosi producerea unor erori previzibile, in vederea
rezolvarii mai 'elegante' a unor cazuri normale de prelucrare.
Controlul erorilor de executie se realizeaza prin doua instructiuni si doua obiecte create special in
acest scop:
On Error, este o instructiune, care atunci cand este intalnita si executata, produce asupra codului
VBA care urmeaza dupa aceasta, doua actiuni(indirecte):
Deci, daca dupa executia instructiunii On Error, in rutina respectiva se produce o eroare de
executie, atunci nu mai este afisat mesajul de eroare pe care l-am prezentat inainte. De asemenea
inversa acestei afirmatii este si ea valabila, adica daca intr-o rutina se produce o eroare de
executie inainte de a se executa instructiunea On Error, se va continua prelucrarea prin sistemul
standard de tratare a erorilor prin afisarea mesajului respectiv.
Pozitia pe care se va plasa cursorul de instructiuni, in cazul aparitiei unei erori de executie.
Deci, daca dupa executia instructiunii On Error, in rutina respectiva se produce la un moment
dat o eroare de executie, atunci aceasta va preciza si care este urmatoarea instructiune care se va
executa in cazul producerii unui asemenea eveniment.
Exista trei forme ale instructiunii On Error, functie de locul de unde se va continua executia in
cazul aparitiei erorii de executie:
Aceasta forma este folosita atunci cand se va folosi o rutina speciala pentru tratarea erorii, Error-
handling, care se va gasi dupa aceasta eticheta.
Nota: O eticheta se declara printr-un nume scris la inceputul unei linii urmat de semnul doua
puncte(:). O eticheta este vizibila numai in rutina in care a fost declarata.
Resume, este instructiunea prin care se iese din rutina de tratare a erorilor(Error-handling).
Exista trei forme ale instructiunii Resume, functie de locul de unde se va continua executia dupa
ce se termina executia rutinei de tratare a erorilor.
1. Resume eticheta - prelucrarea va continua cu instructiunile care se gasesc dupa eticheta.
2. Resume Next - prelucrarea va continua cu urmatoarea instructiune care se gasesc dupa
aceea care a produs eroarea. Deci practic prin aceasta forma prelucrarea va continua dupa
tratarea erorii, fara a se mai executa instructiunea care a produs eroarea.
3. Resume 0 sau Resume - prelucrarea va continua chiar cu instructiunea care a produs
eroarea. Deci, dupa executia rutinei de tratare a erorii, se va relua executia instructiunii care nu s-
a putut executa.
III.3.4.2.3 Obiectul: Err.
Err, este un obiect care se gaseste in VBA, si care in momentul producerii unei erori, i se vor
seta automat de sistem proprietatile functie de eroarea produsa.
Number - care va contine numarul* erorii produse. Aceasta proprietate este implicita.
Pentru ca sistemul sa incarce proprietatile la producerea unei erori, este necesar ca obiectul Err,
sa fie initializat(golit). Acest lucru se face numai la:
la terminarea rutinei care a produs ultima eroare, prin instructiunile: Exit Sub, Exit
Function sau Exit Property;
Function XYZ()
Sfirsit:
Exit Function ' Iesirea in cazul in care nu se produce nici o eroare se va face pe aici
Fis:
Resume …. ' Instructiunea care urmeaza dupa executia modulului de tratare a erorii
End Function
Dim A1 As Double
Dim A2 As Double
Dim R As Double
A1 = 1000
Reia:
A2 = InputBox('A2=')
R = A1 / A2
MsgBox 'Rezultatul lui ' & A1 & '/' & A2 & '=' & R
Eroare_Handling = R
Sfirsit:
Fis:
If MsgBox(' - S-a produs o eroare datorita datei introduse' & vbCr & _
Resume Reia
' Se reia de la introducerea valorii pentru A2 _
Else
Eroare_Handling = Null
Resume Sfirsit
End If
Else
MsgBox 'Eroare Nr=' & err & ' - ' & err.Description
Resume Sfirsit
End If
End Function
------------------
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).
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 RS As Recordset
Dim A As Integer
Sfirsit:
Exit Sub
Fis:
EROARE = ''
' Introduce in variabila Eroare, pentru fiecare obiect din colectia Errors, _
cite un rand
EROARE = 'Eroare DAO nr=' & ER.Number & ' - ' & ER.Description & vbCr
Next
' Eroare ce provine din DAO, deoarece si primul obiect din colectia Errors si _
Else
MsgBox 'Eroare VBA nr=' & err.Number & ' - ' & err.Description, vbExclamation
End If
End Sub
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.
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
Dbnume - numele complet(cu extensie si cale) al fisierului care contine baza de date.
------------------
Obiectul Database, contine urmatoarele colectii in care sunt incluse toate informatiile referitoare
la baza de date respectiva.
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
Msgbox 'Campul cu numele :' & Fd.Name & ' este de tip :' & Fd.Type
------------------
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);.
Exemplu.
Dim DB As Database
Dim PR As Property
If IsMissing(BazaDate) Then
Else
End If
'----------------------------
MsgBox ' Proprietatea :' & PR.NAME & ' = ' & PR.Value, vbInformation
Next PR
End Sub
Ea este constituita din 8 obiecte Container. Fiecare din acestea contine descrierea tuturor
obiectelor de un anumit tip din baza de date(de exemplu formulare).
Aceasta descriere se face printr-o noua colectie, Documents, in care fiecare obiect Document,
va contine prin proprietatile sale, informatiile(nume, permisiuni, etc.) despre un obiect de tipul
respectiv existent(salvat) in baza de date.
4 din MS Access:
SYSrel
------------------
Deoarece colectiile Containers si Documents, reflecta structura unei baze de date, este evident ca
nu este permisa crearea sau stergerea de obiecte din aceste colectii.
Explicatie. * In colectia Tables, se va observa existenta unor tabele, care incep cu prefixul
'MSyS'. Acestea reprezinta tabelele sistem ale MS Access.
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, dar numai
pe cele care sunt deschise in momentul respectiv)
Exemplu. Prin procedura de mai jos se pot cunoaste care sunt toate obiectele existente intr-o
baza de date(locala sau externa). Acest lucru se obtine prin proprietatea Name a obiectelor
Document din fiecare obiect Container a colectiei Containers.
' 0=Databases
' 1=Forms
' 2=Modules
' 3=Relationships
' 4=Reports
' 6=SYSrel
'-----------------------------------------------
Dim DB As Database
Dim CT As Container
Dim DC As Document
If IsMissing(BazaDate) Then
Else
End If
'----------------------------
If MsgBox('Documentul ' & CT.NAME & ' /' & DC.NAME, vbOKCancel +
Else
Exit For
End If
Next DC
End If
Next CT
'-----------------
DB.Close
End Sub
La actionarea butonului Cmd, printr-un control Common Dialog CD, se poate alege o baza de
date externa sau baza de date locala(daca se iese din CD cu Cancel).
In urma acestei actiuni cele doua controale, CForm si CRap, vor avea ca lista de valori numele
formularelor respectiv rapoartelor din baza de date specificata, al carui nume se va afisa in titlul
formularului.
Dim NF As Variant
Dim DB As Database
Reia:
NF = CitireCD ' foloseste controlul Common Dialog pentru preluarea unui nume complet de
fisier
If IsNull(NF) Then
Else
End If
Formulare = Empty
For Each DOC In DB.Containers('Forms').Documents 'Se pargurg toate form. salvate
Next DOC
End If
Rapoarte = Empty
Next DOC
End If
Sfirsit:
Exit Sub
Fis:
If MsgBox(' - Fisierul introdus nu este o Baza de date Access!!' & vbCr & _
'Il reintroduce-ti ?', vbExclamation + vbYesNo) = vbYes Then
Resume Reia
Else
Resume Sfirsit
' Se renunta
End If
End Sub
'========Functii interne=========
Daca functia intoarce NULL atunci s-a iesut prin butonul Cancel din Common Dialog
'--------------------------------------------------------------------------------------------------------------------
Me!CD.DefaultExt = 'Mdb'
Me!CD.InitDir = ''
2- Multimea numelor care se vor selectiona prin folosirea caracterelor generice (*) si (?)
Action = 1 - Open _
Action = 2 - Save _
Action = 3 - Color _
Action = 4 - Font _
Action = 5 - Print
Daca se intoarce un string gol('') atunci s-a iesit prin apasarea pe Cancel
Else
CitireCD = Me!CD.FileName
End If
End Function
Fiecare obiect TableDef, contine proprietatile specifice tabelei(Validation Rule, Validation Text,
sirul de conectare pentru tabelele legate, etc.)
Sub Prop_TableDef()
Dim DB As Database
Dim TD As TableDef
Dim PR As Property
Set DB = CurrentDb
MsgBox ' Proprietatea :' & PR.NAME & ' = ' & PR
Next PR
On Error GoTo 0
End If
Next TD
DB.Close
End Sub
------------------
Fiecare obiect TableDef, contine la randul sau alte doua colectii, si anume:
Colectia Fields - formata din obiecte Field, fiecare din acestea descriind prin proprietatile
sale(Nume, Tip de data, Regula de validare pentru camp, Caption, Size, etc.) un camp al tabelei.
Colectia Indexes - formata din obiecte Index, care la randul lor contin fiecare o colectie de
campuri, Fields.
Explicatie. Fiecare index reprezinta un obiect cu un nume(care e deobicei numele campului sau
pentru cheia primara PrimaryKey), urmand ca prin colectia Fields al indexului sa se specifice
care este efectiv numele campului din tabela. Deci se poate ca numele indexului si al campului sa
nu fie acelasi, sau chiar ca un index sa fie definit pe mai multe campuri.
Exemplu.
Dim DB As Database
Dim TD As TableDef
Dim ID As Index
Dim FID As Field 'Cimpurile indexului
If IsMissing(BazaDate) Then
Else
End If
'----------------------------
If MsgBox('Cimpul: ' & TD.NAME & ' /' & FD.NAME, vbOKCancel + _
Else
Exit For
End If
Next FD
'-------------------------
If MsgBox('Indexul: ' & TD.NAME & ' /' & ID.NAME, vbOKCancel + _
If MsgBox('Cimpul indexului: ' & TD.NAME & ' /' & ID.NAME & ' /' & _
FID.NAME, vbOKCancel + vbExclamation) =
vbOk Then
Else
Exit For
End If
Next FID
End If
Next ID
End If
Next TD
'---------------
DB.Close
End Sub
Exemplu. Formularul F_TableDef are doua controale Combo Box, CTabel si CCimp.
Dim DB As Database
Dim TB As TableDef
sTabele = Empty
Next TB
End If
End Sub
Dim DB As Database
Dim FD As Field
sCimpuri = Empty
End If
End Sub
------------------
Asa cum la nivelul obiectului bazei de date exista metoda CreateTableDef, pentru crearea
structurii unei tabele, tot asa la nivelul unui obiect TableDef, exista metoda CreateField, prin
care se pot defini campuri, care dupa aceea se pot adauga prin metoda Append, la colectia de
campuri a obiectului TableDef.
Colectia QueryDefs, contine obiecte de tip QueryDef, fiecare din acestea reprezentand
structura(nu datele introduse) unei cereri salvate din baza de date deschisa, numele acestora fiind
acelasi cu al cererii respective.
Exemplu.
Sub Prop_QueryDef()
Dim DB As Database
Set DB = CurrentDb
MsgBox ' Proprietatea :' & PR.NAME & ' = ' & PR
Next PR
On Error GoTo 0
End If
Next Qry
DB.Close
End Sub
------------------
Fiecare obiect QueryDef, contine la randul sau alte doua colectii, si anume:
Colectia Fields - formata din obiecte Field, fiecare din acestea reprezentand un camp al
cererii.
Colectia Parameters - formata din obiecte Parameter, daca cererea a fost creata cu
parametrii.
Exemplu.
Dim DB As Database
If IsMissing(BazaDate) Then
Else
End If
'----------------------------
If MsgBox('Cimpul: ' & Qry.NAME & ' /' & FD.NAME, vbOKCancel + _
Else
Exit For
End If
Next FD
'-------------------------
Else
Exit For
End If
Next PT
End If
Next Qry
DB.Close
End Sub
------------------
La nivelul obiectului bazei de date exista metoda CreateQueryDef, pentru crearea unei cereri
permanente prin cod VBA, descrierea cererii facandu-se direct in SQL.
Exemplu. Cererea, Cerere_B este creata daca se executa urmatoarea secventa de instructiuni.
Dim DB As Database
End Sub
------------------
Metoda Execute. Aceasta metoda se aplicata numai cererilor actiune, si are ca efect executia
efectiva a cererii.
Exemplu.
Dim DB As Database
QRY.Parameters('Text1') = 'unu'
QRY.Parameters('Text2') = 'XXX'
QRY.Execute
End Sub
------------------
Observatia 1. Parametrii unei cereri pot fi introdu-si direct prin cod VBA, ca in exemplul de
mai sus.
Observatia 2. Cererile de selectie(cu eventuali parametrii), care evident nu se pot executa, pot
sa constituie suportul pentru crearea unor Recordseturi.
III.3.9 Colectia Relations
Colectia Relations, contine obiecte de tip Relation, fiecare din acestia reprezentand o relatie
permanenta a bazei de date. Numele relatiei va fi constituit din concatenarea numelor obiectelor
intre care se creeaza relatia.
Fiecare obiect Relation, contine o colectie Fields, ale carui obiecte definesc campul de relatie.
Exemplu.
Dim DB As Database
If IsMissing(BazaDate) Then
Else
End If
'----------------------------
If MsgBox('Cimpul: ' & REL.NAME & ' /' & FD.NAME, vbOKCancel + _
Else
Exit For
End If
Next FD
End If
Next REL
End Sub
La randul sau, un obiect Recordset, contine colectia Fields, formata din obiecte Field, fiecare
din acestea reprezentand un camp al inregistrarii respective, si avand de asemenea acelasi nume
cu al campului.
Asa cum cererile, sunt utilizate pentru a manipula datele dintr-o baza de date la nivel de
multime(prin implementarea operatiilor de algebra relationala), obiectele Recordset, sunt folosite
in acelasi scop dar la nivelul elementar, al inregistrarii.
Obiectul Recordset permite accesul la datele din baza de date, prin parcurgerea unui tabel sau a
unei cereri de selectie, in modalitatea in care se procedeaza cu un fisier clasic.
Un Recordset este asemanator deci cu un fisier clasic. El este constituit din campuri(coloane) si
inregistrari(randuri).
Pentru a manevra un Recordset(sau un fisier clasic) trebuie sa se parcurga niste etape, prin
lansarea unor metode ale obiectului Recordset(o singura exceptie - metoda OpenRecorset este a
obiectului Database) :
Sa fie deschis(obligatoriu primul pas), adica sa fie definit din punct de vedere fizic si sa i se
atribuie un nume logic, prin care se va face in continuare referire la el.
Un Recordset, este format ca un tabel(matrice), din randuri si coloane. Pentru a putea ajunge la
datele dintr-o anumita celula(element), mai intai trebuie sa se faca pozitionarea pe
inregistrarea(randul) respectiv.
Deci Recordsetul, are un anumit numar de inregistrari, asezate una dupa alta si pentru a efectua
orice prelucrare trebuie mai intai sa se pozitioneze pointerul de inregistrari pe respectiva
inregistrare.
acces secvential la o inregistrare - prin parcurgerea inregistrarilor una dupa alta, in ordine
pana la cea care intereseaza.
Metodele Recordset folosite, denumite Move, permit marirea sau micsorarea pointerului de
inregistrari, cu o valoare fixa, ceea ce se materializeaza de obicei prin citirea inainte sau inapoi a
urmatoarei inregistrari.
Functie de mecanismul de efectuare a acestei operatii sunt doua categorii de metode, si anume:
Metodele Recordset Find - pozitionare mai lenta, care nu foloseste cheia de indexare.
Nota: Se poate sintetiza ceea ce s-a prezentat la acest punct prin urmatoarea observatie:
Accesul nu este permis decat la campurile inregistrarii curente.
Citirea datelor din campurile inregistrarii. Se foloseste proprietatea Value, implicita, in
citire, a obiectelor campuri(Field) *.
Modificarea datelor dintr-un camp. Se foloseste proprietatea Value, in citire, a obiectelor
campuri(Field) si metodele Recordset: Edit si Update.
Adaugarea unei inregistrari noi. Se foloseste proprietatea Value, in citire, a obiectelor
campuri(Field) si metodele Recordset: AddNew si Update.
printr-o cerere din datele mai multor tabele, care la randul ei poate fi:
actualizabila (updatable), adica in care se pot actualiza inregistrarile obtinute din executia
cererii(campurilor din iesirea cererii li se poate stabili precis originea: tabela, inregistrarea,
campul; de exemplu o cerere cu clauza Total sau in care este setata proprietatea Unique Value,
nu este updatable);
neactualizabila
Obiectul Recordset, va reprezenta practic o structura de tip inregistrari /campuri, care va ocupa
un anumit spatiu de memorare, si care va avea o existenta independenta. Din aceasta cauza se pot
deschide mai multe obiecte Recordset, care provin din aceiasi sursa de date(tabela).
Dim DB As Database
Dim RS As Recordset
Set RS = DB.OpenRecordset(Nume, )
in care:
Nume - este un string care reprezinta numele tabelei sau cererii de selectie din care se
creeaza setul de inregistrari.
Tip - reprezinta o constanta care specifica tipul setului de inregistrari care se creeaza, si
anume:
dbOpenTable
dbOpenDynaset
dbOpenSnapshot
dbOpenForwardOnly
Tipul este optional. Daca nu se foloseste, atunci setul de inregistrari se creeaza pentru primul
tip(in ordinea prezentata mai sus) pentru care se poate defini.
Nota: 1. Pentru tabelele legate din alte baze de date nu se poate folosi tipul Table.
Nota: 2. Tipurile Dynaset, Snapshot, ForwardOnly se creeaza in memoria temporara Access,
daca este loc. Din aceasta cauza ele sunt mult mai rapide.
Nota: 3. In parametrul 'nume' se poate introduce direct o instructiune SQL. In acest caz
obiectul(tabela sau cerere) creat din aceasta, va fi temporar, 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.
Cateva din cele mai utilizate proprietati ale unui obiect Recordset sunt:
RecordCount - se poate numai citi, si reprezinta numarul de inregistrari ale Recordsetului.
EOF - se poate numai citi, si ia valoarea True, daca pointerul de inregistrari incearca sa
depaseasca ultima inregistrare.
BOF - se poate numai citi, si ia valoarea True, daca pointerul de inregistrari incearca sa
se plaseze in fata primei inregistrari.
Type - se poate numai citi, si arata care este tipul Recordsetului.
Updatable - se poate numai citi, si arata daca Recordsetul este actualizabil.
NoMatch - se poate numai citi, si se pozitioneaza dupa o metoda Seek sau Find.
Aceasta proprietate va lua valoarea True, 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).
Nota: Pentru Recordsetul care nu are nici o inregistrare RecordCount=0 si atat EOF cat si
BOF sunt True.
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.(eventual cu metoda
MoveLast)
Exemplu.
Dim DB As Database
Dim RS As Recordset
Dim i As Integer
If IsMissing(BazaDate) Then
Else
End If
'----------------------------
Tip(1) = dbOpenTable ' Constanta 1 - pentru exemplul dat numai acest tip nu va fi admis
For i = 1 To 4
Reia:
Next i
Sfirsit:
Exit Sub
Fis:
Eroare = 'Nu se poate deschide tipul de recorset ' & Tip(i) & vbCr & _
Fis1:
End Sub
Move(N) – pointerul de inregistrari se muta functie de valoarea lui N. Astfel daca:
Nota: Cand se parcurge secvential un Recordset, trebuie testate proprietatile BOF si EOF,
pentru a nu se depasi limitele acestuia, la fiecare noua pozitionare.
Nota: Pentru tipul de inregistrari ForwardOnly, singura metoda acceptata este MoveNext.
Metoda Seek a unui Recordset, cauta o inregistrare care sa satisfaca un anumit criteriu si in cazul
gasirii acesteia, pozitioneaza pe ea pointerul de inregistrari.
Criteriul care se foloseste cu metoda Seek, trebuie sa se refere la un index al tabelei care sta la
baza Recordsetului.
Deoarece Seek functioneaza numai pe indecsi, este evident ca Recordsetul trebuie sa fie
obligatoriu numai de tip 'table'.
1. Se seteaza proprietatea Index, a Recordsetului, de tip string, cu numele indexului dupa care
se doreste efectuarea cautarii. In cazul in care acesta este cheie primara a tabelei numele lui este
'PrimaryKey'.
NumeRecordset.Index='NumeIndex'
2. Se aplica metoda Seek. Prin aceasta se introduce si expresia de cautare, prin doi parametrii
de tip string care reprezinta:
Un literal care reprezinta valoarea pe care trebuie sa o aiba in inregistrare indexul
respectiv.
Nota: O metoda este similara cu o procedura din punct de vedere al regulilor de sintaxa
folosite. Ea se poate lansa si cu parametrii, caz in care acestia sunt plasati in continuarea numelui
metodei, separati prin virgula si fara sa fie inclusi intre paranteze.
3. Se verifica prin proprietatea NoMatch daca operatia s-a efectuat cu succes(in caz de reusita
proprietatea se seteaza pe False).
Exemplu.
' Cauta o inregistrare folosind metoda Seek, pe un camp indexat si pe un camp cheie primara
Dim DB As Database
Dim RS As Recordset
Set DB = CurrentDb
If RS.RecordCount = 0 Then
Exit Sub
End If
RS.Index = 'PrimaryKey'
If RS.NoMatch Then
Else
'___________
' Seteaza indexul pentru care se face urmatoarea cautare pe campul 'A'
RS.Index = 'A'
If RS.NoMatch Then
Else
End If
RS.Close
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
End Sub
------------------
Nota: Un obiect index contine asa cum am mai aratat o colectie Fields. Deci un index poate fi
format nu numai dintr-un singur camp. Metoda Seek, permite introducerea unui criteriu de
cautare si in acest caz, prin folosirea mai multor parametrii valoare(cate unul pentru fiecare
camp al indexului)
Tipul Recordsetului pentru aceste metode trebuie sa fie obligatoriu Dynaset sau Snapshot.
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.
Deoarece exista posibilitatea ca sa existe mai multe inregistrari care sa satisfaca criteriul
introdus, exista 4 metode de cautare care vor:
FindFirst - pozitioneaza pointerul pe prima inregistrare care indeplineste criteriul de cautare.
La aceasta metoda cautarea porneste de la prima inregistrare a Recordsetului, spre sfarsitul lui
FindNext - se aplica de obicei dupa ce s-a efectuat o metoda Find. Ea pozitioneaza pointerul
pe urmatoarea inregistrare care indeplineste criteriul de cautare. La aceasta metoda cautarea
porneste de la inregistrarea curenta a Recordsetului, spre sfarsitul lui
FindPrevious - - se aplica de obicei dupa ce s-a efectuat o metoda Find. Ea pozitioneaza
pointerul pe inregistrarea anterioara care indeplineste criteriul de cautare. La aceasta metoda
cautarea porneste de la inregistrarea curenta a Recordsetului, spre inceputul lui
------------------
Toate metodele Find folosesc un parametru de tip string prin care se introduce o expresie
care reprezinta criteriul de cautare.
Regulile de scriere ale expresiei sunt aceleasi care au fost prezentate la formarea expresiilor din
functiile agregate de domeniu.
Reamintim ca se pot folosi in aceste expresii orice fel de operatori acceptati in VBA(aritmetici,
relationali sau logici) si ca termenii expresiei pot fi si numele de campuri din Recordsetul pe
care se face cautarea.
Exemplu.
Dim DB As Database
Dim RS As Recordset
Dim I As Integer
Dim Tp As String
Set DB = CurrentDb
If RS.RecordCount = 0 Then
Exit Sub
End If
I=0
Criteriu = '[A]=''' & Tp & ''''
RS.FindFirst Criteriu
I=I+1
RS.FindNext Criteriu ' cauta urmatoarea inregistrare care respecta acelasi criteriu
Loop
MsgBox 'Nr. de inregistrari gasite care au Cimpul A = ''' & Tp & ''' este: ' & I
RS.Close
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
End Sub
Un obiect Recordset contine o colectie de obiecte Fields. In aceasta colectie vor fi atatea obiecte
cate campuri are Recordsetul respectiv.
Proprietatea implicita a unui obiect camp este Value care reprezinta valoarea care se gaseste in
campul respectiv. Ea se poate folosi atat in citire cat si in scriere(pentru a fi modificata).
Exemplu.
Dim RS As Recordset
Set DB = CurrentDb
' Se deschide in tipul implicit, adica cel mai semnificativ care se poate - Table
Set RS = DB.OpenRecordset('Tabela_A')
If RS.RecordCount = 0 Then
Exit Sub
End If
Do While Not RS.EOF ' Ciclul se executa cat timp nu se atinge sfarsitul recordsetului
Se observa folosirea semnului de calificare (!) pentru a se referi un obiect de tip camp
Loop
RS.Close ' Optionala Se face automat la inchiderea procedurii in care s-a declartat
Recordsetul
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
End Sub
Pentru fiecare tip de actualizare(modificare, adaugare, stergere) care se efectueaza asupra datelor
dintr-un Recordset, exista metode specifice.
Pentru ca o actualizare sa fie acceptata, in primul rand trebuie ca sa se respecte urmatoarele trei
conditii:
Recordsetul sa fie actualizabil. Pentru verificarea acestei conditii se poate folosi
proprietatea Updatable(sa fie True).
Recordsetul sa fie deschis in tip Table sau Dynaset, adica in tipurile care accepta
efectuarea de actualizari.
Modificarea datelor dintr-un camp al unei inregistrari dintr-un Recordset se efectueaza folosind
metodele Recordset Edit si Update, si proprietatea Field, Value, astfel:
Modificarea efectiva a valorii dintr-un camp al unui Recordset, se efectueaza prin
proprietatea Value(implicita) a campului, in scriere. Pentru ca acest lucru sa fie posibil trebuie ca
sa se procedeze in prealabil in felul urmator:
pointerul de inregistrari se pozitioneaza pe inregistrarea ale carui campuri se vor modifica;
Dupa efectuarea modificarii campurilor din inregistrare, aceasta trebuie efectiv rescrisa in
Recordset, prin metoda Update.
Deci modificarea unui camp dintr-o inregistrare, se face prin efectuarea acesteia intre metodele
Recordset Edit si Update.
Nota: Daca modificarea efectuata nu va respecta proprietatile de integritate setate, metoda
Update nu se va executa si va provoca o eroare de executie.
Exemplu.
Dim DB As Database
Dim RS As Recordset
Dim I As Integer
Dim Tp As String
Dim TM As String
Set DB = CurrentDb
' Se deschide setul de inregistrari in tip Dynaset, care permite efectuarea actualizarilor
If RS.RecordCount = 0 Then
Exit Sub
End If
Exit Sub
End If
' ______Modificarea unui cimp
I=0
RS.FindFirst Criteriu
MsgBox 'Inregistrare Veche :' & RS!N & ';' & RS!A
RS.Edit
RS!A = TM
RS.Update
I=I+1
MsgBox 'Inregistrare Noua :' & RS!N & ';' & RS!A
RS.FindNext Criteriu ' cauta urmatoarea inregistrare care respecta acelasi criteriu
Loop
RS.Close
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
Fis1:
MsgBox 'Eroare Actualizare: ' & vbCr & err & ' - ' & err.Description, vbCritical
Resume Sfirsit
End Sub
III.10.3.7.2_2 Adaugarea unei inregistrari intr-un set de inregistrari.
Adaugarea unei inregistrari noi intr-un set de inregistrari se efectueaza folosind metodele
Recordset AddNew si Update, si proprietatea Field, Value, astfel:
Se introduc in campurile inregistrarii valorile dorite prin folosirea in scriere a proprietatii
Value a acestora.
Exemplu.
Dim DB As Database
Dim RS As Recordset
Dim TN As String
Dim TA As String
Set DB = CurrentDb
' Se deschide setul de inregistrari in tip Dynaset, care permite efectuarea actualizarilor
Set RS = DB.OpenRecordset('Tabela_A', dbOpenDynaset)
Exit Sub
End If
RS.AddNew
RS!N = Val(TN)
RS!A = TA
RS.Update
RS.Close
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
Fis1:
MsgBox 'Eroare Adaugare: ' & vbCr & err & ' - ' & err.Description, vbCritical
Resume Sfirsit
End Sub
III.10.3.7.2_3 Stergerea unei inregistrari dintr-un set de inregistrari.
Stergerea unei inregistrari dintr-un set de inregistrari se efectueaza folosind metoda Recordset
Delete, astfel:
Exemplu.
Dim DB As Database
Dim RS As Recordset
Dim I As Integer
Dim Tp As String
Set DB = CurrentDb
' Se deschide setul de inregistrari in tip Dynaset, care permite efectuarea actualizarilor
Exit Sub
End If
Exit Sub
End If
I=0
RS.FindFirst Criteriu
If MsgBox('Inregistrarea care se sterge:' & RS!N & ';' & RS!A, vbOKCancel) = vbOk _
Then
RS.Delete
I=I+1
End If
RS.FindNext Criteriu ' cauta urmatoarea inregistrare care respecta acelasi criteriu
Loop
RS.Close
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
Fis1:
MsgBox 'Eroare Stergere ' & vbCr & err & ' - ' & err.Description, vbCritical
Resume Sfirsit
End Sub
O cerere de selectie, poate sa fie obiectul de intrare a unui set de inregistrari in doua moduri:
Direct, definind ca obiect al setului de inregistrari cererea(ca in exemplele de pana acum)
Executand in prealabil anumite actiuni asupra cererii. De exemplu daca este necesar
introducerea unor parametrii in cerere direct din cod.
Exemplu.
Dim DB As Database
Dim QRY As QueryDef
Dim RS As Recordset
QRY.Parameters('Numar') = '2'
If RS.RecordCount = 0 Then
Exit Sub
End If
RS.MoveNext
Loop
End Sub
Un set de inregistrari poate fi definit pe un alt set de inregistrari, dupa ce asupra acestuia se
efectueaza anumite prelucrari.
Aceasta metoda se aplica de obicei daca se doreste sortarea sau filtrarea in prealabil a setului de
inregistrari.
Asa cum se observa se permite sortarea dupa mai multe chei , in ordine ascendenta(implicit) sau
descendenta.
Exemplu.
Dim DB As Database
Dim RS As Recordset
Set DB = CurrentDb
If RSS.RecordCount = 0 Then
Exit Sub
End If
RSS.Sort = 'N Desc' ' Se sorteaza recordsetul dupa cheia N in ordine descrescatoare
Loop
Sfirsit:
Exit Sub
Fis:
Resume Sfirsit
End Sub
In Access este posibil ca sa se foloseasca obiecte de date(de tip tabel) de o multitudine de tipuri
create in alte aplicatii. Aceasta se poate face ori prin legare, ori prin incapsulare.
DoCmd.TransferDatabase - pentru obiecte din baze de date Access, Fox, DBase etc.
DoCmd.TransferText - pentru date introduse sub forma de inregistrari (cu separatori sau
de latime fixa pentru stabilirea campurilor(coloanelor) in fisiere de tip text).
Nota: Si operatia inversa, de export din Access a obiectelor acestuia, in diferite tipuri de baze
de date este posibila.