|
Lucrul cu tabele in VBA. Elaborarea unei proceduri pentru optiunea
Simulare transa din meniul unei aplicatii de contabilitate.
(durata 4 ore)
Aceasta lucrare se va desfasura pe baza de date Contabilitate care este conceputa pentru un program (aplicatie) de contabilitate ce va fi elaborat de studenti in cadrul orelor de laborator, pe baza solutiei propuse tot de ei ca o aplicatie la cursul de proiectare sisteme informatice. In aceasta lucrare veti scrie un program care face pregatirile necesare pentru obtinerea fisei contului, mai precis, creeaza un tabel numit Evolutie_sold_cont, din care intr-o alta lucrare de laborator, se vor obtine fisele conturilor. Aceste pregatiri sunt defalcate pe trei pasi si anume:
- Extragerea soldurilor de luna trecuta din tabelul PlanConturi intr-un tabel de manevra numit Sold_conturi, in care fiecare tranzactie din luna care s-a incheiat isi va face simtit efectul asupra conturilor implicate in formula sa contabila. Tabelul Sold_conturi are macheta urmatoare:
- Parcurgerea secventiala a tabelului Adaos_jurnal (care contine tranzactiile din luna curenta luate din registrul jurnal) si pentru fiecare tranzactie din acest tabel, pe langa faptul ca vor fi afectate soldurile conturilor din tabelul Sold_conturi implicate in formula sa contabila, se vor genera in tabelul Impact_rulaj_sold cate doua articole: unul pentru contul debitor si altul pentru contul creditor. Aceast tabel are o structura apropiata de cea a notei contabile (contine campul cont, cont corespondent, dar desi pentru valoare nu i-ar trebui decat un camp, el le contine pe ambele adica valoare cont_debit si valoare cont_credit, desi una din ele va fi intotdeauna zero). Tabelul Impact_rulaj_sold va putea fi vizualizat de utilizator pentru a verifica daca tranzactiile din registrul jurnal au fost introduse corect in calculator dar si pentru a vedea efectul fiecarei tranzactii asupra conturilor implicate in formula sa contabila. De aceea el mai contine doua campuri si anume sold_debit si sold_credit. Macheta acestui tabel este urmatoarea:
- Adaugarea continutului tabelului Impact_rulaj_sold (cu o interogare de tip Append) la tabelul Evolutie_sold_cont, care are aceeasi structura ca si tabelul Impact_rulaj_sold, dar este ordonat pe conturi, astfel incat utilizatorul poate urmari cu usurinsa evolutia soldului fiecarui cont ca urmare a fiecarei tranzactii din cele preluate din registrul jurnal. Inainte de derularea interogarii de tip Append, tabelul Evolutie_sold_cont este golit de tranzactiile ramase de luna trecuta cu ajutorul unei interogari de tip Delete. Dealtfel si tabelul Sold_conturi, inainte de a fi umplut cu datele extrase din tabelul PlanConturi, va trebui golit de datele ramase de luna trecuta cu o interogare de tip Delete, astfel ca cei trei pasi de mai sus se pot detalia conform schemei logice de procedura de mai jos. Din schema se poate vedea ca procedura se va executa la alegerea optiunii Simulare_efect_transa, din meniul TRANSA. Deocamdata ea se va rula fara meniu, direct din modulul standard in care veti scrie subrutina Impact_sold.
Consola (monitor)
Simulare_efect_transaoptiune din
meniul TRANSA
Macroul Resetare_Impact
Sold_conturi Sterge_sold_conturi: intrg-delete
PlanConturi Extrag_sold: intrg-append Sold_conturi
Impact_rulaj_sold Sterge_impact: intrg-delete
Adaos_jurnal Impact_sold: subprg Sold_conturi
Macroul Resetare_efectImpact_rulaj_sold
Evolutie_sold_cont Sterge_evolutie: intrg-delete
Impact_rulaj_sold Efect_sold_cont: intrg-append Evolutie_sold_cont
Ca urmare, lucrarea lab_III_4 are doua parti: elaborare interogari si scrierea unei subrutine numita "Impact_sold".
o interogare de stergere (golire) a tabelului Sold_conturi;
o interogare de tip Append care care umple tabelul Sold_conturi cu soldurile de luna trecuta preluate din tabelul PlanConturi;
o interogare de golire a tabelului Impact_rulaj_sold;
Aceste interogari vor fi incorporate in macroul Resetare_Impact.
Urmeaza interogarile
Sterge_evolutie de golire a tabelului Evolutie_sold_cont;
Efect_sold_cont de umplere (cu append) a tabelului Evolutie_sold_cont cu datele luate din tabelul Impact_rulaj_sold.
Aceste interogari vor fi incorporate in macroul Resetare_efect.
Indicatie: pentru fiecare interogare studiati structura tabelelor implicate in interogare (tabelele se gasesc in baza de date Contabilitate).
Salt la inceputul lucrarii 4
Start
Declaram obiectele DAO si variabilele
ce vor fi folosite in subprogram
Atribuim valori obiectelor DAO:
rstSoldCont = Sold_conturi, rstFisaCont =
Impact_rulaj_sold si rstAdaos = Adaos_jurnal
Rulam macroul Resetare_Impact
care goleste tabelul Impact_rulaj_cont
deci goleste recordset-ul rstFisaCont
dupa campul nr_cont
Initializam cu zero variabilele
rulaj_debit si rulaj_credit
unde se va stoca rulajul total
curent pe primul articol din rstAdaos
(care este copia tabelului Adaos_jurnal)
While nu am atins sfarsitul
recordset-ului rstAdaos Do
In continuare, in loc de cont_debitor
vom lucra cu o variabila crtcont
Cautam in rstSoldCont articolul
rezervat contului crtcont
If proprietatea NoMatch a recordset-ului
rstSolCont este adevarata,
atunci:dam mesajul: 'Contul crtcont de la nr. crt.
rstAdaos.nr_crt nu figureaza in Planul de conturi.
Corectati eroarea si reluati testarea de la inceput'
Iesire automata din bucla Do
Sfarsit de If
1
Salt la inceputul lucrarii 4
1
Generam articolul provenit din debit astfel:
stocam soldul_debit al articolului gasit in
rstSoldCont in variabila crtsold_debit ;
La valoarea actulaa a variabilei crtsold_debit adaugam
campul valoare din rstAdaos
Rulaj_debit va creste si el cu valoare din rstAdaos
In rstFisaCont (copia tabelului Impact_rulaj_cont)
adaugam un articol nou in care vom transfera toate
campurile articolului curent din Adaos_jurnal cu obser-
vatia ca contul_debitor din Adaos_jurnal va trece in cam-
pul cont, iar contul_creditor in campul cont_corespondent.
In plus, valoare va trece in Valoare_cont_debit,
iar Valoare_cont_credit = 0.
In campul sold_debit din rstFisaCont vom trece
crtsold_debit; sold_credit ramane la fel ca in Adaos_jurnal.
Actualizam sold_debit al articolului curent din
rstSoldcont (cel in care s-a oprit Seek) cu crtsold_debit
Generam articolul provenit din credit:
Repetam procedura de la generare articol debit,
doar ca rolurile se inverseaza intre cont_debitor
si cont creditor: de exemplu contul creditor din
Adaos_jurnal trece in campul cont, iar cont_creditor
devine cont_corespondent s.a.m.d. Actualizam sold_credit
In rstAdaos trecem la articolul urmator.
Salt la inceputul buclei Do.
Afisam valorile acumulate in variabilele
Rulaj_debit si Rulaj_credit
Inchidem toate recordset_urile si database dbsContabil
Rulam macro-ul 'Resetare_efect' care goleste
tabelul Evolutie_sold_cont si lanseaza intero-
garea de tip append care aduce continutul tabelului
Impact_rulaj_cont in tabelul Evolutie_sold_cont.
End Salt la inceputul lucrarii 4
Anexe (Suport teoretic pentru lucrare)
Anexa 1
Lucrul cu tabele si fisiere in Vizual Basic for Application
Unul din principalele motive pentru care folosim codul este nevoia de a efectua automat anumite prelucrari ale informatiilor continute in fisiere si tabele.
Deosebirea intre tabele si fisiere consta in aceea ca fisierele nu au fost elaborate ca tabelele, prin descrierea structurii lor in Design View, ci in ele se scrie de catre alte programe care nu fac distinctie decat intre articole; nu le intereseaza impartirea articolelor pe campuri si nu tin seama de tipul datelor stocate intr-un camp. In aceste cazuri, este datoria programatorului sa gestioneze informatiile dintr-un articol.
Pentru a scrie programe care lucreaza cu tabele sau fisiere trebuie sa stim cum se rezolva sau cum se exprima prin program, urmatoarele aspecte:
- numarul total de articole existente la un moment dat in tabel/fisier;
- cum stim daca am ajuns la sfarsitul tabelului/fisierului;
- cum ne pozitionam pe inceputul sau sfarsitul unui tabel/fisier;
- cum stim pozitia in care ne aflam 'acum' (pozitia curenta) in tabel/fisier;
- cum ajungem direct la articolul care intr-un camp dat, contine o valoare care ne intereseaza;
- cum putem face salt direct la articolul cu cheia. sau din pozitia.
- cum avansam la articolul urmator (stiind ca mergem inainte sau inapoi);
- cum putem stoca intr-o variabila pozitia actuala in fisier, pentru ca in caz de nevoie sa stim unde sa ne intoarcem, s.a.
- cum ne referim la un camp din articolul curent, s.a.
In anexa 6 se gasesc raspunsuri la multe din aceste aspecte.
In aceasta lucrare ne intereseaza in deosebi lucrul cu tabele si mai exact accesul prin program, la nivel articol. In Access lucrul cu baze de date si tabele se desfasoara cu ajutorul obiectelor de acces la date Data Access Objects (DAO). Pentru lucru cu DAO se folosesc doua medii de lucru (workspaces): Microsoft Jet workspace si ODBCDirect workspaces.
Cand lucram in fereastra Code Builder-ului, trebuie sa ne asiguram ca baza noastra de date este pusa in legatura cu biblioteca de programe asociata unuia sau altuia din cele doua medii de lucru. Pentru aceasta clic pe Tools si apoi pe References. Va apare o fereastra cu toate aplicatiile care dispun de biblioteci de programe, (acolo nu sunt avute in vedere doar aceste doua medii de lucru) fiecare cu cate o caseta de validare in dreptul sau. Vom da clic pe caseta aplicatiei care ne intereseaza, de exemplu pe Microsoft DAO 3.5 Object Library (pentru Microsoft Office 97) sau pe Microsoft DAO 3.6 Object Library (pentru Microsoft Office 2000). Referinta se poate fixa si prin program atunci cand vom crea obiectul specific pentru tabele numit Recordset.
Exista 17 tipuri de obiecte DAO Ele pot fi vazute si in lista cu obiecte Access prezentata in Lab_III_3, la instructiunile de atribuire. Sunt deosebit de importante obiectele Database, Recordset, QueryDef si TableDef.
Cu un recordset se pot manipula date la nivel articol.
Putem sa rezolvam toate aspectele enumerate mai sus, daca stim sa manipulam corect metodele si proprietatile unui recordset (vezi anexa 3si 4).
Recordset-urile pot fi de 5 tipuri (Vezi anexa 2 )
Un recordset se creaza cu metoda Openrecordset.
Sintaxa metodei Openrecordset apelata pentru a genera recordset de tip table este urmatoarea: Salt la inceputul lucrarii 4
'Set recordset = object.OpenRecordset (source, type, options, lockedits)
'Daca metoda este aplicata unui obiect de tip QueryDef, Recordset, sau TableDef atunci va avea urmatoarea sintaxa:
'Set recordset = object.OpenRecordset (type, options, lockedits)
'Partile specificate in sintaxa de mai sus au urmatoarea semnificatie:
'recordset = o variabila obiect care reprezinta un obiectul de tip recordset pe care vrem sa-l deschidem.
'object = o variabila obiect care reprezinta obiectul din care vrem sa creem un nou recordset.
'source = Un sir de caractere prin care specificam sursa articolelor ce vor compune noul recordset. Sursa poate fi un nume de tabel, de query, sau chiar o instructiune de tip SQL care returneaza articole. In Microsoft Jet databases, pentru recordset de tip Table sursa nu poate fi decat un tabel.
'type = Optional. Este o constanta care indica tipul Recordset-ului ce se deschide prin actuala instructiune SetRecordsets. Valorile pentru aceasta optiune se pot lua din sectiunea Settings, din zona de help unde este descrisa sintaxa pe care o analizam aici.
'options =Optional. O combimnatie de constante care specifica caracteristicile noului recordset.
Valorile pentru aceasta optiune se pot lua din sectiunea Settings, din zona de help unde este descrisa sintaxa pe care o analizam aici.
'lockedits = Optional. O constanta care determina modul in care recordset-ul poate fi blocat impotriva consultarilor sau modificarilor provenite de la alti utilizatori. Se are in vedere faptul ca in cazul bazelor de date stocate pe un server, un asemenea recordset poate fi accesat cvasisimultan de mai multi utilizatori. si pentru aceasta optiune valorile se pot lua din sectiunea Settings, din zona de help
Cautarile intr-un recordset se pot face cu metoda Seek care este descrisa in anexa 5.
Alte metode utile in lucrul cu recordset-uri se pot vedea in anexa 6.
In anexa 7 este prezentata o solutie posibila la punctul 2 din lucrare.
Anexa 2
Tipuri de recordsets
Table-type Recordset - reprezentarea in cod a unui tabel din baza de date ce poate fi folosita pentru a adauga, modifica, sau sterge articole dintr-un singur tabel (valabil numai in Microsoft Jet workspaces).
Dynaset-type Recordset - rezultatul unei interogari care poate contine articole ce pot fi actualizate. Un obiect de tip dynaset-type Recordset este o multime dinamica de articole care poate fi fi folosita pentru a adauga, modifica, sau sterge articole dintr-un tabel(e) inclus intr-o baza de date. Un obiect de tip dynaset-type Recordset poate sa contina campuri din unul sau mai multe tabele dintr-o baza de date. Acest tip corespunde unui ODBC keyset cursor.
Snapshot-type Recordset -este o copie statica a unei multimi de articole folosita pentru a pentru a gasi date sau pentru a genera un raport. Un obiect recordset de tip snapshot poate sa contina campuri din unul sau mai multe tabele dintr-o baza de date, dar nu poate face actualizari. Acest tip corespunde unui ODBC static cursor.
Forward-only-type Recordset - este identic cu snapshot exceptand faptul ca nu este prevazut nici un cursor. Aici putem naviga printre articole numai inainte, ceea ce imbunatateste performata in situatia cand dorim sa facem o singura trecere printr-o multime(de articole) rezultat. Acest tip corespunde unui ODBC forward-only cursor.
Dynamic-type Recordset - Un rezultat al unei interogari derivat din unul sau mai multe tabele ale unei baze de date, in care se pot adauga, modifica sau sterge articole dintr-o interogare ce returneaza un rand (row-returning query). In continuare, in acest recordset vor apare si articolele adaugate, sterse sau editate de alti utilizatori. Acest tip corespunde unui ODBC dynamic cursor (numai ODBCDirect workspaces). Tipul de recordset pe care vrem sa-l creem se poate alege folosind argumentul type al metodei OpenRecordset. Salt la inceputul lucrarii 4
Anexa 3
Lista metodelor unui recordset
- AddNew creaza un articol nou;
- Cancel opreste executia unei metode de tip Asynchronous;
- CancelUpdate ;
- Clone: creaza o copie a recordset-ului original;
- CopyQueryDef: creaza o copie a obiectului QueryDef;
- Delete: sterge articolul curent;
- Edit: copiaza articolul curent in zona de editare;
- FillCache: ;
- FindFirst;
- Findlast: localizeaza articolul indicat prin denumirea metodei ;
- FindNext;
- FindPrevio;
- GetRows: Set varArray = recordset.GetRows (numrows): extrage mai multe articole din recordset, intr-o variabila;
- Move;
- MoveFirst;
- MoveLast;muta pozitia articolului curent asa cum cere denumirea metodei ;
- MoveNext;
- MovePrevio;
- OpenRecordset: Creaza un nou recordset si il adauga colectiei de recordsets;
- Requiry: reimprospateaza datelein recordset prin relarea din nou a query;
- Seek: intr-un recordset indexat, localizeaza articolul care satisface un criteriu formulat asupra indexului; acel articol devine articol curent
- Update: salveaza continutul bufferului unde s-a facut actualizarea in articolul curent;
Anexa 4
Lista proprietatilor unui Recordset
- AbsolutePosition (nu merge in Jet Engine) =pozitia cursorului in tabel (prima este zero)
- BatchCollisinCount
- BatchCollisins
- Batchsize
- BOF, EOF :T True daca cursorul a trecut inainte si respectiv dupa extremitatea tabelului
- Bookmark: denumire index (identificare unica);
- Bookmarkable: T daca se accepta utilizare bookmarks;
- Cachesize;
- Cachestart;
Acestea sunt built-in constants. Exista o lista mare cu ele.
- Connection
- DateCreated, LastUpdate; Editnone
- EditMode: T una din valorile dbEDitinProgress
- Filter: un fel de arg. al clauzei Where; dbEditAdd
- Index: denumire index
- LastModified: un bookmark apartinand ultimului articol modificat;
- LockEdits: True (pessimist lock), False (optimist lock); Salt la inceputul lucrarii 4
- Name;
- NoMatch: este raspunsul la metodele Seek si Find (Boolean);
- PercentPosition: pozitia articolului curent exprimata in procente din nr. total de articole;
- RecordCount: nr. de articole in recordset/tableDef (longint);
- RecordStatus (stadiul de actualizare, redat prin Built_in constants; doar in ODBCDirect)
- Restartable (True daca recordset accepta metoda Requiry - reimprospatare prin rularea interogarii care genereaza informatiile din recordset0;- Sort: T campul prevazut cu Order By; valabil doar in caz de query;
- StillExecuting: stadiul executarii unei metode de tip Asynchronous (Execute, MoveLast, OpenConnection, etc.)
- Transactions: True daca accepta tranzactii; operatii efectuate in zone separate de memorie;
- Type;
- Updatable: True/False;
- UpdateOptions: argumentele clauzei Where aplicate pentru batch update;
- Validatiorule;
- validationText;
Anexa 5 Metoda Seek
Metoda Seek localizeaza un articol dintr-un recordset indexat, de tip table. Articolul trebuie sa satisfaca criteriile specificate in instructiunea de apelare a metodei cu privire la indexul curent al recordset-ului. Daca articolul satisface aceste criterii, el devine articol curent
(Metoda se preteaza numai in mediul de lucru Microsoft Jet. In alte situatii se poate folosi metoda Find).
Sintaxa instructiunii de apelare a metodei:
recordset.Seek comparison, key1, key2key13
unde:
- recordset este o variabila obiect reprezentand un recordset de tip table. Acesta trebuie sa existe si sa fi fost indexat, iar cu acest index se va actualiza in prealabil proprietatea recordset-ului numita Index.
- comparison este unul din urmatorii operatori relationali, introdusi in instructiune drept sir de caractere (deci intre apostroafe duble): <, <=, =, >=, or >.
key1, key2key13 va fi una sau mai multe valori corespunzatoare campurilor din recordset, desemnate ca Indecsi. Se pot folosi pana la 13 argumente
Anexa 6 Sinteza asupra lucrului cu tabele
1.1 Secventiala
a) cu conditie de iesire explicita;
Exemplu "Do while NOT rstAdaos.EOF ( a se citi "Atat timp cat rezultatul operatorului NOT aplicat pe proprietatea EOF a recordset-ului rstAdaos este true fa urmatoarele"). Se mai poate folosi si sintaxa Do until <conditie>. De exemplu
Do until I=4
b) cu conditie controlata de utilizator;
Exemplu:
Do While True (cu valoarea True pusa dupa While, bucla ar continua la nesfarsit) Salt la inceputul lucrarii 4
' Se afiseaza informatii despre articolul curent si i se cere utilizatorului sa tasteze ' cheia urmatorului articol de care este interesat
strMessage = 'Nr factura ' & !nr_factura & vbCr & _
'Valoare: ' & !valoare & vbCr & vbCr & _
'Tastati un nr. de factura intre' & intFirst & _
' si ' & intLast & '.'
strSeek = InputBox(strMessage)
' Pentru a iesi din aceasta bucla utilizatorul va raspunde cu un simplu Enter (nu va mai tasta nici un nr. de factura):
If strSeek = '' Then Exit Do
' Pentru cazul ca se introduce un nr. factura care nu exista si metoda Seek clacheaza, stocam pozitia actuala din tabel in variabila varBookmark.
varBookmark = .Bookmark
' Acum facem cautarea:
Seek '=', Val(strSeek)
' Daca nu s-a gasit o factura cu numarul tastat, revenim pe pozitia de dinainte de a incepe cautarea si dam mesajul 'Nr. negasit'.
If .NoMatch Then
MsgBox 'Nr negasit!'
.Bookmark = varBookmark
Else
MsgBox ('factura are valoarea de ' & !valoare)
Loop
1.2 prin cautare (Seek):
- metoda necesita in prealabil indexare dupa un indice declarat in definitia structurii tabelului;
- campul care da valoarea ce se cauta in tabel trebuie sa aiba acelasi tip si dimensiune cu indexul;
- cautarea nu trece de primul articol care satisface conditia de cautare. In functie de acest criteriu cand avem de a face cu doua tabele deodata putem decide in care sa facem navigatie secventiala si in care sa facem cautare cu Seek.
2. Alte observatii utile :
2.1 Sa observam ca se poate face navigatie cu DO in doua fisiere. In acest caz vom avea o bucla Do exterioara si una interioara, adica pentru fiecare articol al tabelului explorat cu bucla exterioara vom explora toata zona acoperita de bucla interioara
2.2 Iesiri premature din bucle: exit FOR, exit DO, exit Function, Exit Property, Exit Sub. Exemplu If strSeek = '' Then Exit Do
2.3 Incheierea unei bucle: Do.Loop, For.Next i, etc. Cand aceste bucle sunt folosite pentru navigatie in fisiere, inainte de Loop respectiv de Next i se pune comanda <recordset>.movenext, iar inainte de a intra in bucla s-a dat comanda <recordset>.movefirst.
2.4 Adaugarea de articole: Add.Update;
2.5 Editarea de articole: Edit. Update;
2.6 Controlul rezultatelor cautarii cu SEEK: se face punand un IF pe proprietatea Nomatch a tabelului/recordset-ului in care s-a facut cautarea
2.7 Alte operatii sau informatii ce ar trebui stiute pentru a lucra cu recordset-uri:
comenzi (metode) de miscare de pe un articol pe altul: Movefirst, movenext, moveprevio, movelast, move <nrart>; Salt la inceputul lucrarii 4
stergerea articolului curent: <nume recordset>.delete (delete este o metoda);
- numarul total de articole existent intr-un recordset se poate obtine cu metoda RecordCount Exemplu:
Acesta este
un si un exemplu de cum se poate face navigatie intr-un tabel nu cu Do
ci cu For, deci cunoscand exact de cate ori se va executa bucla
deschisa cu For. Sa observam ca "motorul " care
pune cursorul in miscare este comanda (metoda) movenext.
TotalArt=rstAdaos. RecordCount
rstAdaos.Movefirst
For i=1 to TotalArt
rstAdaos.movenext
next i
2.8 Intr-o instructiune de program, metodele, proprietatile si campurile unui recordset trebuie precedate de numele acestuia si de un punct (iar in cazul campurilor de nume si de semnul !). Putem deschide o zona libera de aceasta obligatie cu With <nume recordset>. Zona se va incheia cu End With. Vezi cum este folosit With in exemplul din anexa 7.
Observatie: La campurile unui recordset ne putem referi si prin intermediul colectiei sale de obiecte numita Fields. In cadrul acestei colectii campurile se numeroteaza in ordinea in care au fost declarate in modul Design utilizat pentru crearea tabelului, incepand de la zero. De altfel si elementele unui vector se numeroteaza tot de la 0.
De exemplu in secventa de mai jos, vectorul coresp este completat cu campurile recordset-ului rstmatrice.
limit = rstmatrice!Nr_coduri_cumulate
For I = 1 To limit
coresp(I - 1) = rstmatrice.Fields(I + 1)
MsgBox ' elementul al ' & I & '-lea din vectorul coresp este ' & coresp(I - 1)
Next I
Anexa 7. O varianta posibila pentru programul Impact_sold
Sub impact_sold()
' Programul desface fiecare rand din Adaos_jurnal in doua randuri: unul pentru debit
' si unul pentru credit si dupa ce calculeaza suma curenta a contului de debit/respectiv
' de credit,(folosind in acest scop suma curenta a contului luata din tabelul 'Sold_cont')
' precum si rulajul curent al transei, depune noul articol in tabelul 'Impact_rulaj'.
' Macroul 'Resetare_efect' care se ruleaza la sfarsitul programului, goleste tabelul
' 'Evolutie_sold_cont' si apoi apeleaza o interogare care ordoneaza tabelul 'Impact_rulaj'
' dupa cont si il adauga prin Append la tabelul 'Evolutie_sold_cont'
' Ulterior, la validare transa, tabelul 'Evolutie_sold_cont' va fi adaugat in coada tabelului
' 'Fisa_cont'. Tot atunci, tabelul 'Sold_cont', va fi descarcat 'Planconturi'
Dim dbscontabil As Database
'Dim rstSoldCont As Recordset
'Dim rstFisaCont As Recordset
'Dim rstAdaos As Recordset
Dim intFirst As Integer
Dim intLast As Integer
Dim strMessage As String
Dim strSeek As String
Dim varBookmark As Variant Salt la inceputul lucrarii 4
Dim crtcont As String
Dim crtsold_debit As Currency
Dim crtsold_credit As Currency
Dim Rulaj_debit As Currency
Dim Rulaj_credit As Currency
Set dbscontabil = OpenDatabase('C:anuIIIfcContab97.mdb')
' You must open a table-type Recordset to use an index,
' and hence the Seek method.
Set rstSoldCont = dbscontabil.OpenRecordset('Sold_conturi', dbOpenTable)
Set rstFisaCont = dbscontabil.OpenRecordset('Impact_rulaj_sold', dbOpenTable)
Set rstAdaos = dbscontabil.OpenRecordset('Adaos_jurnal', dbOpenTable) '__________ ______ ____ __________ ______ ____ ____
'OBSERVATIE: Campurile sold_debit si sold_credit din tabelele 'Impact_rulaj_sold', 'Sold_conturi' si 'Evolutie_sold_cont' reprezinta de fapt suma_debit si respectiv suma_credit!
DoCmd.RunMacro 'resetare_impact'
' Indexam recordset-ul SOLD_CONTURI dupa nr_cont
rstSoldCont.Index = 'nr_cont'
'Pozitionam cursorul pe primul articol Adaos_jurnal
rstAdaos.MoveFirst
'Initializam rulajul debit si credit ce va rezulta din toate miscarile
'stocate in Adaos_jurnal:
Rulaj_debit = 0
Rulaj_credit = 0
'Loop over Adaos_jurnal
Do While Not rstAdaos.EOF
'Generam articolul provenit din debit
crtcont = rstAdaos!cont_debitor
' Cautam contul curent
rstSoldCont.MoveFirst
rstSoldCont.Seek '=', crtcont
' daca contul cautat nu se gaseste dam un mesaj
If rstSoldCont.NoMatch Then
MsgBox ('Contul ' & crtcont & ' de la nr. crt. ' & rstAdaos.nr_crt & _
' nu figureaza in Planul de conturi')
MsgBox 'Corectati eroarea si reluati testarea de la inceput'
Exit Do
End If
crtsold_debit = rstSoldCont!Sold_debit
crtsold_debit = crtsold_debit + rstAdaos!valoare
Rulaj_debit = Rulaj_debit + rstAdaos!valoare
Salt la inceputul lucrarii 4
With rstFisaCont
.AddNew
!nr_crt = rstAdaos!nr_crt
!Cod_registru = rstAdaos!Cod_registru
!cont = rstAdaos!cont_debitor
!data_inreg = rstAdaos!data_inreg
!Documentul = rstAdaos!Documentul
!Explicatii = rstAdaos!Explicatii
!cont_corespondent = rstAdaos!cont_creditor
!Valoare_cont_debit = rstAdaos!valoare
!Valoare_cont_credit = 0
!Sold_debit = crtsold_debit
!Sold_credit = rstSoldCont!Sold_credit
.Update
End With
With rstSoldCont
.Edit
!Sold_debit = crtsold_debit
.Update
End With
'Generam articolul provenit din credit
crtcont = rstAdaos!cont_creditor
' Cautam contul curent
rstSoldCont.MoveFirst
rstSoldCont.Seek '=', crtcont
' daca contul cautat nu se gaseste dam un mesaj:
If rstSoldCont.NoMatch Then
MsgBox ('Contul ' & crtcont & ' de la nr. crt. ' & rstAdaos.nr_crt & _
' nu figureaza in Planul de conturi')
MsgBox 'Corectati eroarea si reluati testarea de la inceput'
Exit Do
End If
crtsold_credit = rstSoldCont!Sold_credit
crtsold_credit = crtsold_credit + rstAdaos!valoare
Rulaj_credit = Rulaj_credit + rstAdaos!valoare
With rstFisaCont
.AddNew
!nr_crt = rstAdaos!nr_crt
!Cod_registru = rstAdaos!Cod_registru
!cont = rstAdaos!cont_creditor
!data_inreg = rstAdaos!data_inreg
!Documentul = rstAdaos!Documentul
!Explicatii = rstAdaos!Explicatii
!cont_corespondent = rstAdaos!cont_debitor
!Valoare_cont_debit = 0
!Valoare_cont_credit = rstAdaos!valoare
!Sold_debit = rstSoldCont!Sold_debit Salt la inceputul lucrarii 4
!Sold_credit = crtsold_credit
.Update
End With
With rstSoldCont
.Edit
!Sold_credit = crtsold_credit
.Update
End With
rstAdaos.MoveNext
Loop
MsgBox 'Rulaj debit=' & Rulaj_debit & ' ' & 'Rulaj credit=' & Rulaj_credit
rstAdaos.Close ' Close file Adaos_jurnal
rstFisaCont.Close ' Close file Impact_rulaj_sold
rstSoldCont.Close ' Close sold_conturi
dbscontabil.Close ' Close BD Contabil
DoCmd.RunMacro 'resetare_efect'
MsgBox 'Simualarea s-a terminat cu succes: a fost creat tabelul ' & vbCr & _
' Impact_rulaj si Evolutie_sold_cont care va fi adaugat la Fisa_cont'
End Sub