Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

LUCRAREA DE LABORATOR - Module, functii si subrutine: elaborarea unor secvente de program vizand modalitati de transfer a datelor

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

Function Produs( ByVal X as single, ByVal Y as single) as single



Produs=X*Y

End Function

Aceasta functie poate fi apelata prin citarea numelui sau insotit de parametrii actuali, ca in exemplul urmator

Aria Produs(lt,lg)

Cand parametrii formali sunt declarati Byref, la compilare lor nu li se rezerva spatiu in memorie, astfel ca la apelarea procedurii, prelucrarile care implica prezenta parametrilor formali (in cazul de fata Produs=X*Y) se vor executa cu ceea ce se gaseste in zona de memorie rezervata parametrilor actuali (in cazul de fata Produs=lt*lg), iar daca aceste prelucrari presupun modificarea valorii parametrilor formali (de exemplu X=Y*Y) , astfel de modificari se vor face simtite asupra parametrilor actuali.

Cand parametrii formali sunt declarati Byval, la compilare lor li se rezerva spatiu in memorie, astfel ca la apelarea procedurii, zona rezervata acestor parametri este umpluta cu valorile parametrilor actuali corespunzatori fiecarui parametru formal declarat cu clauza Byval.

In aceste conditii, prelucrarile care implica prezenta parametrilor formali (cei specificati in antetul procedurii) se vor executa cu ceea ce se gaseste in zona de memorie rezervata parametrilor formali (in cazul de fata Produs=X*Y, unde X=lt si Y=lg), iar daca aceste prelucrari presupun modificarea valorii parametrilor formali, astfel de modificari nu se vor face simtite asupra parametrilor actuali.

Cu alte cuvinte transferul valorilor prin ByrRef, face economie de memorie si daca in procedura se produc modificari ale parametrilor formali, acele modificari vor fi exercitate de fapt, asupra parametrilor actuali. Transferul valorilor prin ByVal, face un consum mai mare de memorie, dar daca in procedura se produc modificari ale parametrilor formali, acele modificari nu vor afecta valorile parametrilor actuali. In practica uneori noi apelam o procedura cu un anumit parametru actual, tocmai pentru a-i modifica valoarea acestuia, alteori il cedam procedurii doar pentru a fi folosit in niste calcule, dar dorim ca valoarea lui sa ramana neschimbata. Cuprinsul_lucrarii_1

In aceste conditii, in functie de ceea ce urmareste sub aspectul consumului de memorie si mai ales in ce priveste efectul prelucrarilor din procedura asupra parametrilor actuali, programatorul este cel care decide cum sa fie transferata valoarea fiecarui parametru actual catre procedura.

In acelasi antet de procedura unii parametri pot fi apelati Byval, altii ByRef. Apelarea ByRef este implicita, deci nu trebuie declarata explicit.

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.


(O solutie posibila la aceasta lucrare de laborator)

Function Produs(Byval X As Single, ByVal Y As Single) As Double

Produs = X * Y

X = Y * Y

End Function


Sub Suprafata()

Dim lg As Single, lt As Single

Dim aria As Double

lg = InputBox('lg=')

lt = InputBox('lt=')

aria = Produs(lg, lt)

' Cand parametrii functiei Produs vor fi primiti ByRef, s-ar putea sa primiti o eroare

' care se poate elimina punand parametrii actuali (lg si lt) fiecare intre paranteze

' Pentru mai multe explicatii, cand apare eroarea apasati pe butonul Help.

MsgBox 'Suprafata este de ' & aria & 'm.p.'

MsgBox ' lungimea are acum valoarea ' & lg

End Sub                  Cuprinsul_lucrarii_1