|
LUCRAREA DE LABORATOR
Module, functii si subrutine: elaborarea unor secvente de program vizand modalitati de transfer a datelor intre programul apelant si cel apelat. Particularitatile unei functii.
Cuprinsul lucrarii 1
Generalitati_module_proceduri
Mediul_VBA
Crearea_modulelor_standard
Fereastra_Code_Builder
Sintaxa_unor_instructiuni
Antetul_functie_sau_subrutina
Apelul_procedurilor
Transferul_datelor_spre_procedura
O_solutie_posibila
Scrieti o functie numita Produs care calculeza produsul a doua numere X si Y de tip single. Produsul va fi de tip Double.
Inainte de a se incheia, functia mai contine o instructiune de forma X=Y*Y
Functia va fi apelata de o subrutina numita Suprafata care cere de la utilizator lungimea si latimea unui dreptunghi si calculeaza aria dreptunghiului cu ajutorul functiei Produs apelata astfel ca in locul lui X sa vina lungimea (lg) si in locul lui Y sa vina latimea (lt).
In continuare, subrutina Suprafata afiseaza mesajul "Suprafata dreptunghiului este de m.p.", unde in locul punctelor este data suprafata dreptunghiului si apoi afiseaza valoarea lungimii (lg) sub forma: "Valoarea lungimii este acum de .metri".
Initial functia Produs va primi valorile parametrilor actuali prin valoare. Ulterior modificati functia astfel ca parametrii actuali sa fie preluati prin referinta.
La fiecare rulare a subrutinei Suprafata notati valorile cu care ati apelat acesta subrutina si valoarea pe care a a fisat-o ea pentru lungime.
Explicati in scris rezultatele obtinute la fiecare rulare.
Suport teoretic pentru lucrarea 1
1. Generalitati despre module si proceduri (functii si subrutine
In majoritatea aplicatiilor de baze de date au loc foarte multe actiuni pe care nu le vedem pe ecran. Calculele, validarea datelor, efectele grafice si comunicarea intre obiectele bazei de date sunt tratate, de obicei de secvente de cod scrise special pentru aceste operatii si memorate in module. Daca tabelele, interogarile, formularele si rapoartele reprezinta componentele principale ale unei baze de date Access, modulele constituie liantul care le uneste.
Modulele pot fi structurate pe functii si subrutine. Grupurile de functii si subrutine scrise in limbajul standard VisuaL Basic for Applications asigura toate functionalitatile unei baze de date. Practic, prin includerea modulelor de cod intr-o baza de date, aceasta se transforma dintr-un depozit de stocare a informatiilor intr-o aplicatie, adica un mediu in care utilizatorii efectueaza operatii cu datele.
Modulele Access sunt de doua tipuri:
- module standard, de sine statatoare, care au atribuite nume si pot exista independent de orice obiect din baza de date; Cuprinsul_lucrarii_1
module de clasa. Acestea sunt containere cu proceduri asociate obiectelor de pe formulare sau rapoarte. Ele se copiaza sau se sterg odata cu formularul sau obiectul de care apartin.
2. Mediul VisuaL Basic for Applications
Incepand cu Microsoft Office '97, s-a incercat standardizarea programarii la nivelul tuturor componentelor Microsoft Office. Limbajul in care s-a realizat acest lucru este
VisuaL Basic for Applications. Mediul standard de programare in VisuaL Basic for Applications este Visual Basic Editor. Totusi din dorinta de a mentine compatibilitatea cu codurile scrise pentru Access in versiunile anterioare, pentru Access s-a facut o exceptie si ca urmare, in Access programarea se face cu ceea ce se numeste Code Builder. Visual Basic Editor poate fi lansat din Word, Excel, Microsoft Outlook si din Power Point. De ex. pentru a lansa Visual Basic Editor din Word, vom lansa Word-ul, apoi clic pe meniul Tools, selectam Macro si apoi optiunea Visual Basic Editor.
3. Crearea modulelor standard din fereastra Code Builder
Pentru a crea un modul standard nou in fereastra Database, vom proceda astfel:
- selectam butonul sau la versiunea '97, pagina Modules;
- clic pe butonul New;
apare fereastra Code Builder, care arata astfel:
Bara de Titlu (numele modulului curent)
Caseta Object Caseta Procedures
Sectiunea Declarations
Sectiunea Procedures
Pv= butonul Procedures View
Mv= butonul Module View
Pv Mv Bara de defilare orizontala
De regula, modulele contin mai multe proceduri (procedures), care la randul lor, pot fi de doua feluri: functions (functii) si subroutines (subrutine). In structura unui modul se disting doua parti; una care contine declaratii de variabile globale si optiuni cu privire la modul in care se vor rula procedurile din compunerea modulului si aceea se va edita in sectiunea Declarations si una care contine procedurile (mai exact instructiunile din care se compun procedurile), din compunerea modulului si care se numeste sectiunea Procedures.
Cand fereastra Code Builder a fost deschisa pentru a edita coduri de clasa, caseta Object (care este un combobox) contine numele tuturor obiectelor din formularul sau raportul din care s-a ajuns in fereastra Code Builder. dar in cazul modulelor standard, acestea nefiind legate de un obiect, caseta Object, nu contine decat cuvantul General (insemnand ca modulul este general valabil, deci nu este legat de vreun obiect). In cazul modulelor de clasa, daca selectam un obiect din caseta Objects, pe ecran va aparea lista instructiunilor din modulul asociat acelui obiect, iar daca nu are un modul, putem edita unul nou.
Caseta Procedures (care este tot un combobox), contine lista ordonata alfabetic, a procedurilor (subrutine si functii) definite in modulul curent. In acest combobox este inclusa si sectiunea Declarations. Cuprinsul_lucrarii_1
Din aceasta caseta putem selecta o procedura care va fi vizibila pe ecran. Functionarea acestei liste ascunse este legata de modul de lucru al butoanelor Procedures View si Modules View.
Butonul Modules View determina listarea fiecarei proceduri intr-o sectiune separata la care se poate ajunge direct din caseta Procedures.
Butonul Procedures View (care este optiunea implicita), afiseaza intr-o singura lista toate procedurile (declaratii, subrutine si functii) din modulul curent.
Liniiile goale nu influienteaza executia codului ca in cazul macrourilor, dar sporesc lizibilitatea codului. Programul Access coloreaza automat instructiunile din modulul afisat, dupa cum urmeaza:
- cu albastru, cuvintele rezervate;
- cu negru partea variabila a instructiunilor;
- cu verde, comentariile. Acestea trebuie sa fie precedate de un apostrof. Access ignora tot ce exista intre apostrof si sfarsitul liniei;
- cu rosu erorile care nu pot fi interpretate de interpreterul Access.
Verificarea permanenta a erorilor, poate deveni la un moment dat suparatoare, mai ales pe timpul editarii modulului si acest lucru poate fi evitat cu Tools/Options/ Module si dezactivam optiunea Auto Syntax Check.
La un moment dat putem avea deschise mai multe ferestre, fiecare cu modulul ei, exact cum in Word putem avea deschise mai multe fisiere.
Editarea unui modul nou (daca este cazul unui modul de clasa, dupa ce am stabilit pentru cine este destinat), va incepe in modul Modul View, in sectiunea Declarations unde vom declara variabilele globale cu instructiuni de tip Dim si apoi optiunile folosind instructiuni de tip Option (ex. Option Explicit).
Trecand in sectiunea Procedures, vom incepe cu Sub daca dorim sa editam o subrutina sau cu Function, daca dorim sa editam o functie. Evident dupa cuvantul Sum sau Function vom continua cu numele subrutinei sau functiei respective, urmat in paranteza de lista parametrilor cu care se apeleaza. Cand am dat Enter, Access automat trage o linie deasupra textului inscris de noi, separandu-ne astfel textul nostru de sectiunea Decla-rations si in acelasi timp, sub linia noastra va scrie End Sub si respectiv End Function.
Restul instructiunilor le vom scrie intre cele doua linii extreme.
Acolo, daca avem de declarat variabile locale, putem folosi instructiunea Dim, chiar daca a mai fost folosita in sectiunea Declarations. Acest lucru este posibil pentru ca sectiunea Declarations se refera la declaratii de variabile globale, pe cand in procedura facem declaratii de variabile locale.
Privitor la instructiunile din procedura trebuie stiut ca atunci cand scriem un cuvant cheie pe care programul Access il recunoaste, pe ecran este afisata automat o referinta a sintaxei comenzii respective. Aceasta facilitate se numeste Auto Quick Info, iar daca dorim s-o dezactivam vom da clic pe Tools/Options/Module si vom deselecta Auto Quick Info. Sa retinem ca atunci cand exista mai multe solutii, fereastra Auto Quick Info, ne prezinta variante de editare a instructiunii la care se refera.
Pentru compilarea (interpretarea) textului procedurii se poate da clic pe butonul Compile Loaded Modules de pe bara cu instrumente, sau se poate selecta optiunea Compile din meniul Debug.
Modulul astfel construit
se va salva in cazul modulelor standard cu File/Save iar in cazul
modulelor de clasa, prin simpla salvare a obiectului care contine
controlul caruia i-am atasat un modul.Daca dorim sa
salvam codul ca un fisier text, vom folosi optiunea Save As.
din meniul File. Rularea unei proceduri se poate face cu butonul Go/Continue de pe bara cu instrumente
sau din optiunea Run. Cuprinsul_lucrarii_1
In caz de eroare apare o caseta de dialog cu butoanele End, Debug si Help. Daca alegem Debug instructiunea care a produs oprirea programului apare scrisa pe fond galben. Trebuie sa facem corectura si apoi sa apasam pe Go/Continue. Daca dorim sa facem altceva, de exemplu sa verificam daca nu cumva cauza erorii este lipsa unor module din biblioteca, atunci din submeniul Run, alegem, optiunea Reset si apoi din Tools alegem Reference. De acolo putem aduce si alte module (biblioteci) decat cele invocate de Access in mod implicit.
4. Precizari privind sintaxa principalelor instructiuni din proceduri.
Informatii detaliate despre orice cuvant cheie din Access se pot obtine selectand cuvantul respectiv si apasand tasta F1.
a) Sintaxa unei instructiuni Dim se poate deduce din exemplul urmator:
Dim NumarDeSalariati As Integer
Aceeasi instructiune poate fi folosita pentru a declara tipul de obiect al unei variabile:
Dim X As New Worksheet
Sintaxa completa a instructiunii Dim este urmatorea:
Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] varname[([subscripts])] [As [New] type]] . . .
unde parantezele drepte indica parametri optionali. De ex. [WithEvents] este optional si se foloseste numai la modulele de clasa. Clauza New este folosita in legatura cu variabile de tip obiect si este optionala, dar daca nu este specificata, atunci inainte de a folosi variabila de tip obiect, trebuie sa-i asignam o valoare cu ajutorul instructiunii Set.
b) Antetul de functie si de subrutina
Exemplu:
Function Rad_patrata Numar As Double) As Double
sau:
Sub HouseCalc(price As Single, wage As Single)
Sa remarcam deosebirea intre un antet de functie si unul de subrutina: primul se incheie cu tipul variabilei produse de functie ( de ex functia Rad_patrata, returneaza o valoare double), iar al doilea se opreste la paranteza de inchidere a listei cu parametri (aceasta pentru ca nu returneaza nici o valoare).
c) Alte particularitati ale functiilor
Inainte de a termina editarea instructiunilor dintre titlul procedurii si sfarsitul sau, daca acesta este o functie, vom prevedea cel putin o instructiune prin care sa asignam valoarea returnata de functie.
Exemplu:
Function Rad_patrata Numar As Double) As Double
If Numar < 0 Then ' Evaluam argumentul.
Exit Function ' Iesire in procedura care a apelat-o.
Else
Rad_patrata = Sqr(Numar) ' Returneaza radacina patrata.
End If
End Function
d) Apelul procedurilor
Procedurile se apeleaza din alte proceduri citandu-le numele in cadrul unor expresii, dar avand grija sa prevedem valorile parametrilor cu care se apeleaza procedura.
De exemplu:
S = 5 Cuprinsul_lucrarii_1
Print Rad_patrata(S)
Apelarea se poate face si citand pur si simplu numele procedurii:
Sub Main()
HouseCalc 99800, 43100
Call HouseCalc(380950, 49500)
End Sub
dar si aici se disting doua situatii: cand se foloseste cuvantul Call (atunci argumentele trebuie puse in paranteze) si fara Call (acesta fiind facultativ). Procedura House Calc este data mai jos:
Sub HouseCalc(price As Single, wage As Single)
If 2.5 * wage <= 0.8 * price Then
MsgBox 'Nu va puteti permite aceasta casa.'
Else
MsgBox 'Aceasta casa v-o puteti permite.'
End If
End Sub
e) Modalitati de transfer a datelor intre programul apelant si cel apelat
Exista modul de transfer prin valoare (ByVal) si prin adresa sau referinta (ByRef), acesta din urma fiind implicit. Modul de transfer se specifica inaintea argumentului din titlul procedurii, ca in exemplul de mai jos, unde X si Y sunt parametri formali
5. Cateva situatii in care procedurile sunt inevitabile
- Cand avem multe macrouri in baza noastra de date, acea baza de date este greu de intretinut pentru ca macrourile sunt obiecte separate de formulare sau de rapoarte. Procedurile scrise in VBA si incorporate in module de clasa sunt incluse in definitia formularelor sau rapoartelor astfel ca atunci cand un raport sau un formular este mutat dintr-o baza de date in alta, procedurile legate de evenimente se muta automat odata cu el.
- VBA dispune de multe functii incorporate, dar ne permite sa construim si functii proprii. Aceste functii sunt necesare atunci cand vrem sa facem calcule pentru care in Microsoft Access nu exista functii incorporate sau cand calculele depasesc capacitatea unei expresii. Functiile create de noi in Visual Basic pot fi incorporate in expresii si mai exact in diferite expresii, in locuri diferite.
- Cu functiile Visual Basic se pot masca anumite mesaje de eroare cu care un utilizator
n-ar sti ce sa faca. Cu functiile create de noi putem detecta o eroare cand apare si putem da un mesaj pe intelesul utilizatorului sau putem actiona astfel incat sa corectam greseala.
- Cu Visual Basic noi putem iesi in afara produsului Microsoft Access, de exemplu sa vedem daca un fisier de care avem nevoie este in calculator sau nu.
- Cu Visual Basic putem actiona asupra articolelor, cate unul pe rand, ceea ce cu macrouri nu se poate face (vezi exemplul de la punctul 4).
- In Visual Basic putem pasa valori pentru argumentele functiilor chiar in timpul rularii ceea ce nu se poate face cu argumentele unui macro. Mai mult, functiile accepta argumente sub forma de variabile (exista si variabile obiect), ceea ce permite o schimbare dinamica a argumentelor lor.