CATEGORII DOCUMENTE |
Programarea in Access
Pentru inceput vom incerca sa raspundem la doua intrebari : Ce sunt Visual Basic pentru aplicatii si Access Basic ? De ce le folosim ?
Deoarece Access Basic este derivat din Visual Basic, o sa ne ocupam mai mult de Visual Basic pentru aplicatii. Visual Basic pentru aplicatii, prescurtat uzual VBA, pune la dispozitie un limbaj complex pentru dezvoltarea aplicatiilor in cadrul programelor din Microsoft Office. Aceasta inseamna ca nucleul limbajului, componentele sale si mediul sunt aceleasi ca in Microsoft Access for Windows 95/97, Microsoft Visual Basic, Microsoft Excel si Microsoft Project.
Aplicatiile mai simple din Access pot fi scrise folosind comenzi macro. Desi comenzile macro sunt bune pentru crearea rapida de prototipuri de functii si pentru dezvoltarea majoritatii aplicatiilor de baza, dezvoltarea unor aplicatii serioase in Access se face folosind limbajul Access Basic, respectiv VBA.
Marile avantaje pe care le ofera limbajele de programe mai sus amintite, fata de comenzile macro, ar fi :
Implementarea tratarii erorilor;
Executia procesului tranzactional;
Crearea unor structuri ciclice pentru parcurgerea seturilor de inregistrari;
Apelarea functiilor Windows API;
Crearea prin program a obiectelor bazei de date;
Utilizarea constantelor si a variabilelor;
De asemenea, Access Basic si VBA usureaza scrierea bibliotecilor de functii reutilizabile, precum si proiectarea si depanarea proceselor complexe de catre programatori. In concluzie, desi comenzile macro pot da solutii rapide problemelor simple, limitarile lor determina necesitatea folosirii limbajelor de programare pentru dezvoltarea solutiilor mai complexe.
Codul Access Basic si VBA este scris in unitati numite proceduri. O procedura contine o secventa de cod Access Basic sau VBA care executa o operatie sau calculeaza o valoare. Exista doua feluri de proceduri :
Subrutine (Sub)
Functii (Function)
O subrutina (sub-procedura) este o rutina care raspunde la aparitia unui eveniment sau executa o anumita actiune. O functie este un tip special de rutina, datorata faptului ca poate intoarce o valoare. Aceste subrutine si functii sunt pastrate in module. Modulele furnizeaza o cale de a organiza procedurile. Cu toate ca toate procedurile pot fi inglobate intr-un singur modul, este mai convenabil sa le divizam in grupuri logice, si fiecare grup sa-l stocam in module separate. Modulele pot fi globale sau specifice unui anumit formular sau raport. Modulele specifice unui formular sau raport sunt in general numite coduri din spatele formularelor (Code Behind Forms - CBF).
Exista doua feluri de rutine, rutinele evenimentelor si rutine definite de utilizator. Procedurile evenimentelor sunt create automat atunci cand scrieti codul evenimentului pentru un control. De exemplu, rutina Private Sub OKButton_Click() este creata atunci cand plasati instructiuni de cod in evenimentul Click al butonului numit OKButton.
De asemenea, utilizatorii isi pot crea rutine proprii. Acestea nu sunt specifice unui anumit obiect sau eveniment. Depinzand de modul si de locul in care au fost create, ele pot fi apelate de oriunde din aplicatie sau numai dintr-un modul individual de cod, formular sau raport. Iata un mic exemplu de subrutina :
Sub SayHello( )
'Subrutina care afiseaza pe ecran textul 'Hello world !, from Access'.
MsgBox 'Hello world !, from Access '.
End Sub
Cum se pot apela procedurile ? Foarte simplu. Procedurile evenimentelor sunt apelate automat cand are loc un eveniment pentru un obiect. De exemplu, cand utilizatorul executa click pe un buton de comanda, este executat codul evenimentului Click pentru acel buton de comanda. In mod obisnuit, pentru apelarea procedurilor definite de utilizator, se foloseste cuvantul cheie Call, ca in exemplul urmator :
Call SayHello
Apelul se poate face insa si fara cuvantul cheie Call, astfel : SayHello. Totusi, aceasta metoda contravine standardelor, deoarece cuvantul cheie Call indica faptul ca se apeleaza o rutina definita de utilizator sau o rutina eveniment. Cuvantul cheie Call face ca instructiunea sa fie mai clara si mai usor de citit. Deci, va recomandam sa folositi cuvantul cheie Call.
De asemenea, nu e o idee rea sa va comentati codul. O puteti face fie folosind cuvantul cheie Rem, fie apostroful.
Atat subrutinele cat si functiile pot primi argumente (parametri), iar numai functiile pot returna valori. Subrutina din exemplul urmator primeste doi parametri, txtFirst si txtLast.
Private Sub sendMsg _ Click ( )
Call Initials ( txtFirstName, txtLastName)
End Sub
Sub Initials ( sFisrt As String, sLast As String )
MsgBox ' Initialele dvs. sunt '&
Left $ (sFirst, 1) & Left $ (sLast, 1)
End Sub
Codul precedent transmite pur si simplu valori si apoi opereaza cu ele. Exemplul urmator ilustreaza folosirea unei functii care intoarce o valoare :
Private Sub nameFunc _ Click ( )
Dim sInitials As String
SInitials = ReturIni ( txtFirstName, txtLastName )
MsgBox ' Initialele dvs. sunt ' & sInitials
EnduSub
Function ReturIni ( sFirstName As String, sLastName As String )
ReturIni = Left $ ( sFirstName, 1 ) & Left $ ( sLastName, 1 )
End Function
Variabile, constante, tipuri de date
Deseori avem nevoie sa stocam valori temporare cand efectuam operatii in Access Basic sau Visual Basic. De exemplu, poate dorim sa calculam cateva valori, sa le comparam si in functie de rezultatul comparatiei sa executam diferite operatii. Pentru aceasta trebuie sa pastram valorile ca sa le putem compara, dar deoarece avem nevoie de ele doar atata timp cat ruleaza codul nostru nu trebuie sa le stocam in tabele. Access Basic si Visual Basic, ca majoritatea limbajelor de programare, folosesc variabile pentru stocarea valorilor.
Cand creati variabile trebuie sa luati in considerare mai multe lucruri. Modul in care declarati o variabila determina domeniul de valabilitate, durata de valabilitate si alte caracteristici ale acesteia.
Declararea variabilelor
Sunt mai multe metode de declarare a variabilelor in limbajele Access Basic si VBA. Trei metode sunt gresite si numai una e corecta. De exemplu, ati putea declara pur si simplu :
X = 10
Folosind aceasta metoda, practic nu declarati deloc variabila. In mod obisnuit, veti declara variabilele in timp ce le folositi. Aceasta metoda este foarte periculoasa, deoarece poate cauza multe probleme. Ati putea, de asemenea, sa introduceti :
Dim iCounter
Instructiunea Dim declara o variabila. Singura problema a acestei metode este ca nu ati declarat compilatorului tipul variabilei. In acest caz, variabila va avea tipul de data Variant.
O alta greseala obisnuita este declararea mai multor variabile pe aceeasi linie :
Dim iCounter, iAge, iWegiht as Integer
In acest caz, numai ultima variabila este declarata ca o variabila Integer, celelalte variabile sunt declarate Variant.
Cea mai eficienta si mai lipsita de erori metoda de declarare a variabilelor este de a transmite cat mai exact compilatorului tipul de date al variabilelor, ca in exemplul :
Dim iCounter as Integer
Dim sName as String
Asa cum puteti vedea, acest tip de declaratie contine atat numele variabilei, cat si tipul datelor pe care le contine. Acest lucru permite compilatorului sa intercepteze erori de genul memorarii unui sir intr-o variabila de tip intreg. La o implementare corespunzatoare, prin selectarea celui mai scurt tip de date folosit pentru fiecare variabila, puteti reduce resursele necesare executarii programului dumneavoastra. Deci, cu toate ca cele patru variante de declarare a unei variabile sunt corecte din punctul de vedere al compilatorului, ultima metoda este cea mai indicata. Urmariti-o, si va veti scuti de multa bataie de cap.
Revenind un pic la prima metoda de declarare, cea in care practic noi nu declaram variabila inainte de a o folosi. De exemplu, avem functia :
Function SafeSqr (num)
TempVal = Abs (num)
SafeSqr = Sqr (TempVal)
End Function
In functie s-a utilizat variabila TempVal fara sa fie declarata. De fapt, limbajul de programare declara o variabila pentru noi cu numele de TempVal, deci variabila se poate folosi fara sa fie declarata explicit. Cu toate ca aceasta metoda pare a fi interesanta si folositoare, totusi poate genera erori subtile in cod, greu de detectat, daca din greseala se scrie gresit numele variabilei. De exemplu, daca functia ar fi aratat astfel :
Function SafeSqr(num)
TempVal = Abs(num)
SafeSqr = Sqr(TemVal)
End Function
La prima vedere functia este asemanatoare cu prima, dar din greseala la a doua folosire a variabilei TempVal, s-a scris TemVal, deci s-a creat o noua variabila. Prin urmare aceasta functie va returna intotdeauna valoarea zero.
Pentru a evita aceasta problema, putem stipula ca, compilatorul sa genereze mesaj de eroare atunci cand intalneste o variabila nedeclarata explicit. Pentru a face asta, trebuie introdus in sectiunea de declaratii a modulului instructiunea Option explicit. Utilizatorii de Access 95 sau 97 nu trebuie sa-si bata capul cu aceasta problema, deoarece la crearea unui nou modul, instructiunea Option explicit este adaugata automat in modul.
Atentie deci, utilizatori de Access 2.0 !
Limbajul VBA ofera mai multe tipuri de date pentru variabile. In tabelul alaturat este afisata o lista a tipurilor de date disponibile, modalitatea standard de denumire a lor, spatiul de stocare necesar, datele pe care le pot pastra si valorile lor prestabilite.
Tipuri
de date fundamentale
Tipul de date |
Denumire conventionala |
Exemplu |
Spatiu de memo-rare |
Domeniu |
Valoarea implicita |
|
Byte(Octet) |
Bt |
btValue |
1 octet | |||
Boolean (Logic) |
B |
bAnswer |
2 octeti |
True sau False |
False |
|
Integer (Intreg) |
I |
iCounter |
2 octeti |
De la -32.768 la | ||
Long Integer (Intreg lung) |
I |
iAmount |
4 octeti |
De la la | ||
Single (Simplu) |
Sng |
sngAmount |
4 octeti |
Intre -3,402823E38 si -1,401298E-45 (valori negative) Intre 1,401298E-45 si 3,402823E38 (valori pozitive) | ||
Double (Dublu) |
D |
dValue |
8 octeti |
Intre -1,79769313486232E308 si -4,94065645841247E-324 (valori negative) intre 4,94065645841247E-324 si 1,79769313486232E308 (valori pozitive) | ||
Currency (valuta) |
C |
cSalary |
8 octeti |
De la la | ||
Date (Data) |
Dt |
dtStartDate |
8 octeti |
De la 1 / 1 / 100 la | ||
Object (obiect) |
O |
oExcel |
4 octeti |
Orice obiect | ||
Fixed String (sir static) |
S |
sName |
10 octeti +lungime sir |
De la 0 la 2 miliarde |
' ' |
|
Var.String (String variabil) |
S |
sName |
Lungime sir |
De la 1 la 65.400 |
' ' |
|
Variant /W numere |
Vnt |
vntData |
16 octeti |
Orice variabila numerica sau de tip Double |
Emply (Gol) |
|
Variant /W caractere |
Vnt |
vntData |
22 octeti |
De la 1 la 65.400 |
Emply (Gol) |
|
Type |
Typ |
typEmp |
Variabil |
Bazat pe elemente | ||
Limbajul VBA ofera mai multe tipuri de date pentru variabile. Va prezentam aici tabelul cu toate tipurile de date disponibile, denumirile conventionale, spatiul de stocare necesar, datele pe care le pot pastra si valorile lor implicite.
Variabilele pot fi declarate local, la nivel de modul sau publice :
Variabile locale. Variabilele locale sunt disponibile numai in subrutina in care au fost declarate. Iata un exemplu ilustrativ :
Dim sAnimal As String
sAnimal = ' Caine '
Private Sub ChangeAnimal
sAnimal = ' Pisica '
End Sub
Aceasta secventa de cod ar putea sa fie tratata in doua moduri. Daca este valabila instructiunea Option Explicit, ceea ce inseamna ca variabilele trebuie sa fie declarate inainte de folosire, acest cod va returna o eroare de compilare. In caz contrar, variabila sAnimal poate fi schimbata in ' Pisica ' numai in cadrul subrutinei ChangeAnimal.
Variabile statice. Exemplul urmator ilustreaza diferenta dintre variabilele locale si cele statice. Variabilele locale sunt initializate la fiecare apel al codului. De fiecare data cand lansati in executie urmatoarea procedura, variabila iCounter ia valoarea 1 :
Private Sub local Click ( )
Dim iCounter As Integer
ICounter = iCounter + 1
End Sub
De fiecare data cand acest cod este executat, instructiunea DIM reinitializeaza variabila iCounter. Este putin diferita de urmatoarea secventa de cod, care ilustreaza folosirea variabilei statice :
Private Sub static_Click ( )
Static iCounter As Integer
ICounter = iCounter + 1
End Sub
De fiecare data c[S1]and acest cod este executat, variabila cu numele iCounter este incrementata si retinuta.
Pana acum, aceasta discutie s-a limitat la variabilele care au domeniul in interiorul unei proceduri individuale. Variabilele de nivel modul pot fi vizualizate din orice rutina apartinand modulului in care au fost declarate. Variabilele de nivel modul sunt declarate prin plasarea unei comenzi DIM in sectiunea General Declarations a formularului, raportului sau modulului de cod.
[General Declarationss
Option Explicit
Dim miCounter As Integer
Valoarea variabilei poate fi schimbata de orice subrutina sau functie din modulul respectiv. De exemplu, urmatoarea subrutina schimba valoarea variabilei de nivel modul miCounter la 20. Retineti conventia de numire a variabilei prin folosirea literei m ca prefix al numelui acesteia. Aceasta o face sa fie cunoscuta ca o variabila de nivel modul. Ar trebui sa folositi declaratii de nivel modul numai pentru variabilele care trebuie sa fie vazute de mai multe rutine. Ar trebui sa incercati sa declarati majoritatea variabilelor dumneavoastra de tip local. Aceasta metoda face codul dumneavoastra mai modular si mai usor de depanat.
Private Sub module_Click ( )
MiCounter = 20
End Sub
Variabile publice. O variabila poate fi accesata de oriunde din aplicatia dumneavoastra. Variabilele publice se folosesc de obicei pentru identificatorii de acces, valori de configurare pentru mediul de lucru si alte variabile care trebuie sa fie vizibile pentru intreaga aplicatie.
Declaratiile variabilelor publice trebuie sa fie plasate in sectiunea General Declarations a modulului de cod. O declaratie de variabila publica arata ca in exemplul urmator :
Option Explicit
Public piCounter As Integer
Retineti folosirea prefixului p, care indica tipul public al variabilei. Secventa de cod urmatoare, plasata in evenimentul Click al butonului de comanda OKButton schimba valoarea variabilei publice piCounter la 150.
Private Sub OKButton_Click ( )
PiCounter = 150
End Sub
Pentru utilizatorul de Access 2.0, cuvantul cheie Public nu exista, echivalentul sau fiind Global. O variabila publica se poate declara in orice modul de cod, cu conditia sa fie precedat de cuvantul cheie Public sau Global. Astfel se pot declara mai multe variabile globale in mai multe module, lucru destul de neplacut, pentru ca daca doriti sa vedeti declaratia unei variabile globale trebuie sa cautati in mai multe module. Un lucru destul de elegant ar fi crearea unui modul separat pentru declaratii, numit de exemplu Declarations, si in care sa nu faceti nimic altceva decat sa va declarati variabilele globale. Insa, pe cat posibil evitati folosirea variabilelor globale.
O constanta este un nume semnificativ pe care il dati unui sir sau numar. Constantele pot fi folosite numai pentru valori care nu se schimba in timpul executiei aplicatiei. De exemplu, rata impozitului ar putea fi constanta in timpul executiei aplicatiei. Constantele sunt utilizate pentru a creste lizibilitatea codului dumneavoastra si pentru a usura intretinerea programului respectiv.
In limbajul Access Basic si VBA exista doua tipuri de constante. Primul este numit constanta proprie (intrinseca). Constantele de acest tip fac parte din limbajul propriu zis. Ca programator in Access, puteti folosi constante furnizate de Microsoft Access, Visual Basic si obiecte pentru acces la date (DAO = Date Access Objects). De asemenea, puteti folosi constante din orice biblioteca de obiecte pe care o utilizati in aplicatia dumneavoastra. Al doilea tip de constanta este cea simbolica sau definita de utilizator. Acesta este tipul de constanta pe care o declarati dumneavoastra , ca programator.
O constanta definita de utilizator este declarata folosind cuvantul cheie Const. Constantele pot fi declarate in subrutine sau functii in sectiunea General Declarations a unui modul. Iata si un mic exemplu:
Function TotalAmount (SaleAmount As Curreny)
Const TaxRate = 0,0875
TotalAmount = SaleAmount * TaxRate
End Function
Un tablou este format dintr-o serie de variabile referite prin acelasi nume. Fiecare element al unui tablou este diferentiat de celelalte printr.un numar index unic. Tablourile ajuta in multe situatii la crearea unui cod mai simplu si mai mic. Tablourile au o limita superioara si o limita inferioara. Toate elementele unui tablou trebuie sa fie continue.
Domeniul de valabilitate al unui tablou poate fi public, modul sau local. Ca si la celelalte variabile, acest lucru depinde de locul in care a fost declarat tabloul si daca este folosit cuvantul cheie Public sau Global. Limita superioara a unui tablou este zero (ca valoare prestabilita). Toate elementele unui tablou trebuie sa fie de acelasi tip.
Exista trei modalitati de a declara un tablou cu marime fixa, in functie de domeniul de valabilitate pe care doriti sa-l aiba :
Pentru a crea un tablou global sau public se foloseste comanda Global sau Public.
Pentru a crea un tablou la nivel de modul se foloseste comanda Dim in sectiunea de declaratii din modul.
In cadrul unei proceduri, se foloseste comanda Static (se poate folosi si Dim daca toata procedura a fost declarata statica).
In Access Basic respectiv VBA exista doua tipuri de tablouri : statice si dinamice.
Tablouri statice
Cand declarati un tablou static, indicati compilatorului limita superioara si tipul de date pe care le va contine tabloul. Urmatoarea secventa de cod creeaza un tablou care va contine sase variabile de tip sir :
Dim sName (5) As String
Acest tablou este static, in sensul ca dimensiunea sa nu poate fi modificata in timpul executiei aplicatiei. Secventa de cod da un exemplu despre modul in care puteti sa faceti o bucla intr-un tablou :
Sub Fixed_Array ( )
Dim sName (5) As String
Dim i As Integer
sNames (0) = ' Catalin [S2]
sNames (1) = ' Adrian '
For i = 0 To Ubound(sName)
MsgBox ( sNames (1) )
Next i
End Sub
Tablouri dinamice
Deseori nu cunoasteti numarul elementelor pe care trebuie sa le contina un tablou. In acest caz, trebuie sa declarati un tablou dinamic. Tablourile dinamice pot fi redimensionate in timpul executiei aplicatiei. Acest lucru face ca programul dumneavoastra sa fie mai eficient, deoarece in cazul unui tablou static, VBA face o prealocare de spatiu de memorie pentru toate elementele, indiferent daca acestea contin sau nu date.
Pentru a crea un tablou dinamic, declarati tabloul fara sa atribuiti o limita superioara, ca in exemplul urmator :
Sub Dynamic_Array ( )
Dim sNames ( ) As String
Dim i As Integer
ReDim sNames (1)
SNames (0) = ' Catalin '
SNames (1) = ' Adriana '
For i = 0 To Ubound (sName)
MsgBox ( sNames (1) )
Next i
End Sub
Probleme apar cand incercati sa redimensionati tabloul :
Sub Dynamic_Array ( )
Dim sNames ( ) As String
Dim i As Integer
ReDim sNames (1)
SNames (0) = ' Catalin '
SNames (1) = ' Adriana '
ReDim sNames (2)
SNames (2) = ' Ana '
For I =0 To Ubound (sName)
MsgBox ( sNames (1) )
Next I
End Sub
Va asteptati probabil ca toate cele trei elemente ale tabloului sa contina date. De fapt, instructiunea ReDim reinitializeaza toate elementele si numai elementul al doilea va contine o valoare. Acest fenomen poate fi evitat prin folosirea cuvantului cheie Preserve. Codul va arata cam asa :
Sub Dynamic_Array ( )
Dim sNames ( ) As String
Dim I As Integer
ReDim sNames (1)
SNames (0) = ' Catalin '
SNames (1) = ' Adriana '
ReDim Preserve sNames (2)
SNames (2) = ' Ana '
For I = 0 To Ubound (sName)
MsgBox (sNames (1) )
Next I
End Sub
In acest exemplu, toate valorile memorate in tablou sunt pastrate. Sunt si parti ascunse ale folosirii acestui cuvant cheie. Temporar, acest procedeu necesita mai multa memorie deoarece in timpul procesului de redimensionare, VBA creaza un intreg tablou nou. Toate valorile sunt din tabloul originar intr-un tablou nou si apoi tabloul originar este sters din memorie. Daca prelucrati tablouri foarte mari, aceasta metoda poate cauza probleme.
Programarea in Access
Deoarece Microsoft Access 95 are inclus ca limbaj de programare limbajul Visual Basic, in cele ce urmeaza ne vom referi in principal la programarea in VBA si mai putin la limbajul Access Basic folosit in versiunea Access 2.0, iar Microsoft Access 97 are inclus tot limbajul Visual Basic.
VBA pune la dispozitia programatorilor cateva structuri diferite pentru bucle si pentru luarea de decizii. Cele mai utilizate dintre ele vor fi prezentate mai pe larg, cu exemple de cod.
If. Then . Else. Structura If. Then . Else evalueaza daca o conditie este adevarata sau falsa. Daca expresia este adevarata se executa blocul de instructiuni dintre If si Else, iar daca este falsa se executa toate instructiunile dintre Else si End If. Folosirea comenzii Else este optionala, in cazul nefolosirii ei executandu-se instructiunile dintre If si End If, doar daca conditia este adevarata.
Private Sub IfThenElse Click()
If IsNu11 (Me!Nume) Then
MsgBox "Introduceti o valoare in campul Nume!"
Else
MsgBox "Numele introdus
este:" & Me!Nume
End If
In cazul in care se doreste utilizarea mai multor structuri If. Then . Else imbricate, se poate folosi comanda ElseIf, in felul urmator:
Private Sub IfThenElse-Click()
If IsNu11 (Me!Nume) Then
MsgBox "Introduceti o valoare in campul Nume!"
Else If IsNull (Me!Prenume) Then
MsgBox "Introduceti o valoare in campul Prenume!"
Else
MsgBox "Numele si prenumele:" & Me!Nume & " "&Me!Prenume
End Sub
Select Case. In loc sa folosesti mai multe instructiuni If. Then.Else este mult mai simplu sa utilizati o instructiune case. Sa vedem cum se poate utiliza aceasta instructiune, urmarind exemplul urmator:
Private Sub SelectCase-Click()
If IsNull (Me!Varsta) Then
iResponse = 0
Else
iResponse = Me!Varsta
End If
Select Case !Response
Case 0
MsgBox "Introduceti varsta!"
Case 1 to 17
MsgBox "Persoana introdusa este minora!"
Case 18
MsgBox "Persoana introdusa are varsta de 18 ani!"
Case Else
MsgBox "Persoana introdusa este majora!"
End Select
Aceasta rutina utilizeaza in prima parte o instructiune If pentru a evalua daca campul Varsta este nul. In acest caz, rutina memoreaza un zero intr-o variabila numita iResponse. In caz contrar, valoarea continuta in campul Varsta este memorata in iResponse. Instructiunea case evalueaza continutul variabilei iResponse. Daca valoarea variabilei este 0, se afiseaza un mesaj "Introduceti varsta". Daca valoarea este intre 1 si 17 inclusiv, este afisat mesajul "Persoana introdusa este minora!". Daca in campul Varsta a fost introdusa valoarea 18 se va afisa mesajul "Persoana introdusa are varsta de 18 ani!", pentru orice alta valoare mesajul afisat fiind "Persoana introdusa este majora!".
Looping (Buclarea). In VBA sunt disponibile mai multe structuri ciclice, dar noi vom prezenta doar doua dintre ele. Prima structura este cu test la inceputul buclei, iar cea de-a doua are conditia la sfarsit.
Private Sub Loop1-Click()
Dim !Counter As Integer
iCounter = 1
Do While !Counter < 5
MsgBox !Counter
iCounter = iCounter + 1
Loop
End Sub
Aceasta structura nu asigura intotdeauna executarea secventei de cod din interiorul buclei (cel putin o singura data). Daca iCounter este mai mare sau egal cu 5, codul din interiorul buclei nu va fi executat niciodata.
Private Sub Loop2-Click ()
iCounter = 5
Do
MsgBox iCounter
iCounter = iCounter + 1
Loop While iCounter < 5
End Sub
Spre deosebire de prima structura, acest cod va fi executat cel putin o singura data, chiar daca iCounter este mai mare decat 5.
For . Next. Structura For. Next este folosita atunci cand doriti sa executati un numar fix de iteratii. Aceasta va arata astfel:
Private Sub ForNext-Click()
Dim iCounter As Integer
MsgBox iCounter
Next iCounter
End Sub
Se poate observa iCounter se auto-incrementeaza. Unei structuri For.. Next i se poate da, de asemenea, o valoare de incrementare (step):
Private Sub ForNext-Click()
Dim iCounter As Integer
For iCounter = 1 To 5 Step 2
MsgBox iCounter
Next iCounter
End Sub
Visual Basic pentru aplicatii contine o biblioteca de functii foarte bogata si cuprinzatoare. In continuare vom prezenta pe scurt doar cateva dintre ele, sugerandu-va ca in momentele de relaxare sa consultati helpul sau un manual de referinta pentru comenzi si functii, astfel incat sa va obisnuiti cu restul functiilor.
Format - formateaza expresiile in stilul specificat. Primul parametru este expresia pe care doriti sa o formatati, iar cel de-al doilea este tipul de format pe care doriti sa il aplicati
Instr - returneaza pozitia in care un sir se situeaza in interiorul altui sir
Left - functia care returneaza primele n caractere ale unui sir, unde n este un argument care indica numarul de caractere
Right - spre deosebire de left, functia Right returneaza ultimele n caractere ale unui sir, unde n este un argument care indica numarul de caractere
Mid - returneaza un subsir format dintr-un numar specificat de caractere dintr-un sir
Ucase - returneaza un sir cu toate caracterele majuscule
DatePart - returneaza o parte specificata a unei date
DateDiff - returneaza intervalul de timp dintre doua date
DateAdd - returneaza rezultatul adaugarii sau scaderii unei perioade specifice de timp la o (dintr-o) data stabilita.
Diferentele si asemanarile dintre VBA si alte limbaje
In functie de stilul dumneavoastra de programare, daca ati mai lucrat si cu alte limbaje, va veti adapta foarte usor cu unele aspecte ase limbajului Visual Basic pentru aplicatii, in timp ce cu altele vi se va parea incomod de lucrat. Fata de versiunile mai vechi de Basic, au fost schimbate domeniul si durata de valabilitate a variabilelor. Ca orice programator intr-un limbaj procedural, veti descoperi pentru prima oara paradigma orientarii pe evenimente. Pentru programatorii in Xbase trebuie mentionat ca inregistrarile din Access nu au numere de inregistrare si nu exista comanda de anulare a stergerii. Inregistrarile sunt excluse din tabel imediat ce sunt sterse. De asemenea, trecerea de la programarea orientata pe evenimente este o tranzitie dificila pentru programatorii in Xbase. Mai familiarizati cu limbajul VBA ar trebui sa fie programatorii in C. Functiile pot fi apelate fara atribuirea unei valori de returnare. Tipurile definite de utilizator pot deveni baza pentru alte tipuri definite de utilizator, permitandu-se astfel un echivalent al structurilor din C. Insa majoritatea programatorilor in C vor gasi greoaie metoda de tratare a erorilor din VBA.
Depanarea
Desi pentru a putea crea o aplicatie ar ajunge cunostintele pe care le-ati invatat pana acum, este foarte important sa stapaniti arta depanarii, deoarece un bun programator nu este neaparat unul caruia ii reusesc aplicatiile din prima incercare. Din fericire, mediul Access va ofera instrumente excelente pentru a va asista in cursul procesului de depanare. Depanarea este procesul de detectare si inlaturare a problemelor in cadrul programului dumneavoastra. Acest proces implica localizarea si identificarea problemelor in cadrul programului si este o etapa obligatorie in procesul de dezvoltare a aplicatiilor. Instrumentele de depanare ale mediului Access permit parcurgerea pas cu pas a programului, stabilind, dupa nevoie, puncte de intrerupere si puncte de supraveghere. Un punct de intrerupere este un punct in care executia programului va fi oprita neconditionat. In programul dumneavoastra, puteti stabili mai multe puncte de intrerupere. De asemenea, puteti adauga si sterge punctele de intrerupere in timpul executiei programului. Plasarea strategica a punctelor de intrerupere in cadrul programului dumneavoastra va da posibilitatea sa executati sectiunile de cod deja depanate si sa va opriti numai in zonele cu probleme.
Cea mai buna metoda de tratare a erorilor de program este,totusi, evitarea lor de la bun inceput. Tehnicile corecte de programare pot sa fie cu adevarat de folos in acest proces.
Folosirea instructiunii Option Explicit, definirea corecta a variabilelor, folosirea standardelor in denumirea variabilelor si stabilirea unor domenii stricte de valabilitate va pot ajuta sa eliminati erorile de program. In continuare vom prezenta toate aceste elemente care contribuie la eliminarea erorilor de programare.
Option Explicit cere ca toate variabilele sa fie declarate inainte de a fi folosite. Incluzand Option Explicit in fiecare modul de formular, cod sau raport, compilatorul VBA va gasi usor coincidentele in numele variabilelor.
A defini corect variabilele inseamna sa indicati tipul datelor care vor fi memorate intr-o variabila in momentul in care este declarata. De exemplu, instructiunea Dim i as Integer va initializa o variabila care contine valori intregi. Daca undeva in program atribuiti acestei variabile un sir, compilatorul va gasi eroarea.
Atentie
la utilizarea instructiunilor On
Error Resume si On Error
Resume Next!
Folosirea standardelor in denumirea variabilelor poate, de asemenea, sa va ajute foarte mult in eliminarea erorilor. O denumire atenta a variabilelor face codul mult mai usor de citit si face mai clara destinatia variabilelor.
Prin stabilirea unui domeniu de valabilitate cat mai restrans variabilelor dumneavoastra, reduceti sansele ca un fragment de program sa suprascrie accidental o variabila din alt fragment de program. Ideal ar fi sa folositi variabile locale oriunde este posibil. Folositi variabile globale (publice) sau de nivel modul numai cand este necesar sa vedeti valoarea unei variabile din mai multe subrutine sau din mai multe module.
Inainte de a incepe analizarea tratarii erorilor, sa analizam putin erorile pe care le puteti intalni. Exista trei tipuri de erori.
Erori de compilare. Aceste erori sunt rezultatul unei instructiuni gresit construite. Poate s-a uitat un cuvant rezervat, poate s-au omis ceva semne de punctuatie necesare. Access Basic si VBA detecteaza aceste erori inainte de executia codului, la compilarea sursei.
Erori run-time. Aceste erori apar (si sunt detectate de limbajul de programare) in timpul executiei programului, cand o instructiune incearca sa execute o operatie imposibila.
Erori logice de programare. Erorile logice de programare pot fi corecte din punct de vedere al sintaxei, pot efectua operatii admise, dar produc rezultate incorecte deoarece codul este gresit din punct de vedere logic.
Erorile apar chiar in absenta erorilor de programare. Este necesar sa va protejati programele si datele de efectele nedorite ale acestor erori. Acest lucru il realizati prin procesul de tratare a erorilor. Tratarea erorilor mai este cunoscuta si sub numele de detectarea erorilor. Tratarea erorilor este procesul de interceptare a raspunsului VBA la aparitia unei erori. Aceasta permite programatorului sa determine nivelul de gravitate al unei erori si sa actioneze corespunzator pentru a raspunde la aparitia acesteia. Fara tratarea erorilor, utilizatorul aplicatiei dumneavoastra este nevoit sa iasa brusc din aplicatie.
Sa analizam un pic urmatoarea functie simpla, FileExist.
Function FileExist (FileName)
FileExist = (Dir(fileName<>**))
End function
Aceasta functie returneaza TRUE daca fisierul specificat exista, si returneaza FALSE in cazul in care fisierul nu exista. Functia Dir returneaza numele fisierului in cazul in care fisierul este gasit la locatia specificata, si returneaza sirul vid in cazul in care fisierul nu este gasit. La prima vedere codul pare sa acopere toate cazurile care pot aparea dupa apelul functiei DIR. Dar, daca de exemplu unitatea de disc care a fost specificata in calea fisierului nu exista, atunci va apare eroarea Device unavailable. Daca fisierul este pe discheta si in unitatea de flopy nu este nici o discheta atunci se va genera eroarea Disk not ready si executia programului se va intrerupe.
Pentru a evita aceasta situatie, se foloseste tratarea erorilor. Functia de mai sus ar putea arata asa:
Function FileExist (fileName)
Dim Msg
On Error GoTo CheckError
FileExist = (Dir(fileName) <>**)
Exist Function
CheckError:
Const ERR-DISKNOTREADY = 71,
ERR-DEVICEUNAVAILABLE = 68
If Err = ERR-DISKNOTREADY) Then
Msg "Insert a flopy Disk in the drive"
If Msgbox (Msg, vbOKCancel) = vbOK Then
Resume
Else
Resume Next
End If
ElseIf Err = ERR-DEVICEUNVAILABLE Then
Msg = "This drive on path Does not exist: " + fileName
MsgBox (Msg, vbOKOnly)
Resume Next
Else
MsgBox Err, Description
Stop
End If
Resume
End Function
Ce se intampla in aceasta functie? La inceput se face apel la functia Dir. Daca aceasta functie genereaza o eroare, atunci eroarea este captata, si se sare cu executia programului la eticheta CheckError. Daca eroarea generata este ERR-DISKNOTREADY, atunci se afiseaza un mesaj ca utilizatorul sa introduca o discheta. In cazul in care utilizatorul doreste sa introduca discheta, atunci se incearca citirea din nou a dischetei, altfel se paraseste functia. Daca eroarea generata este ERR-DEVICEUNAVAILABLE, atunci se afiseaza un mesaj de eroare generat de program si se paraseste functia. In cazul in care s-a generat o eroare neasteptata, atunci se afiseaza eroarea, care de data aceasta nu este generata de program, si se paraseste functia.
O instructiune On Error activeaza procesul de tratare a erorilor. In cazul in care doriti ca fiecare rutina sa trateze erorile prin propriile metode, fiecare dintre rutine trebuie sa cuprinda propria sa instructiune On Error. Astfel, procesul de tratare a erorilor va umple in cascada stiva de apeluri. Daca in stiva de apeluri nu este gasita nici o instructiune On Error va fi apelata procedura de tratare a erorilor a limbajului VBA. Folosind o instructiune On Error, determinati aplicatia sa execute procedura de tratare a erorilor, reluand executia de pe linia imediat urmatoare erorii, sau sa astepte reexecutarea liniei de program cu probleme. Trebuie sa va decideti asupra raspunsului corespunzator pentru fiecare eroare. Uneori este mai indicat ca aplicatia dumneavoastra sa se intrerupa cand raspunde la o eroare. Alteori, este cel mai bine ca rutina sa sara intreaga linie cu probleme. Puteti trata corespunzator fiecare eroare combinand folosirea optiunilor On Error GoTo, On Error Resume Next si On Error Resume.
Instructiunea On Error Goto <label> informeaza VBA, ca, incepand din acest punct, daca apare o eroare, trebuie sa sara la eticheta specificata in instructiune. Este cea mai uzuala metoda de tratare a erorilor. Eticheta specificata in instructiunea On Error trebuie sa existe in procedura si trebuie sa fie unica in cadrul unui modul. Secventa urmatoare de cod ilustreaza un exemplu simplu de tratare a erorilor.
Sub Calculate ( iVar1 As Integer, iVar2 As Integer)
On Error GoTo Error-Handler
Dim rez as Long
Rez = iVar1/iVar
Exist-Sub:
Exit Sub
Error-Handler:
MsgBox Err & ":" & Error
Resume Exit-Sub
End Sub
Functia Err returneaza codul erorii, iar functia Error returneaza eroarea.
Instructiunea On Error Resume Next continua executia programului de la linia imediat urmatoare erorii. Aceasta structura este folosita in mod obisnuit in situatiile in care este mai bine sa fie ignorata o eroare si sa fie continuata executia programului. In exemplul urmator este prezentata o astfel de eroare:
Sub DeleteFile (pFileName)
On Error Resume Next
Kill pFileName
End Sub
Instructiunea Kill este folosita pentru a sterge un fisier de pe disc. Daca fisierul respectiv nu este gasit, apare o eroare. Deoarece doriti sa stergeti fisierul numai daca acesta exista, nu va ingrijoreaza aparitia erorii. Instructiunea On Error Resume Next este foarte potrivita in acest caz, deoarece aplicatia nu este afectata prin continuarea executiei dupa linia cu probleme.
Instructiunea On Error Resume continua executia programului de la linia care a provocat aparitia erorii. Aceasta structura trebuie sa fie folosita cu atentie, deoarece poate trimite programul intr-o bucla infinita, din care nu se mai poate iesi.
Daca Access-ul nu a gasit nici o procedura de tratare a erorilor intr-o subrutina sau functie, cauta in stiva de apeluri un program anterior de tratare a erorilor. Acest caz este ilustrat in fragmentul de cod urmator:
Sub Func1 ()
On Error GoTo Handler-Func1
Debug.Print "Ne aflam in Functia 1"
Call Func2
Debug.Print "Am revenit in Functia 1"
Exit Sub
Handler-Func1:
MsgBox "Eroare in Functia 1 : " &
Error
Resume Next
End Sub
Sub Func2 ()
Debug-Print "Ne aflam in Functia 2"
Call Func3
Debug-Print "Ne aflam inca in Functia 2"
End Sub
Sub Func3 ()
Dim rez As Single
Debug-Print "Ne aflam in Functia 3"
Rez = 5 / 0
Debug.Print "Ne aflam inca in Functia 3"
End Sub
In aceasta situatie, eroarea apare in functia Func3. Deoarece functia Func3 nu are propria procedura de tratare a erorilor, se face referire inapoi la functia Func2. Nici aceasta nu are o procedura de tratare a erorilor. Functia Func2 abandoneaza controlul in favoarea functiei Func1, astfel ca VBA executa codul de eroare in Func , pe linia Debug Print "Revin in Functia 1". Acest tip de tratare a erorilor este periculos si confuz. De aceea, cel mai bine este sa proiectati o rutina generala de tratare a erorilor care sa fie accesata in afara aplicatiei dumneavoastra.
Un program general de tratare a erorilor este o procedura de tratare a erorilor care poate fi apelata de oriunde din aplicatia dumneavoastra si are capacitatea de a raspunde la orice tip de eroare. Un program general de tratare a erorilor preintampina scrierea unor proceduri specifice de tratare a erorilor de oriunde din aplicatie in cel mai eficient mod posibil. Acest program ar trebui sa furnizeze utilizatorului informatii despre eroare, sa permita utilizatorului sa tipareasca aceste informatii si sa memoreze informatiile intr-un fisier.
Obtinerea accesului la datele externe
Microsoft Access asigura posibilitatea de interfata cu date din alte surse. Poate utiliza date din orice sursa de date ODBC, ca si date din FoxPro, dBase, Paradox, Lotus, Excel si multe alte aplicatii. Datele externe sunt memorate in afara bazei de date curente. Access este un produs excelent de tipul front-end. Aceasta inseamna ca asigura metode eficiente si puternice de prezentare a datelor, inclusiv a datelor externe. Datele sunt pastrate in diferite locuri in afara Access-ului din mai multe motive. De exemplu bazele de date de mari dimensiuni pot fi administrate mult mai eficient pe un server de baze de date back-end, cum ar fi Microsoft SQL Server. Deseori, informatiile sunt inregistrate in fisiere FoxPro, dBase sau Paradox deoarece sunt utilizate de aplicatii mai vechi scrise in aceste medii de programare.
Datele de tip Access pot fi pastrate si in alte baze de date decat baza de date a aplicatiei dumneavoastra.
Fisierele create in FoxPro, dBase si Paradox inregistreaza datele in format ISAM (Indexed Sequential Access Method). Ca sa puteti accesa fisiere ISAM trebuie sa instalati driverele necesare pentru comunicarea cu un fisier de tip ISAM.
Legaturile cu datele externe pot fi create usor folosind instrumentele front-end puse la dispozitie de Access. Pentru a crea o legatura cu un tabel din alta baza de date Access sau din oricare baza de date, executati clic pe butonul drept al mouse-ului pe un a din etichetele bazei de date si apoi selectati optiunea Link tables sau selectati optiunea Get External Data din meniul File si apoi alegeti eticheta Link External Data. Va aparea pe ecran caseta de dialog din care trebuie sa selectati numele fisierului si tipul fisierului cu care doriti sa faceti legatura.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2492
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved