|
LUCRAREA DE LABORATOR
Utilizarea unei QueryDef pentru imbunatatirea performantelor
unui formular
(durata 4 ore)
Cuprins lab 5
O varianta de solutie la pb. 3
Pasii de parcurs in utilizarea
unei QueryDef
Problema 4
Problema 5
1. Sa se elaboreze formularele asociate tabelelor PlanConturi, Matrice_debit, Matrice_credit, Functionare_cont debit, Functionare_cont_credit, Conturi radacina, Evol_rad_cont, Registru_jurnal si Adaos_jurnal din baza de date Examen.
2. Cand proiectam un formular ne gandim sa-l facem cat mai "prietenos". De exemplu s-ar
putea ca atunci cand utilizatorul completeaza tabelul Adaos_jurnal, folosind formularul cu acelasi nume, sa vrea sa stie care sunt conturile cu care se debiteaza contul din coloana cont_debitor. Ar fi o surpriza placuta pentru el, daca dand un dublu clic pe contul debitor din acest formular, i-ar aparea o lista cu conturile cu care se debiteaza acel cont.
Problema are doua solutii: una mai ocolita, dar mai simpla, alta mai complicata, dar mai eleganta; amandoua insa presupun atasarea de evenimetul Double click al casetei de text Cont_debitor, a unei proceduri care apeleaza o interogare. Prima solutie presupune apelarea unei interogari cu parametru (parametru fiind contul pentru care dorim sa aflam cu cine se debiteaza), iar a doua presupune apelarea unei interogari in format SQL tot cu parametru, dar utilizatorul nu mai trebuie sa introduca el parametrul pentru ca interogarea va lua automat drept parametru, contul debitor al articolului curent.
Rezolvati aceasta problema prin prima metoda, pentru caseta de text cont_debitor.
Indicatie: Pentru aceasta varianta va trebui sa definiti mai intai o interogare ca cea din imaginea de mai jos. Procedura atasata campului cont debitor nu va face decat sa lanseze interogarea in executie. Lansarea ei se va face cu comanda DoCmd.OpenQuery "<nume interogare>".
3. Sa aplicam a doua varianta (bazata pe o QueryDef) pe caseta de text cont_creditor.
Indicatie Se stie ca o QueryDef este un obiect DAO bazat pe o interogare in SQL. Pentru a dispune de o astfel de interogare noi trebuie sa modificam interogarea generata la punctul 2 astfel ca ea sa ia date din tabelul Funct_cont_credit si apoi sa o transformam in una de tip append (adaugare) la un tabel de manevra de exemplu Extras_functionare_credit. Ulterior, vom lua aceasta interogare, in Design Mode, din meniul View, optiunea SQL, cu Copy (Ctrl/C) si o vom ducem cu Paste (Ctrl/V), in modulul de clasa al formularului Adaos_jurnal, mai exact in procedura ce se deschide la selectarea cu DoubleClick a casetei cont_creditor. in prealabil trebuie sa o.
Pentru aceasta vom deschide formularul Adaos_jurnal, in modul Design, vom selecta caseta cont_creditor si evenimentul DoubleClick, iar in subrutina care apare in ferestra constructorului de programe, vom declara si atribui valori unei baze de date (DAO) si unei QueryDef, a carei definitie va contine si partea adusa din grila QBE si apoi vom atribui o valoare parametrului interogarii, prin intermediul unei variabile (si nu a unui cont_credit anume asa cum o facea utilizatorul la punctul 2 cu cont_debit). Pentru aceasta, in subrutina , cont_creditor_ DoubleClick care apare in modulul de clasa, trebuie sa declaram si o variabila de tip parametru (parameter). In continuare vom goli printr-o comanda DoCmd.OpenQuery tabelul Extras_functionare_credit de datele ramase de la precedenta rularea acestei queryDef, vom lansa interogarea in executie si apoi vom rula un macro care deschide formularul asociat tabelului Extras_funct_credit. Acesta contine cimpurile nr_cont, cont_relatie, denumire_cont, cu aceleasi atribute ca si campurile tabelului Funct_cont_credit, din care interogarea QueryDef extrage date.
Toate etapele de mai sus se pot vedea in anexa.
4. In loc sa atasati interogarile de mai sus campurilor cont-debitor si cont_creditor, stergeti label-ul referitor la aceste campuri (pentru demonstratie este suficient numai unul din ele) si inlocuiti-l cu un buton a carui caption este chiar denumirea campului a carui label l-am sters. Acum interogarile (respectiv procedurile care contin aceste interogari) nu vor mai fi lansate in executie la double click ci la evenimentul click al butonului creat de voi.
5. Sa observam ca procedurile incluse in module de clasa (proceduri legate de evenimente), se folosesc nu numai pentru a-i usura munca utilizatorului, dar si pentru a fi siguri ca o procedura logica odata inceputa, este dusa automat pana la capat. De exemplu sa presupunem ca la un moment dat utilizatorul a mai introdus un cont in planul de conturi si vrem sa fim siguri ca nu va uita sa-i precizeze si conturile corespondente cu care se debiteaza sau se crediteaza acel cont.
Pentru aceasta rezolvati urmatoarea problema: atasati fomularului PlanConturi (chiar obiectului form) prin evenimetul OnClose, o procedura care sa apeleze formularul Functionare_cont_debit. In acest fel utilizatorul, cu sau fara voia lui, la iesirea din formularul PlanConturi se va trezi in fata cu formularul Functionare_cont_debit pentru a completa si conturile corespondente noului cont.
Indicatie: Procedura va contine o singura instructiune si anume
DoCmd.OpenForm "Functionare_ cont_debitor". Mai multe informatii despre obiectul DoCmd gasiti in Anexa la Lab_III_3, sectiunea 3, sau scriind acest cuvant in procedura la care lucrati, venind cu cursorul in interiorul cuvantului si apasand tasta F1, cand veti obtine un help pe acesta tema!
Anexa 1. O varianta posibila la problema 3
Private Sub cont_creditor_DblClick()
' Pentru a putea afisa conturile corespondente cu care se debiteaza un cont dat, rulam
' o interogare append cu un parametru (prezenta aici sub forma de SQL), a carui valoare va fi chiar contul din campul cont_credit al articolului curent din formularul cuprinsul lucrarii 5
Adaos_jurnal. Interogarea adauga datele obtinute, la tabelul Extras_functionare_credit. In continuare, pe acest tabel rulam interogarea Se_crediteaza_cu, care produce lista de care are nevoie utilizatorul formularului Adaos_jurnal.
' Definim o QueryDef numita qdftemp
Dim qdfTemp As QueryDef
' Definim prmdata ca o variabila de tip parameter
Dim prmdata As Parameter
' Definim baza de date ca un obiect DAO de tip database
Dim dbscontabil As Database
Set dbscontabil = CurrentDb
' Atribuim valori obiectului qdftemp. Partea dreapta a instructiunii care urmeaza este
valabila pentru orice querydef. Specificul celei cu care lucram acum, incepe abia de pe randul urmator unde vom depune ce am adus din grila QBE.
Set qdfTemp = dbscontabil.CreateQueryDef('', _
'INSERT INTO extras_functionare_credit ( nr_cont, contul_relatie, den_cont )' & _
' SELECT funct_cont_credit.nr_cont, funct_cont_credit.contul_relatie, PlanConturi.den_cont' & _
' FROM funct_cont_credit INNER JOIN PlanConturi ON funct_cont_credit.contul_relatie = PlanConturi.cod_cont' & _
' WHERE (((funct_cont_credit.nr_cont)=[prmdata]))')
' Atentie la felul cum se continua randurile acestei interogari si la faptul ca fiecare rand, incepe cu un blanc si se pune intre ghilemele. Ultima paranteza de pe randul Where
' inchide paranteza inceputa pe primul rand ( cel care incepe cu Set qdfTemp).
' In randul precedent am modificat textul pus intre paranteze patrate, (cel prin care in
' QBE ceream valoarea parametrului) cu numele parametrului declarat mai sus ca fiind ' de tip parameter, adica cu prmdata.
DoCmd.OpenQuery 'GOLESC_EXTRAS_FUNCT_credit'
' atribuim valoare parametrului prmdata, invocand metoda Parameters a obiectului
' qdfTemp.
qdfTemp.Parameters('prmdata') = cont_creditor
' Lansam interogarea cu parametru:
qdfTemp.Execute
dbscontabil.Close
MsgBox 'Pentru a vedea conturile cu care se crediteaza contul ' & cont_creditor & vbCr & _
'asteptati cca 3 secunde si apoi apasati OK'
' rulam macroul care deschide formularul Extras_funct_credit
DoCmd.RunMacro 'se_crediteaza_cu'
End Sub
cuprinsul lucrarii 5
Concluzie
Pasii necesari pentru a lucra cu o QueryDef sunt
declararea unei variabile de tip QueryDef si a uneia sau mai multor variabile de tip Parameters (depinde cati parametri are interogarea)
atribuirea de valori variabilei de tip QueryDef adica scrierea interogarii sub forma SQL in continuarea instructiunii Set . = dbscontabil.CreateQueryDef('', _
atribuirea de valori parametrilor declarati ca fiind de tip Parameters
rularea interogarii cu comanda ..Execute (in locul punctelor fiind numele QueryDef)
Celelte elemente pregatitoare, cum ar fi golirea inainte de rularea QueryDef a tabelui de destinatie a datelor aduse de QueryDef, deschiderea cu un macro a unui formular asociat tabelului umplut cu append de QueryDef, sunt aspecte specifice fiecarei probleme, dar nu trebuie neglijate.