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

LUCRAREA DE LABORATOR - Lucrul cu tabele in VBA. Elaborarea unei proceduri pentru optiunea Simulare transa din meniul unei aplicatii de contabilitate

LUCRAREA DE LABORATOR

Lucrul cu tabele in VBA. Elaborarea unei proceduri pentru optiunea

Simulare transa din meniul unei aplicatii de contabilitate.

(durata 4 ore)

Introducere

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".

  1. Elaborati urmatoarele interogari pe care le vom crea in baza de date Examen:

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).

  1. Scrierea subrutinei numita "Impact_sold" a carui schema logica de program este data mai jos. Subrutina apeleaza la inceput macroul Resetare_Impact, iar la sfarsit apeleaza macroul Resetare_Efect.

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


Indexam Sold_conturi

dupa campul nr_cont


Initializam cu zero variabilele

rulaj_debit si rulaj_credit

unde se va stoca rulajul total

Pozitionam indicatorul articolului

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;

- Close: inchide un obiect DAO;

- 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. Forme de navigatie printr-un tabel (recordset)

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)

End If

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'

Left Arrow: Cuprinsul ghidului End Sub