. Program de Intocmire Si Emitere de Facturi

CAP.1 PREZENTARE TEMĂ PROIECT

Acest proiect reprezintă un exemplu de aplicație a cărui interfață a fost realizată în Mocrosoft Visual Basic 6 ce utilizează o bază de date Access.

Tema aleasă se referă la activitatea de întocmire și emitere a facturilor dintr-o firmă oarecare. Efectuarea acestor operații se realizează cu ajutorul programului Calcul 2004.

Operația de întocmire a facturilor se bazează pe definirea unei structuri organizatorice a firmei, ce presupune o evidență a clienților și a produselor de care dispune firma.

Factura se va întocmi cu ajutorul programului Calcul 2004, utilizatorul ținând cont de comanda clientului.

Evidența informatică a produselor este făcută pe categorii de produse. Fiecărei categorii îi corespunde o valoare TVA.

Ca principiu general, prezentul program nu ține o evidență și a documentelor de aprovizionare a firmei cu marfă, stocul fiind introdus de către utilizator și actualizat automat după fiecare vânzare a produsului. Se va ține însă cont de prețul de achiziționare și cel de vânzare al produselor. Prețul de vânzare reprezintă prețul unitar al unui produs la care se va adăuga valoarea TVA-ului specifică categoriei din care face parte produsul respectiv și se va calcula în momentul vânzării produsului, ce corespunde cu adăugarea lui pe factură .

În concluzie, o factură se consideră emisă în momentul în care cantitatea de produse de pe aceasta va fi încărcată într-un mijlocul de transport al unui client.

Programul Calcul2004 , prin intermediul rapoartelor, permite:

evidența facturilor emise și a valorii totale a acestora într-o perioadă stabilită de utilizator;

evidența facturilor emise pentru fiecare client;

evidența zilnică a stocului de produse, pentru fiecare categorie în parte, precum și valoarea totală a acestuia

evidența prețului unitar și a prețului de vânzare al fiecărui produs.

CAP.2 NOȚIUNI TEORETICE UTILIZATE

2.1 Noțiuni teoretice generale de baze de date

O bază de date conține toate informațiile necesare despre obiectele ce intervin într-o mulțime de aplicații, relațiile logice între aceste informații și tehnicile de prelucrare corespunzătoare. În bazele de date are loc o integrarea a datelor, în sensul că mai multe fișiere sunt privite în ansamblu, eliminându-se pe cât posibil informațiile redundante. De asemenea se permite accesul simultan la aceleași date, situate în același loc sau distribuite spațial, a mai multor persoane de pregătiri diferite, fiecare cu stilul personal de lucru.

Sistemul de programe care permite construirea unor baze de date, introducerea informațiilor în bazele de date și dezvoltarea de aplicații privind bazele de date se numește sistem de gestiune a bazelor de date (SGBD). Un SGBD dă posibilitatea utilizatorului să aibă acces la date folosind un limbaj de nivel înalt, apropiat de modul obișnuit de exprimare, pentru a obține informații, utilizatorul făcând abstracție de algoritmii aplicați pentru selecționarea datelor implicate și a modului de memorare a lor. SGBD-ul este o interfață între utilizatori și sistemul de operare.

Un model relațional de baze de date cuprinde trei componente principale și anume structura datelor prin definirea unor domenii (valori atomice) și a relațiilor, integritatea datelor prin impunerea unor restricții sau a unor constrângeri, și prelucrarea datelor prin operații din algebra relațională sau calculul relațional.

2.1.1 Obiecte Access

Microsoft Access este un sistem interactiv computerizat pentru gestiunea bazelor de date relaționale, conceput să funcționeze în mediul Microsoft Windows. La fel ca și în alte SGBD-uri, Access oferă posibilitatea de a organiza, memora, corela și de a regăsi datele de care dispune sistemul.

Baza de date Access este formată din tabele, interogări, formulare, rapoarte și alte obiecte, care se memorează în același fișier cu extensia MDB. Datorită faptului că toate obiectele sunt stocate în același loc, se poate vorbi de o mare ușurință și viteză în căutarea, analiza, urmărirea și protecția datelor.

Realizarea unei baze de date Access

Etapele ce trebuie parcurse pentru realizarea aplicației sunt:

Analiza problemei de rezolvat. Etapa se finalizează prin realizarea

unui model al sistemului studiat, de exemplu: modelul relațional obținut prin transformarea modelului entitate-relație și presupune:

studierea scopului și a domeniului de interes (tema);

identificarea entităților sistemului și precizarea legăturilor dintre acestea;

precizarea datelor de intrare, a prelucrărilor necesare și a prezentării rezultatelor.

Proiectarea , când se definesc proprietățile obiectelor, evenimentele la care trebuie

să răspundă aplicația și felul în care vor răspunde obiectele la diferitele evenimente, cu subetapele:

proiectarea obiectelor bazei de date;

proiectarea interfeței aplicație-utilizatori.

2.1.1.1 Tabele

Tabela este obiectul din baza de date destinat păstrării datelor privind un anumit subiect. Tabelele sunt identificate printr-un nume; numele unei tabele este unic în cadrul bazei de date, poate conține spații, dar nu pot depășii 64 de caractere alfanumerice.

Tabela este bidimensională, pe linii având informații despre fiecare exemplar al subiectului respectiv, iar pe coloane atributele. O tabelă Access conține două tipuri de informații: structura și datele.

Prin urmare a crea o tabelă înseamnă a-i defini structura și a o încărca cu date. Structura cuprinde informații despre numărul, tipul de date și proprietățile câmpurilor, câmpurile cheii primare, câmpurile indexate și tipul indexării.

Proprietățile sunt stabilite în faza de proiectare a structurii și pot fi vizualizate în fereastra pentru proprietăți. O tabelă poate fi creată prin definirea tabelelor de către utilizator, prin definirea structurii, stabilirea câmpurilor, a tipurilor de date, a proprietăților și a cheii primare precum și încărcarea cu date.

Descrierea structurii tabelelor presupune introducerea câmpurilor pentru fiecare câmp introducându-se numele acestuia, tipul de dată și opțional o descriere.

Câmpurile reprezintă obiecte din tabelă. Stabilirea proprietăților pentru fiecare câmp difera in funcție de tipul datelor.

2.1.1.1.1 Crearea legăturilor între tabele

Într-o bază de date relațională tabelele sunt corelate. Aceasta înseamnă că datele memorate în tabele diferite vor putea fi asociate corect atunci când din baza de date se solicită anumite informații.

Access fiind un SGBD relațional memorează datele în tabele diferite, dar pemite corelarea lor, realizând asocierea dupa criterii logice și de înrudire a datelor. Această asociere este posibilă dacă în faza de definire a structurii tabelelor sunt precizate tipurile de legături permise.

Câmpurile comune prin care se face corelarea sunt cheia primară pentru o tabelă și respectiv cheie externă pentru tabela asociată.

Tipuri de legături

Corelația “unu la unu” (1 1), numită și relație biunivocă

Se caracterizează prin aceea că unei înregistrări dintr-o tabelă îi corespunde o înregistrare din cealaltă tabelă. Acest tip de corelație se poate creea atunci când tabelele au subiecte diferite cu chei primare diferite.

Corelația “unu la mai mulți” (1 n)

Se caracterizează prin aceea că unei înregistrări dintr-o tabelă îi corespund mai multe înregistrări din cealaltă tabelă.

Corelația “mai mulți la mai mulți” (m n)

Se caracterizează prin aceea că unei înregistrări din prima tabelă îi corespund 0, 1 sau mai multe înregistrări iar unei înregistrări din cea de a doua tabelă îi corespund 0, 1 sau mai multe înregistrări din prima tabelă. În cazul acestei legături se va adăuga o tabelă suplimentară prin care se sparge corelația m la n în două legături 1 la n. Această tabelă suplimentară va avea drept câmpuri, cheile primare ale tabelelor aflate în corelația m la n.

Sistemul permite precizarea tipului de legătură (join) după cum se observă :

Figura 2.1 – Fereastra Join Properties

Opțiunea 1 reprezintă INNER JOIN (asocieri interne) sau asocieri echivalente (EQUI JOIN), sunt cele mai utilizate tipuri de asocieri și combină asocierile din două tabele când sunt identice valorile dintr-un câmp comun celor două tabele. De regulă, asocierea este de tip “unu la mai mulți”, bazându-se pe câmpul cheie principală dintr-un tabel și pe un câmp cheie externă din cealaltă tabelă. Asocierile interne afișează toate înregistrările care au corespondente în cealaltă tabelă.

Opțiunea 2 reprezintă LEFT JOIN (asocieri externe la stânga ) și afișează toate înregistrările din tabelul din partea “unu” a relației, care conține, cheia principală unică, indiferent dacă există înregistrări corespomdente în tabela din partea “mai mulți“ a relației.

Opțiunea 3 reprezintă RIGHT JOIN (asocieri externe la dreapta ) și afișează toate înregistrările din tabelul din partea “mai mulți” a relației și numai acele înregistrări din tabela din partea “unu” a relației pentru care cîmpurile comune sunt egale.

2.1.1.1.2 Asigurarea integrității referențiale

Access poată să impună regulile de integritate referențială atunci când sunt îndeplinite următoarele condiții:

câmpul asociat din primul tabel este cheie primară sau are un index unic;

câmpurile asociate au același tip de date.

Regulile impuse de Access pentru asigurarea integrității referențiale pot fi rezumate astfel:

când adăugăm înregistrările într-un tabel corelat și introducem o valoare în câmpul pe care se face asocierea , trebiue să existe deja o înregistrare cu această valoare în tabelul principal;

nu se poate elimina o înregistrare din tabelul principal atâta timp cât mai există înregistrări asociate acestuia în tabelul corelat.

Figura 2.2 – Fereastra Relationships

Opțiunile posibile pentru stabilirea acestor reguli sunt:

Cascade Update Related Fields (actualizare în cascadă a câmpurilor asociate). Efectul este că ori de câte ori se modifică valoarea cheii primare a unei înregistrări din tabelul principal, Access va modifica automat valorile din câmpurile asociate ale înregistrărilor corespunzătoare din tabelul corelat.

Cascade Delete Related Records (eliminarea în cascadă a înregistrărilor). Efectul este că ori de câte ori vom elimina înregistrări dim primul tabel, Access va elimina automat înregistrările asociate din tabelul corelat.

2.1.1.1.3 Indexarea tabelelor

Indecșii sunt fișiere complementare tabelelor care ajută la identificarea directă a uneia sau mai multor înregistrări dintr-o tabelă.

După creare, indecșii sunt salvați împreună cu tabelul și sunt actualizați în mod automat la introducerea datelor în tabele. Vizualizarea indecșilor nu este posibilă.

De exemplu când se stabilește un câmp cheie primară Access realizează automat un index al câmpului respectiv. Acest index nu acceptă valori duplicate. Dacă se construiesc indecși pe alte câmpuri (care nu sunt chei primare), acești indecși pot conține valori duplicate.

2.2 Referință SQL

Prin utilizarea comenzilor, a predicatelor, a clauzelor, a operatorilor, a funcțiilor globale și a asocierilor, limbajul structurat de interogare SQL (Structured Query Language) poate compune cu succes o interogare care înapoiază un anumit domeniu de câmpuri.

SQL este un limbaj corelat îndeaproape de Microsoft Jet Engine și Data Access Object (DAO). Prin indicarea relațiilor între tabele și alte interogări dintr-o bază de date prin intermediul SQL, înregistrarile sunt create temporar și transmise înapoi obiectului set de înregistrări al obiectului bază de date în Visual Basic.

2.2.1 Clasificarea instrucțiunilor SQL

Instrucțiunile se împart în două categorii distincte. Prima categorie, limbajul de definire a datelor (Data Definition Language – DDL) este folosit pentru crearea, modificarea sau eliminarea definițiilor existente într-o anumită bază de date. Cea de a doua categorie, limbajul de manipulare a datelor (Data Manipulation Language – DML) este folosită pentru crearea, modificarea, eliminarea sau adunarea informațiilor rezidente în structurnarea informațiilor rezidente în structura bazei de date. Cu alte cuvinte, se va folosi DDL pentru crearea de tabele, câmpuri și indexuri, iar DML servește la popularea, modificarea și obținerea informațiilor rezidente în tabele și câmpuri.

Clauze SQL

FROM este folosită pentru a indica tabelul sau interogarea folosite la adunarea informației pentru instrucțiunea SQL. Folosind clauza FROM este posibilă specificarea mai multor tabele sau interogări în cadrul instrucțiunii.

WHERE prezintă condiția sau condițiile care trebuie satisfăcute pentru includerea unei înregistrări în rezultatele interogării. Fiecare condiție este evaluată folosind operatorii condiționali (>, >=, <, <=, =, <>, BETWEEN, LIKE) sau operatorii logici (AND, OR, NOT).

GROUP BY este folosită pentru gruparea setului de rezultate al interogării.

Folosește minim un nume de câmp dintr-un tabel sau înregistrare prezentate în clauza FROM pentru a evalua înregistrările și valorile de tip grup. De asemenea se poate folosi o funcție globală într-o instrucțiune SQL pentru a crea sumare ale grupurilor din setul de înregistrări. Funcțiile globale disponibile sunt: AVG – care calculează valoarea minimă a unui câmp specificat, COUNT – calculează numărul de înregistrări dintr-o interogare, SUM – calculează suma valorilor dintr-un câmp specificat, MAX – calculează valoarea cea mai mare a unui câmp specificat, MIN – calculează valoarea cea mai mică a unui câmp specificat.

HAVING specifică condiții (de aceeași sintaxă folosită pentru clauza WHERE) care trebuie satisfăcute de grupuri ca să fie incluse în setul de înregistrări rezultant.

ORDER BY folosește nume de câmpuri pentru a ordona setul de rezultate într-un anumit mod.

2.2.1.1 Limbajul de manipulare a datelor

Comenzile DML creează o combinație de interogări de acțiune și de selecție. Acestea sunt:

Comanda SELECT este o componentă a unei interogări de selecție, nu a

unei interogări de acțiune. La utilizarea unei interogări de selecție într-o aplicație Visual Basic, aceasta este stabilită într-un obiect set de înregistrări al unei baze de date specificate. Presupunând că rs este un set de înregistrări valid și db este un obiect de bază de date deja stabilit la un fișier de baze de date valid, se poate folosi următoarea instrucțiune pentru a aduna toate înregistrările dintr-un tabel:

Set rs=db.OpenRecordset (“SELECT * FROM tabel”)

Aceasta este însă forma elementară cea mai generală, a unei instrucțiuni SELECT. Programatorul poate folosi fiecare componentă pentru o sortare și o filtrare eficientă a înregistrărilor, în funcție de necesități. Sintaxa instrucțiunii SELECT este următoarea:

SELECT [predicate] {* table.*}

FROM tableexpression

[WHERE…]

[GROUP BY…]

[HAVING…]

[ORDER BY…]

Printre predicatele disponibile într-o instrucțiune SELECT se numără: ALL – obține toate înregistrările, chiar și duplicatele, DISTINCT – obține numai înregistrările unice, bazate pe câmpurile specificate în instrucțiune. Clauza HAVING se comportă similar cu clauza WHERE, cu excepția testării condiției specificate după efectuarea grupării, spre deosebire de clauza WHERE, care testează condițiile pentru includerea înregistrărilor în grupuri.

Unirile reprezintă o funcție foarte frecvent folosită a instrucțiunii SELECT și servesc la crearea de relații temporare între tabele la evaluarea unei interogări de selecție. Sintaxa de utilizare a unirilor într-o instrucțiune SELECT este:

SELECT …

FROM table1 [LEFTRIGHT] JOIN table2 ON (table1.field1 CompOp table2.field2)

CompOp este un operator de comparație. O unire de stânga (denumită și unire exterioară de stânga) include toate înregistrările din tabelul table1, chiar dacă în tabelul table2 nu există înregistrări corelate. O unire de dreapta (denumită și unire exterioară de dreapta) include toate înregistrările din tabelul table2, chiar dacă în tabelul table1 nu există înregistrări corelate. Pentru a crea o unire care obține numai înregistrările incluse în ambele tabele (unire interioară) se va folosi clauza INNER JOIN.

Comanda UPDATE este folosită pentru stabilirea informației dintr-un tabel curent la o valoare nouă. Sintaxa comenzii UPDATE este următoarea:

UPDATE table

SET value

WHERE criteria

Valoarea specificată în clauza SET a instrucțiunii UPDATE este o expresie de atribuire, care va modifica valoarea curentă a înregistrărilor selectate din tabelul specificat. Dacă nu este specificată nici o clauză WHERE, interogarea UPDATE efectuează modificările necesare pentru toate înregistrările din tabelul specificat.

Comanda DELETE este folosită pentru efectuarea de ștergeri masive de

înregistrări dintr-un tabel specificat, dintr-o singură operație. Se pot menționa condiții de selecție a înregistrărilor de șters dintr-un tabel. La folosirea comenzii DELETE, sunt șterse înregistrări întregi, nu numai câmpuri individuale. Sintaxa comenzii DELETE este prezentată mai jos:

DELETE table.*

FROM table

WHERE…

2.3 Microsoft Visual Basic

Microsoft Visual Basic este un mediu interactiv de programare vizuală a aplicațiilor informatice. Microsoft specifică termenul “Visual” deoarece este posibilă proiectarea de programe cu ajutorul unor formulare care conțin elemente vizuale, precum butoane și casete de afișare și diferite componente vizuale numite controale. Visual Basic oferă mai multe controale (obiecte care se folosesc pentru implementarea unui mod simplu de interacțiune între utilizatori și aplicații) care permit utilizatorilor să obțină, să afișeze sau să înscrie date, să afișeze imagini și așa mai departe. Controalele pun la dispoziția programatorului diferite proprietăți (caracteristici ale controlului), metode (acțiuni asupra controlului) și evenimente (proceduri în care se specifică răspunsuri la acțiunile asupra controlului).

Facilități Microsoft Visual Basic:

Visual Basic pune la dispoziție controale, utilizate pentru proiectarea unei interfețe ce vă permite interacțiunea dintre utilizator și aplicație.

Un control este un obiect care se utilizează în programe pentru a le face mai accesibile utilizatorilor și pentru a înlesni modul în care ele vor răspunde la acțiunile utilizatorilor. Un control este el însuși un program folosit în cadrul programelor Visual Basic în vederea simplificării codului acestora.

Visual Basic pune la dispoziție formulare, folosite pentru plasarea de controale.

Visual Basic pune la dispoziție controale utilizator și documente

utilizator, folosite în scopul proiectării componentelor ActiveX pentru proiectele și programele Visual Basic care vor rula pe World Wide Web.

Visual Basic pune la dispoziție module, utilizate pentru organizarea codului, separarea codului de o anumită componentă vizuală și, eventual, punerea la dispoziție a codului pentru unul sau mai multe formulare.

Visual Basic permite dezvoltarea proiectelor în grupuri, ceea ce oferă posibilitatea de a include controalele proprii, mai multe fișiere executabile și biblioteci cu legare dinamică în cadrul unui singur proiect Visual Basic.

Programarea orientată pe obiect reprezintă un stil de programare care presupune împărțirea programelor în componente obiectuale și apoi dezvoltarea programelor pentru gestionarea componentelor obiectuale respective și a interacțiunilor dintre ele. Pentru a stabili dacă un limbaj de programare este orientat pe obiect, programatorii iau în considerație, de regula, trei caracteristici – moștenirea, polimorfismul si încapsularea.

Programarea orientată pe eveniment reprezintă un mod de programare în care accentul cade pe raspunsul programului la acțiunile și operațiile efectuate de utilizator.

Visual Basic combină elementele de programare orientată pe obiect cu elementele de programare orientată pe eveniment.

O interfață de programare a aplicațiilor (API – Application Programming Interface) permite programelor accesul la facilitățile oferite de programul API. Spre exemplu biblioteca API din Windows permite programelor accesul direct la funcțiile sistemului de operare Windows și utilizarea acestora în cadrul operațiilor din programe. O biblioteca API constă într-o serie de funcții, proceduri, tipuri de date și constante simbolice ce pot fi accesate de către programe. În Visual Basic se pot folosi mai multe astfel de biblioteci API, puse la dispoziție de către sistemul de operare Windows, pentru a spori puterea programelor dezvoltate.

Lansarea mediului Microsoft Visual Basic înseamnă și începerea unui nou proiect. Un proiect poate conține unul sau mai multe formulare, module, controale utilizator sau documente utilizator. Pentru dezvoltarea interfeței unui proiect se pot folosi formulare, controale utilizator sau documente utilizator. Majoritatea interfețelor vor conține, de altfel, unul sau mai multe controale utilizate pentru a îmbunătăți răspunsul interfeței la operațiile și acțiunile efectuate de către utilizatorul aplicației.

Un proiect Visual Basic poate conține, de asemenea, unul sau mai multe module. Modulele sunt folosite în cadrul proiectelor pentru plasarea de cod. Există posibilitatea de a preciza dacă programul poate accesa codul dintr-un modul numai în

cadrul acelui modul sau dacă respectivul cod va putea fi accesat din orice parte o programului. Un modul conține exclusiv cod de program. Într-un proiect pot fi adăugate mai multe module. Inserarea în proiect a unui modul adițional va presupune și o organizare a proiectului, deoarece se poate permite accesul tuturor formularelor la codul din module sau se pot proteja anumite porțiuni de cod din fiecare modul în parte, astfel încât accesul să fie permis numai funcțiilor și procedurilor din modulul respectiv.

Din toată suita de medii de dezvoltare vizuale de la Microsoft (Visual Studio), Visual Basic este cel mai eficient instrument (din punct de vedere al timpului de dezvoltare) pentru dezvoltarea aplicațiilor care lucrează cu baze de date.

2.3.1 Interfețe Visual Basic

La creearea unui program pentru Windows trebuie să optăm pentru una dintre cele două tipuri de interfețe de bază din Windows: interfața document multiplu sau interfața document singular. Aplicațiile cu interfață document multiplu (MDI – Multiple-Document Interface) sunt standard în Windows. Cuvintele document multiplu se referă la capacitatea unui program de a întreține mai multe reprezentări sau fișiere în interiorul aceleași ferestre cadru. Aplicațiile cu interfața document singular (SDI – Singular Document Interface) sunt succesoare ale aplicațiilor DOS prin aceea că toate reprezentările sunt la același nivel. Atunci când se trece de la o reprezentare la alta în cadrul unei aplicații cu interfața document singular, în mod normal programul va ascunde sau închide prima reprezentare. Interfețele document singular sunt cele mai simple programe.

2.3.2 Forme

Un formular reprezintă o suprafață rectangulară, similară unei ferestre, care poate conține controale. Un formular Visual Basic este el însuși un control, putând conține totodata alte controale pe care le adăugam. Un control, altul decât un formular, este un obiect auto-conținut pe care programatorul îl poate adăuga într-un formular și care conține, de regulă, o componentă vizuală. Controalele se folosesc în cadrul programelor pentru a face ca interfața cu utilizatorul să fie mai sugestivă. După plasarea unui control pe un formular, se poate scrie codul care permite interacțiunea dintre utilizator și acel control.

2.3.3 Fereastra de cod

La dezvoltarea proiectelor se va adăuga, mai devreme sau mai târziu, cod pentru majoritatea obiectelor adăugate în proiect. Pentru scrierea codului de program

asociat unui obiect din proiect vom apela la fereastra de cod din Visual Basic. Fereastra de cod este o fereastră distinctă cu două meniuri derulante în partea superioară. Cele două casete derulante din partea superioară a ferestrei de cod ne permit selectarea procedurii sau a funcției pe care dorim să o vizualizăm. Modul în care fereastra de cod organizează procedurile și funcțiile poate varia, în funcție de obiectul cu care lucrăm. Această secțiune ne dă posibilitatea să declarăm variabile pe care le va putea utiliza orice funcție, eveniment sau procedură. Toate variabilele declarate în secțiunea de declarații generale vor fi disponibile în întreg formularul, ceea ce înseamnă că orice eveniment sau procedură scrise în cadrul formularului vor putea accesa aceste variabile.

De fiecare dată când se scrie în fereastra de cod o procedură, un eveniment sau o funcție, codul în cauză se va afla în afara secțiunii de declarații generale. Fereastra de cod afișează numele procedurii în câmpul din dreapta al părții superioare a ferestrei. Atunci când ne deplasăm în cadrul ferestrei de cod, Visual Basic afișează fiecare procedură, eveniment și funcție din obiectul de program deschis curent (de exemplu, un control buton de comanda sau casetă de editare) în cadrul celor două casete derulante aflate în partea superioară a ferestrei de cod, aceasta pe masură ce cursorul se deplasează în procedura, evenimentul sau funcția în cauză.

2.3.4 Caseta cu instrumente

Visual Basic pune la dispoziție mai multe controale pe care le putem plasa pe un formular. Un control este un obiect cu care utilizatorul interacționează în cadrul aplicațiilor. Înainte de a putea plasa un control pe suprafața unui formular, va trebui să se acceseze acel control în cadrul casetei cu instrumente. Visual Basic conține o casetă cu instrumente pe care sunt afișate mai multe pictograme. O pictogramă este o reprezentare grafică de dimensiune mică a unui alt obiect. Spre exemplu, Windows folosește pictograme pentru a reprezenta, printre altele, fișiere și directoare. În cadrul casetei cu instrumente, pictogramele reprezintă controalele care se pot folosi în cadrul proiectului. Caseta cu instrumente este, de fapt, o simplă fereastră care afișează pictogramele ce reprezintă controalele. Înainte ca interacțiunea dintre utilizator și un control să fie posibilă, controlul respectiv trebuie adăugat într-un formular. Un proiect poate conține mai multe formulare.

2.3.5 Controale

Deoarece un formular este tot un control, nu este necesară adăugarea unui control la un formular pentru crearea unui proiect. Atunci când adăugăm un control într-un formular, ceea ce rezultă are mai multă utilitate decât un simplu formular gol. Fiecare control din Visual Basic are un scop bine definit. Se poate rezolva un proiect cu mai multe controale. De exemplu, utilizatorul ar putea să efectueze un click pe un

control buton de comandă pentru a întrerupe un program, să selecteze o singură opțiune din două sau mai multe controale buton de opțiune, să enumere mii de elemente într-un control casetă cu listă și tot așa.

Deoarece un formular este tot un control și, la bază, o reprezentare vizuală a unei clase de obiecte, ne va fi de ajutor să înțelegem ce sunt obiectele. Putem considera un control ca fiind un obiect. De exemplu, atunci când pornim calculatorul apăsăm, de regulă, un buton de pe carcasa fizică a calculatorului. Butonul este un obiect. Dar cum calculatorul va urma o serie de instrucțiuni pentru pornire după apăsarea butonului, butonul este totodata un control. Putem vedea un control ca un obiect care face ceva numai după ce efectuăm o acțiune asupra sa. Prin comparație, un creion este tot un obiect, dar nu face nimic până nu îl luăm în mână și scriem ceva cu el.

Controlul este un obiect pe care îl putem vedea pe un formular și care are formă, dimensiune, culoare și, de obicei, un text sau o etichetă. În plus, un control dispune de proprietăți, metode și evenimente. Fiecare control din Visual Basic are un scop bine definit.

Visual Basic ne permite să scriem cod pentru proprietățile, metodele și evenimentele unui control. Aceasta înseamnă că putem modifica modul în care un control se comportă în cadrul programelor. Proprietățile unui control descriu controlul respectiv; exemple de proprietăți sunt dimensiunea și culoarea. Metodele unui control ne permit efectuarea unor acțiuni asupra controlului, cum ar fi poziționarea și redimensionarea. Evenimentele unui control ne permit scrierea de cod pentru a se răspunde la o acțiune, precum efectuarea unui click sau apăsarea unei taste.

Atunci când dezvoltăm un proiect Visual Basic care conține formulare, controale utilizator sau documente utilizator, putem plasa unul sau mai multe controale pe unul sau mai multe formulare, controale utilizator sau documente utilizator.

Fiecare control din Visual Basic dispune de proprietăți, metode și evenimente. Proprietățile unui control pot fi modificate atât în momentul proiectării, cât și în momentul executiei. Unele controale au proprietăți ce sunt disponibile numai la momentul execuției; altele au proprietăți disponibile exclusiv în momentul proiectării. Momentul proiectării se referă la dezvoltarea proiectului și cele mai multe modificări ale unui control la momentul proiectării vor fi relativ statice. Cu alte cuvinte, proprietățile nu se vor schimba semnificativ pe durata rulării programului. Fiecare control are una sau mai multe proprietăți. Proprietățile unui control descriu controlul respectiv, asa cum sunt dimensiunea, culoarea și poziția acestuia. De exemplu, controlul bara cu instrumente din cadrul proiectului dispune de proprietăți ce privesc alinierea, aspectul pictogramelor, numărul pictogramelor, etc.

Visual Basic ne oferă flexibilitatea de a modifica proprietățile unui control prin cod sau prin fereastra de proprietăți. Visual Basic conține o fereastră de proprietăți care afișează proprietățile unui control. Modificarea proprietăților unui control în cadrul ferestrei de proprietăți reprezintă o modificare a proprietăților în momentul proiectării. Proprietățile unui control sunt stabilite mai întâi pe baza valorilor din

fereastra de proprietăți. Apoi, Visual Basic procesează codul pe care l-am scris eventual pentru a altera proprietățile unui control.

Unul dintre cele mai uzuale controale din Visual Basic este controlul buton de comandă, care apare pe un formular ca un buton rectangular. Printre proprietățile unui buton de comandă se află culoarea de fond (BackColor), eticheta (Caption), starea de activare (Enabled), fontul (Font), înălțimea (Height), poziția pe orizontală (Left), poziția pe verticală (Top) și lățimea (Width).

Atunci când modificăm proprietatea Caption a unui control buton de comandă, Visual Basic înscrie pe suprafața controlului noua etichetă. La modificarea proprietății Enabled a controlului, Visual Basic fie ne va permite utilizarea controlului la momentul execuției (Enabled are valoarea True), fie va desena controlul cu gri și îl va dezactiva (Enabled are valoarea False). Schimbarea proprietății Font a unui control va determina Visual Basic să afișeze eticheta curentă cu fontul indicat de valoarea selectată.

Controlul Tabel flexibil va afișa activitățile planificate pe linii și coloane care pot să fie fixe sau standard. Coloanele și liniile fixe nu se deplasează odata cu derularea celorlalte coloane sau linii. În mod implicit, controlul tabel flexibil afișează un rând fix și o linie fixă. Numarul de linii și de coloane ce pot fi afișate de către controlul tabel flexibil este limitat de memoria virtuală disponibilă pentru proiect.

Fiecare linie și coloană dintr-un control tabel flexibil este specificat printr-o valoare întreagă. Controlul asociază valoarea întreaga 0 pentru prima linie, valoarea 1 pentru a doua linie și tot așa. În mod similar, controlul tabel flexibil asociază valoarea

întreagă 0 pentru prima coloană, valoarea 1 pentru a doua coloană și așa mai departe. Atunci când se efectuează un clic pe suprafața controlului tabel flexibil, Visual Basic stabilește valorile a două proprietăți, Row și Col. Aceste proprietăți conțin valorile pentru linia și coloana selectate în cadrul controlului tabel flexibil. Perechea de proprietăți Row și Col identifică o locație specifică în cadrul controlului tabel flexibil, locație numită celulă. Spre exemplu, poziția din controlul tabel flexibil pentru care Row=1 si Col=2 se numește și celula de la Row=1 și Col=2.

Numărul total de linii și de coloane ale unui control tabel flexibil poate fi stabilit fie prin cod, într-o procedură sau într-o funcție, fie prin intermediul ferestrei de proprietăți. Memoria virtuală disponibilă pe calculator este cea care determină numărul maxim de linii și coloane.

2.3.5.1 CONTROLUL ETICHETĂ (LABEL)

Controlul etichetă este utilizat pentru a afișa un text și nu poate fi editat de către utilizator. Se utilizează pentru a identifica obiecte pe o formă, de exemplu,

furnizează o descriere a ceea ce se întâmplă la selectarea unui control, sau la momentul execuției se pot afișa informații ca răspuns la un eveniment sau proces din aplicație.

Etichetele se folosesc în diferite scopuri. De obicei se utilizează pentru a eticheta controale care nu au proprietatea Caption. Se pot utiliza pentru a adăuga etichete descriptive la casetele de text, listă sau combo. De asemenea, se pot utiliza pentru a adăuga text descriptiv la o formă, de exemplu pentru a furniza utilizatorului informații de ajutor.

De asemenea, se poate scrie cod care are ca efect schimbarea textului afișat de un control etichetă ca răspuns la un eveniment la momentul execuției. De exemplu, dacă aplicația necesită câteva minute pentru a procesa o schimbare, se poate afișa un mesaj corespunzător cu ajutorul unei etichete.

Controlul etichetă nu poate primi focusul, dar poate fi utilizat pentru a crea chei de acces pentru alte controale.

2.3.5.2 CONTROLUL CASETĂ TEXT (TEXT BOX)

Controlul casetă de text este utilizat pentru introducerea informațiilor de către utilizator la momentul execuției programului, sau asignate proprietății Text a controlului la momentul proiectării sau execuției.

În general, caseta de text se utilizează pentru text editabil, dar se poate face și read-only prin setarea proprietății Locked la True.

Crearea unei casete de text de tip parolă se realizează prin specificarea în cadrul proprietății PasswordChar a caracterului care va fi afișat în caseta text.

2.3.5.3 CONTROLUL BUTON DE COMANDĂ (COMMAND BUTTON)

Controlul buton de comandă este utilizat pentru a începe, întrerupe sau sfârși un proces. Atunci când se face click pe el, el invocă o comandă care a fost scrisă în procedura eveniment Click a butonului respectiv.

Majoritatea aplicațiilor Visual Basic utilizează butoane de comandă care permit utilizatorului ca la apăsarea lor să execute anumite acțiuni.

Dupa amplasarea unui buton de comandă pe o formă, el poate fi redimensionat cu ajutorul mouse-ului, sau cu ajutorul proprietăților Height (înălțime) și Width (lățime).

Pe fiecare formă, se poate selecta un buton de comandă ca fiind buton implicit, ceea ce înseamnă că de fiecare dată când utilizatorul apasă tasta Enter, butonul de comandă este acționat, chiar dacă un alt buton de pe formă deține focusul. Pentru a realiza acest lucru se setează proprietatea Default la True.

Se poate specifica și un buton implicit de Cancel. Aceasta înseamnă că ori de câte ori utilizatorul apasă tasta Esc, butonul respectiv este acționat, chiar dacă alt control de pe formă deține focusul. Pentru a realiza acest lucru se setează la True proprietatea Cancel a butonului respectiv.

2.3.5.4 CONTROLUL CASETĂ COMBINATĂ (COMBO BOX)

Un control casetă combinată combină caracteristicile casetei text și cele ale casetei listă. Un astfel de control permite utilizatorului să selecteze un articol fie prin tastarea unui text, fie prin selectarea lui din listă.

Caseta combinată prezintă utilizatorului o listă de articole. Dacă numărul de articole din listă depășește mărimea listei, vor apare automat bare de derulare.

În general, o casetă combinată este folosită atunci când există o listă de articole, dar nu este obligatorie alegerea unui articol din listă, utilizatorul putând edita caseta de text disponibilă, spre deosebire de caseta listă când intrările sunt limitate la articolele din listă.

O casetă combinată are și avantajul economiei de spațiu într-o formă, pentru că lista nu este afișată decât atunci când utilizatorul execută click pe butonul de derulare

situat în partea dreaptă a controlului. Visual Basic include atât controlul casetă combinată standard, cât și pe cel legat de date.

Pentru adăugarea de articole la o casetă combinată se folosește metoda AddItem.

Dacă utilizatorul dorește să cunoască poziția în listă a unui articol selectat, se utilizează proprietatea ListIndex. Această proprietate setează sau returnează indexul articolului selectat în controlul casetă combinată și este valabilă numai pe parcursul execuției programului. Setarea acestei proprietăți pentru caseta combinată generează, de asemenea și evenimentul Click al controlului respectiv.

Valoarea acestei proprietăți este 0 dacă este selectat primul articol, 1 pentru al doilea, și așa mai departe. Valoarea acestei proprietăți este –1 dacă nu este nici un articol selectat.

Pentru a returna numărul de articole dintr-o casetă combinată se utilizează proprietatea ListCount. De exemplu, următoarea comandă utilizează această proprietate pentru a afișa într-o casetă text numărul de articole din caseta combinată Combo 1: Text 1. Text=”Există”& Combo 1. ListCount &” articole în listă”

2.3.5.5 CONTROLUL CASETĂ LISTĂ (LIST BOX)

Un control casetă listă afișează o listă de articole dintre care utilizatorul poate selecta unul sau mai multe articole.

Implicit, articolele din listă sunt afișate pe verticală într-o singură coloană, dar se pot seta și mai multe coloane. Dacă informația depășește mărimea listei, apar automat bare de derulare.

Visual Basic include atât controlul caseta listă standard, cât și pe cea legată de date.

2.3.6 Metode

Fiecare control are proprietăți și orice control poate fi descris pe baza acestor proprietăți. Pe lângă proprietăți, majoritatea controalelor oferă cel puțin o metodă. Putem vedea o metodă ca o acțiune pe care programul o poate efectua asupra controlului (prin contrast cu un eveniment, care este răspunsul unui control la acțiunea unui utilizator sau la o acțiune a programului). Spre exemplu, să presupunem că pentru controlul bară cu instrumente există o metodă Move (de fapt, chiar există). Metoda Move a unui control bară cu instrumente permite deplasarea unui astfel de control din poziția inițială într-o nouă poziție. Putem scrie în codul programului o procedură care să apeleze la metoda Move a controlului bară cu instrumente pentru a deplasa controlul din partea superioara a formularului în partea sa inferioară. Putem scrie, apoi, o altă procedură care să folosească metoda Move a controlului bară cu instrumente pentru a deplasa acest control din partea dreapta a formularului în partea sa stângă.

Aproape fiecare control din Visual Basic oferă cel puțin o metodă. Înainte de a apela la o metodă a unui control este întotdeauna recomandat să ințelegem ce anume face acea metodă. Visual Basic include un fișier de asistență cuprinzător pe care îl putem utiliza pentru a afla informații despre cele mai multe dintre controale. Atunci când apare o nelămurire în ceea ce privește un control și Visual Basic afișează informații de asistență pentru acel control, putem studia fiecare metodă pe care o ofera controlul în cauză. Pe lângă studierea metodelor de controale cu ajutorul sistemului de asistență din Visual Basic, avem și posibilitatea de a vedea descrieri ale metodelor unui control prin intermediul bibliotecii de obiecte (Object Browser) din Visual Basic. Biblioteca de obiecte consta într-o fereastră pe care Visual Basic o folosește pentru a afișa proprietățile, metodele și evenimentele unui control. Biblioteca de obiecte afișează atât controale, cât și alte elemente.

Unul dintre controalele cele mai utilizate din Visual Basic este controlul buton de comandă. Una dintre metodele controlului buton de comandă este Move. Metoda Move permite deplasarea controlului care oferă această metodă (așa cum este controlul buton de comandă) dintr-o poziție pe formular în alta. Metoda Move presupune cuvântul cheie Move și patru parametrii – Left, Top, Width si Height. Putem stabili câte o valoare pentru fiecare parametru. Parametrii Left și Top sunt folosiți pentru a determina poziția controlului, și anume distanța dintre marginea stângă a formularului și cea a controlului și, respectiv, distanța dintre extremitatea superioară a formularului și cea a controlului. Parametrii Width și Height sunt folosiți pentru a determina dimensiunea controlului. Putem apela la biblioteca de obiecte pentru a vedea proprietățile, metodele și evenimentele controlului buton de comandă. Pentru a afișa biblioteca de obiecte, selectăm comanda Object Browser din cadrul meniului View.

2.3.7 Evenimente

Majoritatea controalelor din Visual Basic dispun de proprietăți și de metode. Putem descrie un control prin intermediul proprietăților sale și putem utiliza metodele unui control pentru a efectua acțiuni asupra acestuia. Pe lângă proprietăți și metode, majoritatea controalelor dispun și de cel puțin un eveniment. Un eveniment este ceva ce s-ar putea sau nu să se producă pentru un control atunci când programul se află în execuție. Atunci când utilizatorul sau Visual Basic efectuează o acțiune asupra unui control, Windows răspunde la acea acțiune. Acțiunea poate produce un eveniment, sau evenimentul poate fi o consecință a acțiunii. De exemplu, atunci când efectuăm un click cu mouse-ul pe un control buton de comandă la momentul execuției (adică atunci când programul rulează), programul va invoca elementul Click al controlului. Pe de altă parte, atunci când efectuăm un click pe butonul de închidere al unui formular, acesta va genera două evenimente (Unload si QueryUnload), rezultate ale acțiunii de click cu mouse-ul, chiar dacă acțiunea în sine nu invocă de fapt nici un eveniment (formularul este cel care o face).

Pentru un eveniment putem să scriem un cod. De exemplu, după ce efectuăm un click pe un control buton de comandă și programul apelează evenimentul Click al acestuia, el va executa totodată codul pe care l-am plasat în zona corespunzătoare evenimentului Click. Această capacitate de a extinde procesarea unui eveniment înseamnă că puteți determina Visual Basic să răspundă la o acțiune în forme mai complexe, fără a fi necesară crearea unui nou control. De exemplu, un singur click pe un buton ar putea să creeze un nou formular, să completeze câmpurile acelui formular cu informații, să actualizeze o înregistrare în cadrul unei baze de date asociate cu programul și să afișeze un mesaj pentru utilizator. Visual Basic pune la dispoziție un sistem de asistență cuprinzător prin intermediul căruia putem afla informații despre cele mai multe controale. Atunci cînd avem o nelămurire în ceea ce privește un control și Visual Basic afișează informații de asistență pentru acel control, putem folosi acele informații pentru a studia fiecare eveniment de care dispune controlul în cauză. Pe langă studierea controalelor cu ajutorul sistemului de asistență din Visual Basic, avem posibilitatea de a obține descrieri ale controalelor și ale proprietăților, metodelor și evenimentelor acestora prin intermediul bibliotecii de obiecte din Visual Basic.

3.2.8 Module

Proiectele Visual Basic conțin, în general, cel puțin un formular sau un alt obiect vizual. Pe măsură ce proiectele vor crește în dimensiuni, vom fi nevoiți să folosim un modul. Un modul nu este un formular, ci mai degrabă un simplu container pentru cod de program. În cadrul ferestrei de cod a unui modul putem să declarăm variabile, să scriem funcții și proceduri și să declarăm structuri.

La declarea unei variabile în cadrul unui modul putem controla modul în care acea variabilă va fi accesată din program – putem face variabila accesibilă oricarui formular din proiect sau putem să restrângem accesul la modulul care o conține.

Atunci când declarăm o variabilă dintr-un modul ca privată (Private), acea variabila nu poate fi accesată direct dintr-un alt formular – tot așa cum o variabilă declarată privată în cadrul unei proceduri nu poate fi accesată din alte proceduri. Pe de altă parte, atunci când declarăm o variabilă dintr-un modul publică (Public), acea variabilă poate fi accesată din orice locație de cod din cadrul proiectului. În mod implicit, variabilele definite într-un modul sunt publice.

Dacă protejăm datele private dintr-un modul și oferim acces la acestea prin intermediul unei funcții publice, atunci datele private vor putea fi utilizate oriunde în proiect. Aceasta înseamnă că atunci când avem mai multe formulare, este posibil să transmitem informații de la un formular la altul și să protejăm în același timp datele originale.

2.3.9 Accesul la baza de date folosind obiectele de acces la date (DAO)

Motorul de baze de date Microsoft Jet expune o metodă de lucru cu bazele de date, și anume obiectele de acces la date (Data Access Object DAO). Utilizarea DAO necesită un volum de programare mare oferind în același timp un acces programatic complet la toate componentele bayei de date, precum și o flexibilitate semnificativ crescută.

Visual Basic și motorul de baze de date pun la dispoziția utilizatorului un set variat de obiecte de acces la date care oferă acestuia un control complet asupra bazei

de date și asigură posibilități inaccesibile controalelor asociate. Deși motorul Jet asigură acces programatic atât la structură, cât și la datele incluse într-o bază de date, DAO nu face o distincție clară între limbajul de definiție a datelor (Data Definition Language DDL) și limbajul de manipulare a datelor (Data Manipulation Language DML). Unele obiecte, precum Recordset (set de înregistrări), sunt folosite strict pentru manipularea datelor, în timp ce alte obiecte, precum TableDef (definiție tabel), acționează atât în direcția definirii, cât și a manipulării datelor. Există patru tipuri generale de operații cu date :

regăsirea înregistrărilor;

inserția de înregistrări noi;

actualizarea înregistrărilor existente;

ștergerea înregistrărilor.

DAO pune la dispoziția utilizatorului obiectul Recordset pentru regăsirea înregistrărilor, iar pentru inserția, actualizarea și ștergerea înregistrărilor disponibile atât obiectul Recordset, cât și metoda Execute.

Înainte de a folosi DAO într-un scop util, trebuie deschisă baza de date. În majoritatea cazurilor, această operație se reduce la utilizarea metodei OpenDatabase a spațiului de lucru prestabilit.

Printre colecțiile și obiectele specifice metodei DAO se numără:

Colecția Databases, obiectul Database

Obiectul Database este un membru al colecției Databases și reprezintă un mijloc de acces la un fișier bază de date deschis. Metoda OpenRecordset a obiectului Database creează un nou obiect Recordset și îl adaugă la colecția Recordsets.

Colecția Recordsets, obiectul Recordset

Colecția Recordsets conține toate obiectele Recordset deschise ale unei baze de date. Prin intermediul obiectului Recordset, este posibilă manipularea datelor și accesul la acestea. Între tipurile Recordset amintim Dynaset, Snapshot, Forward-Only și Dynamic. Toate seturile de înregistrări sunt acesibile prin rânduri (înregistrări) și coloane (câmpuri).

Printre metodele obiectului Recordset se numara:

AddNew adaugă o înregistrare nouă la setul curent de înregistrări;

Close închide setul de înregistrări curent;

Delete șterge înregistrarea curentă;

Edit pregătește înregistrarea curentă pentru editare folosind

programe Visual Basic;

MoveFirst se deplasează la prima înregistrare din setul de înregistrări;

MoveLast se deplasează la ultima înregistrare din setul de înregistrări;

MoveNext se deplasează la următoarea înregistrare din setul de

înregistrări;

MovePrevious se deplasează la înregistrarea anterioară din setul de

înregistrări;

OpenRecordset stabilește setul de înregistrări la o nouă selecție de

înregistrări;

Update salvează modificările specificate în setul de înregistrări dintr-

una din metodele AddNew sau Edit.

Câteva dintre proprietățile obiectului Recordset sunt:

BOF obține indicatorul de început de fișier;

EOF obține indicatorul de sfârșit de fișier;

Colecția Workspaces conține toate obiectele Workspace active care nu sunt ascunse. Un obiect Workspace definește modul de interacțiune a aplicației Visual Basic cu datele. Metoda OpenDatabase a obiectului Workspace deschide o bază de date în spațiul de lucru curent.

CAP.3 PREZENTARE APLICAȚIE

3.1 STRUCTURA BAZEI DE DATE

Proiectul prezentat în această lucrare folosește o bază de date realizată în Microsoft Access ce conține cinci tabele.

Figura 3.1 Structura bazei de date Calcul2004

Structura tabelelor bazei de date este prezentată în continuare.

3.1.1 Tabele

Tabelul Categorii

Figura 3.4 Structura tabelului Categorii

Tabelul Categorii ajută la stabilirea nomenclatoarelor de produse din cadrul unei firme. Acest tabel cuprinde următoarele câmpuri:

câmpul Cod_categorie este de tip AutoNumber (număr cu incrementare automată) și ajută la determinarea în mod unic a unei înregistrări din cadrul tabelului.

câmpul Denumire este de tip Text ce are o lungime de maxim 25 de caractere.

câmpul TVA este de tip Number și reprezintă TVA-ul stabilit pe fiecare categorie de produse. Acest câmp v-a ajuta la calcularea pretului de vânzare al produselor.

Tabelul Clienți

Figura 3.5 Structura tabelului Clienți

Tabelul Clienți a fost realizat pentru o structurare eficientă a activității firmei care utilizează programul. Acest tabel cuprinde următoarele câmpuri:

câmpul Cod_client este de tip AutoNumber (număr cu incrementare automată) și ajută la determinarea în mod unic a unei înregistrări din cadrul tabelului.

câmpurile Denumire, Adresa și Cod_fiscal sunt de tip Text cu o lungime de maxim 25 de caractere.

câmpul Nr_telefon este de tip Number.

Tabelul Facturi

Figura 3.6 Structura tabelului Facturi

Tabelul Facturi reflectă informatic desfășurarea activității unei firme. Pentru câmpurile din acest tabel s-au stabilit următoarele proprietăți:

câmpul Nr_factură este cheie primară, de tip AutoNumber (număr cu incrementare automată).

câmpul Data_factură este de tip Date/Time.

câmpurile Cod_client, Cod_agent și Nr_aviz au fost alese chei externe de tip Number pentru a stabili legătura cu tabelul Clienți, Șoferi respectiv Avize.

câmpul Valoare_totală este de tip Currency și reprezintă valoarea totală a unei facturi. Acest câmp se va calcula în momentul în care se va genera de către utilizatorul programului întocmirea unei facturi pe care s-au adăugat produse.

Tabelul Produse

Figura 3.7 Structura tabelului Produse

Tabelul Produse ajută la stabilirea nomenclatoarelor de produse din cadrul unei firme. Acest tabel cuprinde următoarele câmpuri:

câmpul Cod_produs este de tip AutoNumber (număr cu incrementare

automată) și ajută la determinarea în mod unic a unei înregistrări din cadrul tabelului.

câmpul Denumire este de tip Text ce are o lungime de maxim 30 de caractere.

câmpul Preț_fără_TVA este de tip Currency și reprezintă prețul unitar fărăTVA al produsului.

câmpul Cod_categorie a fost ales cheie externă de tip Number pentru a stabili legătura cu tabelul Categorii.

câmpul Stoc este de tip Number și asigură o evidență permanentă a stocului de produse al firmei.

Tabelul Produse/Factură

Figura 3.8 Structura tabelului Produse/Factură

Tabelul Produse/Factură a fost creat pentru a descompune legătura “mulți la mulți” ce exista între tabelele Produse și Facturi, într-o succesiune de 2 legături de “unu la mulți”. Tabelul conține:

cheile primare ale celor două tabele menționate mai sus, și anume Nr_factură și Cod_produs de tip Number, denumite și chei externe în acest tabel;

câmpul Cantitate de tip Number, necesar specificării cantității de produse ce va fi adăugată pe factură;

câmpurile Valoare_fără_TVA și Valoare_cu_TVA de tip Currency și reprezintă valoarea valoarea totală cu TVA și fără TVA a cantității de produse ce se adaugă pe o factură.

3.1.2 legăturiLE DIntre tabele

Între tabelele Clienți și Facturi s-a creat o legătură “unu la mulți” ceea ce justifică faptul că unui client îi pot fi întocmite una sau mai multe facturi, iar o factură nu poate fi întocmită decât unui singur client.

Legătura dintre tabelele Facturi și Produse este “mulți la mulți”, adica un produs poate exista pe mai multe facturi, iar o factura poate conține mai multe produse. Pentru descompunerea acesteia în două relații “unu la mulți” s-a adăugat tabela suplimentară Produse/Factură.

Între tabelele Categorii și Produse s-a realizat o legătură “unu la mulți” ceea ce justifică că unei categorii îi corespund mai multe produse, iar un produs nu aparține decât unei singure categorii.

În continuare este prezentată diagrama de legături a bazei de date folosită în acest proiect. Relațiile descrise mai sus sunt prezentate vizual și sugestiv în figura 3.11.

Figura 3.11 Diagrama de legături

3.2 REALIZAREA INTERFEȚEI GRAFICE

Interfața gafică a programului Calcul2004 a fost realizată în Visual Basic.

În diagrama următoare sunt prezentate toate componentele aplicației: Forme, Module și Rapoarte.

Figura 3.12 Componentele aplicației

3.2.1 MODULE

Startul aplicatiei se face prin procedura Main, din modulul modDeclarații, care are ca sarcină validarea conexiunii și afișarea ferestrei Login. Conexiunea la baza de date Calcul2004 s-a realizat cu ajutorul obiectelor metodei DAO în felul următor: se deschide baza de date în spațiul de lucru curent (g_WRK) cu ajutorul metodei OpenDatabase a obiectului Workspace.După validarea conexiunii se încarcă forma Login. Option Explicit

Public g_WRK As DAO.Workspace

Public g_DB As DAO.Database

Sub Main()

On Error GoTo errHandler

Set g_WRK = DAO.Workspaces(0)

Set g_DB = g_WRK.OpenDatabase(App.Path & "\Calcul2004.mdb")

If g_DB Is Nothing Then

MsgBox ("Conexiunea la baza de date nu a reusit" & vbCr & "Nu veti putea lucra cu aplicatia!")

End

End If

Meniu.Show

Exit Sub

errHandler:

MsgBox "Eroare nr. " & Err.Number & Chr(13) & "Denumire eroare " & Err.Description, vbCritical

End Sub

Public Sub ClearTexts(inObj As Form)

Dim ctrl As Control

If Not inObj Is Nothing Then

For Each ctrl In inObj.Controls

If TypeOf ctrl Is TextBox Then

If ctrl.Tag = "n" Then

ctrl.Text = "0"

ElseIf ctrl.Tag = "t" Then

If TypeOf ctrl Is TextBox Then ctrl.Text = Format(Now, "hh:mm:ss")

If TypeOf ctrl Is DTPicker Then ctrl.Value = Format(Now, "hh:mm:ss")

Else

ctrl.Text = ""

End If

End If

Next

End If

End Sub

3.2.2 FORME

3.2.2.1 FORMA MENIU

Figura 3.14 Forma Meniu

Forma principala a aplicatiei conține meniul principal, ce a fost creat cu ajutorul meniului Visual Basic MenuEditor, o casetă text care va afișa numele utilizatorului conectat la baza de date și o bară de stare care prezintă numele programului și data de lucru curenta.

În momentul efectuării unui click pe o opțiune de meniu, selectată din bara de meniu a acestei ferestre, va fi apelat evenimentul click al acesteia ce va executa apariția unei noi forme sau raport, în funcție de ce se optează.

Meniurile aplicației

Meniul Clienți permite o evidență informatică a clienților firmei.

Acțiunea ce se execută asupra acestui meniu este asemănătoare ca în cazul

celorlalte meniuri.

Private Sub mnuClienti_Click()

Dim frm As Clienti

Set frm = New Clienti

frm.Show , Me

End Sub

Meniul Facturi permite înregistrarea informatică a desfășurării

activității firmei, ce presupune intocmirea facturilor:

Acțiunea ce se va executa asupra meniului Facturi va determina apariția formei Facturi Netrimise.

Private Sub mnuFacturi_Click()

Dim frm As FacturiNetrimise

Set frm = New FacturiNetrimise

frm.Show , Me

End Sub

3.2.2.2 FORMA CLIENȚI

Forma Clienți a fost realizat pentru o structurare eficientă a activității firmei care utilizează programul. Datele introduse în această secțiune vor fi utile pentru reducerea timpului de întocmire a unei facturi prin realizarea unor căutări ce vor fi efectuate după numele clientului.

Cu ajutorul acestui utilitar se pot întreține datele despre clienții cu care lucrează firma. Oferă toate operațiile de întreținere a acestor date și anume adăugare, modificare, salvare și ștergere. În acest proiect, datele despre șoferi sunt utilizate la întocmirea avizelor, aceștia fiind cei care distribuie marfa de la firmă la clienți.

Acest utilitar este reprezentat de forma Clienți. Conține un control de tipul MSFlexGrid (tabel flexibil), casete text folosite pentru modificări și adăugări de noi înregistrări, meniuri de Adăugare, Salvare, Ștergere și Anulare, un control de tip Image folosit pentru revenirea la meniul principal al programului și un control label ce va afișa pentru fiecare meniu, în momentul acțiunii, o descriere specifică.

Apelul și execuția evenimentelor și procedurilor se va face în mod asemănător ca în cazurile precedente.

Figura 3.23 Forma Clienți

Codul pentru aceasta forma este:

Option Explicit

Private Type Client

IDClient As Long

Num As String

Adr As String

Telef As Long

CodF As String

End Type

Private myReg As Client

Private ifNew As Boolean

Private ifSaved As Boolean

Private Sub ImgExit_Click()

If Not ifSaved Then

If MsgBox("Doriti salvarea modificarilor!", vbQuestion Or vbYesNo) = vbYes Then

If CulegDate Then

Call SaveData

Unload Me

End If

Else

Unload Me

End If

Else

Unload Me

End If

End Sub

Private Sub mnuAnuleaza_Click()

LblStatus.Caption = "Selecteaza comanda dorita!"

mnuAdauga.Enabled = True

Casute True

mnuSave.Enabled = True

mnuAnuleaza.Enabled = True

mnuSterge.Enabled = True

FlxClienti.Enabled = True

Call ClearTexts(Me)

End Sub

Private Sub flxClienti_Click()

If FlxClienti.Row > 0 Then

Call flxClienti_RowColChange

End If

mnuSave.Enabled = True

Casute True

mnuAnuleaza.Enabled = True

mnuSterge.Enabled = True

mnuAdauga.Enabled = False

End Sub

Private Sub flxClienti_RowColChange()

If FlxClienti.Row > 0 Then

myReg.Num = FlxClienti.TextMatrix(FlxClienti.Row, 1)

myReg.IDClient = FlxClienti.TextMatrix(FlxClienti.Row, 5)

myReg.Adr = FlxClienti.TextMatrix(FlxClienti.Row, 2)

myReg.Telef = FlxClienti.TextMatrix(FlxClienti.Row, 3)

myReg.CodF = FlxClienti.TextMatrix(FlxClienti.Row, 4)

ifNew = False

Call PutData

End If

End Sub

Private Sub Form_Load()

Call ClearTexts(Me)

ifNew = False

ifSaved = True

With FlxClienti

.Cols = 6

.Rows = 1

.TextMatrix(0, 0) = "Nr. crt."

.ColWidth(0) = .Width * 0.08

.TextMatrix(0, 1) = "Nume"

.ColWidth(1) = .Width * 0.25

.TextMatrix(0, 2) = "Adresa"

.ColWidth(2) = .Width * 0.22

.TextMatrix(0, 3) = "Telefon"

.ColWidth(3) = .Width * 0.23

.TextMatrix(0, 4) = "Cod fiscal"

.ColWidth(4) = .Width * 0.2

.ColWidth(5) = 0

End With

Call LoadData

End Sub

Private Function CulegDate() As Boolean

On Error GoTo errHandler

If Trim(txtDenumire.Text) = "" Then

MsgBox "Introduceti numele clientului!", vbExclamation

txtDenumire.SetFocus

CulegDate = False

Exit Function

End If

myReg.Num = Trim(txtDenumire.Text)

If Trim(txtAdresa.Text) = "" Then

MsgBox "Introduceti adresa clientului!", vbExclamation

txtAdresa.SetFocus

CulegDate = False

Exit Function

End If

myReg.Adr = Trim(txtAdresa.Text)

If Trim(txtCodfiscal.Text) = "" Then

MsgBox "Introduceti codul fiscal al clientului!", vbExclamation

txtCodfiscal.SetFocus

CulegDate = False

Exit Function

End If

myReg.CodF = Trim(txtCodfiscal.Text)

If Trim(txtTelefon.Text) <> "" Then

txtTelefon.Text = Trim(txtTelefon.Text)

If Not IsNumeric(txtTelefon.Text) Then

MsgBox "Datele introduse trebuie sa fie numerice!", vbExclamation

txtTelefon.SetFocus

CulegDate = False

Exit Function

Else

'daca este numeric sa aiba cel putin 6 cifre

If Not CLng(txtTelefon.Text) > 100000 Then

MsgBox "Telefonul introdus trebuie sa aiba minim 6 cifre!", vbExclamation

txtTelefon.SetFocus

CulegDate = False

Exit Function

End If

End If

Else

MsgBox "Va rugam completati toate datele!", vbExclamation

txtTelefon.SetFocus

CulegDate = False

Exit Function

End If

myReg.Telef = CLng(txtTelefon.Text)

CulegDate = True

Exit Function

errHandler:

MsgBox "Error " & Err.Description, vbCritical

CulegDate = False

End Function

Private Function SaveData() As Boolean

On Error GoTo errHandler

Dim strSQL As String

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Clienti", dbOpenDynaset, dbFailOnError)

If ifNew Then

Do While Not rst.EOF

If Trim(txtDenumire.Text) = Trim(rst!Denumire) And Trim(txtCodfiscal.Text) = Trim(rst!Cod_fiscal) Then

MsgBox "Clientul exista deja inregistrat in baza de date!", vbInformation

txtDenumire.SetFocus

Call ClearTexts(Me)

'Exit Function

Exit Do

Else

rst.MoveNext

End If

Loop

If rst.EOF Then

rst.AddNew

rst.Fields(1).Value = myReg.Num

rst.Fields(2).Value = myReg.Adr

rst.Fields(3).Value = myReg.Telef

rst.Fields(4).Value = myReg.CodF

rst.Update

rst.MoveLast

ifSaved = True

Dim strLineFlex As String

strLineFlex = IIf(Not FlxClienti.Rows < 2, FlxClienti.Rows, 1) & vbTab & myReg.Num & vbTab & myReg.Adr & vbTab & myReg.Telef & vbTab & myReg.CodF & vbTab & rst!Cod_client

myReg.IDClient = rst!Cod_client

FlxClienti.AddItem strLineFlex

FlxClienti.Row = FlxClienti.Rows – 1

End If

Else

Set rst = g_DB.OpenRecordset("SELECT * FROM Clienti WHERE Cod_client = " & myReg.IDClient, dbOpenDynaset, dbFailOnError)

rst.Edit

rst.Fields(1).Value = myReg.Num

rst.Fields(2).Value = myReg.Adr

rst.Fields(3).Value = myReg.Telef

rst.Fields(4).Value = myReg.CodF

rst.Update

'acutalizez si in grid

With FlxClienti

.TextMatrix(.Row, 1) = myReg.Num

.TextMatrix(.Row, 2) = myReg.Adr

.TextMatrix(.Row, 3) = myReg.Telef

.TextMatrix(.Row, 4) = myReg.CodF

End With

End If

rst.Close

Set rst = Nothing

ifNew = False

ifSaved = True

SaveData = True

Exit Function

errHandler:

MsgBox "Error " & Err.Description, vbCritical

If Not rst Is Nothing Then

rst.Close

Set rst = Nothing

End If

SaveData = False

End Function

Private Sub LoadData()

On Error GoTo errHandler

Dim rst As DAO.Recordset

Dim strLineFlex As String

Dim l_contor As Integer

Set rst = g_DB.OpenRecordset("SELECT * FROM Clienti", dbOpenDynaset, dbFailOnError)

l_contor = 1

Do While Not rst.EOF

strLineFlex = ""

strLineFlex = l_contor & vbTab & IIf(IsNull(rst!Denumire), "", rst!Denumire) & vbTab & IIf(IsNull(rst!Adresa), "", rst!Adresa) & vbTab & IIf(IsNull(rst!Nr_telefon), 0, rst!Nr_telefon) & vbTab & IIf(IsNull(rst!Cod_fiscal), "", rst!Cod_fiscal) & vbTab & rst!Cod_client

myReg.IDClient = rst!Cod_client

FlxClienti.AddItem strLineFlex

l_contor = l_contor + 1

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

Exit Sub

errHandler:

MsgBox "Error " & Err.Description, vbCritical

If Not rst Is Nothing Then

rst.Close

Set rst = Nothing

End If

End Sub

Private Sub PutData()

If FlxClienti.Row > 0 Then

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Clienti where Cod_client = " & FlxClienti.TextMatrix(FlxClienti.Row, 5), dbOpenDynaset, dbFailOnError)

txtDenumire.Text = IIf(IsNull(rst!Denumire), "", rst!Denumire)

txtAdresa.Text = IIf(IsNull(rst!Adresa), "", rst!Adresa)

txtTelefon.Text = IIf(IsNull(rst!Nr_telefon), 0, rst!Nr_telefon)

txtCodfiscal.Text = IIf(IsNull(rst!Cod_fiscal), "", rst!Cod_fiscal)

rst.Close

Set rst = Nothing

Else

Call ClearTexts(Me)

End If

End Sub

Private Sub mnuAdauga_Click()

ifNew = True

LblStatus.Caption = "Adauga o noua inregistrare"

txtDenumire.SetFocus

If FlxClienti.Row > 0 Then

If Not ifSaved Then

If MsgBox("Salvati modificarile facute?", vbQuestion Or vbYesNo) = vbYes Then

'salvare inregistrare

If CulegDate Then

Call SaveData

Else

Exit Sub

End If

Else

'initiez o noua inregistrare

End If

End If

End If

Call ClearTexts(Me)

myReg.IDClient = 0

ifSaved = False

mnuSterge.Enabled = False

mnuAdauga.Enabled = False

mnuSave.Enabled = True

Casute True

mnuAnuleaza.Enabled = True

FlxClienti.Enabled = False

End Sub

Private Sub mnuSave_Click()

LblStatus.Caption = "Salveaza inregistrarea"

If CulegDate Then

If SaveData Then

ifSaved = True

End If

Call ClearTexts(Me)

End If

mnuAdauga.Enabled = True

Casute True

mnuSave.Enabled = True

mnuAnuleaza.Enabled = True

mnuSterge.Enabled = True

FlxClienti.Enabled = True

End Sub

Private Sub mnuSterge_Click()

On Error GoTo errHandler

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("Select * From Clienti", dbOpenDynaset, dbForwardOnly)

LblStatus.Caption = "Sterge inregistrarea"

If Not rst.BOF Then

If MsgBox("Doriti sa stergeti inregistrarea?", vbQuestion Or vbYesNo) = vbYes Then

If FlxClienti.Row > 0 Then

g_DB.Execute "DELETE from Clienti where Cod_client = " & FlxClienti.TextMatrix(FlxClienti.Row, 5), dbFailOnError

If FlxClienti.Rows = 2 Then

FlxClienti.Rows = 1

If FlxClienti.Rows = 1 Then

Call ClearTexts(Me)

End If

Else

FlxClienti.RemoveItem FlxClienti.Row

Call flxClienti_Click

End If

End If

End If

Else

MsgBox "Nu aveti inregistrari in baza de date!"

End If

Exit Sub

Casute False

mnuSterge.Enabled = False

mnuAnuleaza.Enabled = True

FlxClienti.Enabled = True

errHandler:

MsgBox "Error " & Err.Description, vbCritical

End Sub

Private Sub Casute(bVal As Boolean)

txtDenumire.Enabled = bVal

txtCodfiscal.Enabled = bVal

txtAdresa.Enabled = bVal

txtAdresa.Enabled = bVal

End Sub

3.2.2.3 FORMA PRODUSE

Cu ajutorul acestui utilitar se definesc categoriile și produsele pe care firma le pune la dispoziția clienților săi.

Utilitarul este realizat cu ajutorul formei Produse, pe care s-au amplasat casete de text, un control ListBox pentru afișarea categoriilor, butoane de comandă care permit adăuarea de noi înregistrări sau modificarea înregistrărilor existente, un control MSFlexGrid pentru afișarea produselor pentru fiecare categorie în parte, un contro Image necesar revenirii la meniul principal al programului și un control StatusBar care afișează data și ora curentă.

Figura 3.24 Forma Produse

Apelul evenimentului Load al formei se va face în momentul în care forma este încărcată prin acțiunea asupra submeniului Produse și va executa secvența de cod specifică:

Private Sub Form_Load()

On Error GoTo errHandler

cmdDelete.Enabled = False

Call ReincarcaDate

Exit Sub

Exit Sub

errHandler:

MsgBox "Description " & Err.Description

End Sub

Apelul funcției ReîncarcăDate execută deschiderea unui nou obiect Recordset ce va conține toate înregistrările din tabelul Categorii care vor fi adăugate în lista

lstCategorii cu ajutorul metodei AddItem al acesteia. Tot în momentul apelării acestei funcții se va executa și crearea începutului de tabel

Public Function ReincarcaDate() As Boolean

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenForwardOnly)

lstCategorii.Clear

Do While Not rst.EOF

lstCategorii.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " (" & IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value) & ")"

lstCategorii.ItemData(lstCategorii.ListCount – 1) = rst.Fields("Cod_categorie").Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

With flxProduse

.Cols = 5

.Rows = 1

.TextMatrix(0, 0) = "Cod produs"

.ColWidth(0) = flxProduse.Width * 0.1

.TextMatrix(0, 1) = "Produs"

.ColWidth(1) = flxProduse.Width * 0.3

.TextMatrix(0, 2) = "Pret"

.ColWidth(2) = flxProduse.Width * 0.25

.TextMatrix(0, 3) = "Stoc"

.ColWidth(3) = flxProduse.Width * 0.25

.ColWidth(4) = 0

End With

End Function

Adăugarea de noi categorii se va face prin efectuarea unui click pe butonul de comandă Adaugă categorie nouă. La efectuarea acțiunii se va apela evenimentul corespunzător acestei comenzi.

Private Sub cmdNewInreg_Click()

LblStatus.Caption = "Adauga o noua categorie!"

ifNew = True

Categ.CodCateg = 0

Categ.Den = ""

Categ.Adaos = 0#

txtCategorie.SetFocus

Call ClearTexts(Me)

cmdsterg.Enabled = False

cmdNewInreg.Enabled = False

cmdSave.Enabled = True

Casute True

cmdcancel.Enabled = True

lstCategorii.Enabled = False

End Sub

Salvarea înregistrării adăugate se realizează prin apelarea evenimentului Click corespunzător butonului de comandă Salvează. În cadrul acestui eveniment se vor verifica mai întâi datele introduse și dacă acestea sunt corecte se va efectua salvarea

înregistrării în baza de date cu ajutorul metodei AddNew respectiv Update ale variabilei obiect rst, dacă înregistrarea este nouă, sau cu ajutorul metodei Edit a

obiectului Recordset, dacă se realizează o modificare în cadrul setului de înregistrări. După realizarea acestor modificări lista de categorii va fi și ea actulizată.

Private Sub cmdSave_Click()

On Error GoTo errHandler

LblStatus.Caption = "Salveaza categoria introdusa!"

If Trim(txtCategorie.Text) = "" Then

MsgBox "Nu ati specificat categoria!", vbInformation

txtCategorie.SetFocus

Exit Sub

Else

Categ.Den = Trim(txtCategorie.Text)

End If

If Trim(txtTVA.Text) <> "" Then

'Txttva.Text = CSng(Txttva.Text)

If IsNumeric(txtTVA.Text) Then

If CSng(txtTVA.Text) <= 0 Then

MsgBox "TVA-ul trebuie sa fie strict mai mare ca zero!", vbCritical

txtTVA.SetFocus

Exit Sub

Else

Categ.Adaos = CSng(txtTVA.Text)

End If

Else

MsgBox "TVA-ul trebuie sa aiba o valoare numerica!", vbCritical

txtTVA.SetFocus

Exit Sub

End If

txtTVA.Text = CSng(txtTVA.Text)

Else

MsgBox "Specificati TVA-ul!", vbInformation

txtTVA.SetFocus

Exit Sub

End If

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenDynaset, dbFailOnError)

If Trim(txtCategorie.Text) = Trim(rst!Denumire) Then

MsgBox "Categoria exista deja!"

txtCategorie.SetFocus

Else

If ifNew Then

rst.AddNew

rst!Denumire = Categ.Den

rst!TVA = Categ.Adaos

rst.Update

rst.MoveLast

ifNew = False

Else

If lstCategorii.ListIndex >= 0 Then

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii where Cod_categorie = " & Categ.CodCateg, dbOpenDynaset, dbFailOnError)

rst.Edit

rst!Denumire = Categ.Den

rst!TVA = Categ.Adaos

rst.Update

Else

Exit Sub

End If

End If

End If

rst.Close

Set rst = Nothing

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenForwardOnly)

lstCategorii.Clear

Do While Not rst.EOF

lstCategorii.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " (" & IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value) & ")"

lstCategorii.ItemData(lstCategorii.ListCount – 1) = rst.Fields("Cod_categorie").Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

Call lstCategorii_Click

Exit Sub

cmdNewInreg.Enabled = True

Casute True

cmdSave.Enabled = True

cmdcancel.Enabled = True

cmdsterg.Enabled = True

lstCategorii.Enabled = True

Call ClearTexts(Me)

errHandler:

On Error Resume Next

MsgBox "Desription " & Err.Description, vbCritical

If Not rst Is Nothing Then

On Error Resume Next

rst.Close

Set rst = Nothing

End If

End Sub

Valoarea TVA-ului introdusă pentru fiecare categorie se va utiliza la calcularea prețului de vânzare al produselor.

Afișarea produselor în tabelul flexibil flxProduse se va face în urma selectării unei categorii din lista de categorii la apelarea următoarei secvențe de cod:

Private Sub lstCategorii_Click()

cmdDelete.Enabled = True

If lstCategorii.ListIndex >= 0 Then

Call PutData

Dim rst As DAO.Recordset

Dim strline As String

Dim contor As Long

Set rst = g_DB.OpenRecordset("SELECT * FROM Produse WHERE Cod_categorie = " & lstCategorii.ItemData(lstCategorii.ListIndex), dbOpenForwardOnly)

flxProduse.Rows = 1

contor = 1

Do While Not rst.EOF

With flxProduse

strline = ""

strline = contor & vbTab

strline = strline & rst!Denumire & vbTab

strline = strline & rst!Pret_fara_TVA & vbTab

strline = strline & rst!Stoc! & vbTab

strline = strline & rst!Cod_produs & vbTab

.AddItem strline

End With

flxProduse.Refresh

rst.MoveNext

contor = contor + 1

Loop

rst.Close

Set rst = Nothing

Else

Categ.CodCateg = 0

Categ.Den = ""

Categ.Adaos = 0#

Call ClearTexts(Me)

End If

cmdSave.Enabled = True

Casute True

cmdcancel.Enabled = True

cmdsterg.Enabled = True

cmdNewInreg.Enabled = False

End Sub

Funcția PutData este apelată la execuția evenimentului Click specific listei lstCategorii și execută afișarea în casetele de text de pe formă a categoriei și a valoarii TVA-ului specific înregistrării selectate de utilizator din listă.

Private Sub PutData()

If lstCategorii.ListIndex >= 0 Then

Categ.CodCateg = lstCategorii.ItemData(lstCategorii.ListIndex)

Dim l_poz As Integer

l_poz = InStr(1, lstCategorii.List(lstCategorii.ListIndex), "(", vbTextCompare)

Categ.Den = Trim(Mid(lstCategorii.List(lstCategorii.ListIndex), 1, l_poz – 1))

txtCategorie.Text = Categ.Den

Dim l_strTVA As String

l_strTVA = Trim(Mid(lstCategorii.List(lstCategorii.ListIndex), l_poz + 1, Len(lstCategorii.List(lstCategorii.ListIndex)) – l_poz – 1))

If IsNumeric(l_strTVA) Then

Categ.Adaos = CSng(l_strTVA)

txtTVA.Text = Categ.Adaos

Else

Categ.Adaos = 0

End If

End If

End Sub

Adăugarea sau modificarea unui produs se face cu ajutorul formei ModificăriProduse. Adăugarea produsului se face selectând mai întâi categoria în cadrul căreia vrem să adăugăm produsul și apoi apăsând butonul Adaugă produse. La apăsarea acestui buton se acționează evenimentul Click corespunzător acestuia ce va duce la apariția formei ModificăriProduse. Secvența de cod specifică acestui veniment este următoarea :

Private Sub cmdAdd_Click()

If lstCategorii.ListIndex >= 0 Then

Pretproduse.myCodcategorie = lstCategorii.ItemData(lstCategorii.ListIndex)

Pretproduse.Show 1, Me

Pretproduse.txtProdus.Enabled = True

Pretproduse.txtStoc.Enabled = True

Call ClearTexts(Me)

Call lstCategorii_Click

Else

MsgBox "Selectati mai intai categoria de produse!", vbInformation

End If

End Sub

Cum am specificat mai sus această formă este folosită pentru a adăuga sau a modifica produsele selectate în tabelul existent pe forma Produse.

Salvarea înregistrărilor adăugate sau modificate se va face executând codul specific evenimentului Click al butonului de comandă Salvează.

Pentru întocmirea unei facturi va fi nevoie de introducerea în casetele text a clientului căruia i se întocmește factura. Casetele text de pe această formă au proprietatea Enabled setată pe False. În cazul de față utilizatorul nu va avea acces direct la datele din aceste casete. Afișarea datelor în aceste casete va fi generată în momentul apelării evenimentul Click al butonului de comandă Adaugă de pe forma selecție clienți. Pentru încărcarea acestei forme va fi necesară apelarea evenimentului Click al controlului Image specific căutării clienților.

Private Sub imgClienti_Click()

SelectieClienti.Show

Unload Me

End Sub

Figura 3.27 Forma Selecție clienți

Afișarea clienților în lista lstClienți va fi executată la apelul evenimentului Load af formei Selecție clienți.

Private Sub Form_Load()

On Error GoTo errHandler

Call ReincarcaDate

Exit Sub

Exit Sub

errHandler:

MsgBox "Description " & Err.Description

End Sub

Public Function ReincarcaDate() As Boolean

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Clienti", dbOpenForwardOnly)

lstClienti.Clear

Do While Not rst.EOF

lstClienti.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " –

" & IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value)

lstClienti.ItemData(lstClienti.ListCount – 1) = rst.Fields("Cod_client").Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

End Function

În cadrul acestei forme s-a făcut o căutare după numele clientului. La apelarea evenimentului KeyUp al casetei de text txtcaută se va crea un nou obiect Recordset

ce va conține toți clienții din tabelul Clienți al bazei de date al căror nume începe cu litera introdusă de utilizator în caseta txtcaută, în același timp actualizându-se și lista lstClienți.

Private Sub txtcauta_KeyUp(KeyCode As Integer, Shift As Integer)

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("Select * From Clienti Where denumire like """ & txtcauta.Text & "*""", dbOpenDynaset, dbForwardOnly)

If Not rst.EOF Then

lstClienti.Clear

Do While Not rst.EOF

lstClienti.AddItem (rst.Fields(1).Value & " – " & rst.Fields(2).Value)

rst.MoveNext

Loop

End If

End Sub

Adăugarea clientului selectat din listă se va face prin execuția următoarei secvențe de program:

Private Sub mnuAdauga_Click()

ifNew = True

LblStatus.Caption = "Adauga o noua inregistrare"

txtDenumire.SetFocus

If FlxClienti.Row > 0 Then

If Not ifSaved Then

If MsgBox("Salvati modificarile facute?", vbQuestion Or vbYesNo) = vbYes Then

'salvare inregistrare

If CulegDate Then

Call SaveData

Else

Exit Sub

End If

Else

'initiez o noua inregistrare

End If

End If

End If

Call ClearTexts(Me)

myReg.IDClient = 0

ifSaved = False

mnuSterge.Enabled = False

mnuAdauga.Enabled = False

mnuSave.Enabled = True

Casute True

mnuAnuleaza.Enabled = True

FlxClienti.Enabled = False

End Sub

După selectarea clientului căruia i se întocmește factura, a agentului care a adus comanda de la client ce ajută la întocmirea facturii și a datei curente se va putea apăsa butonul de comandă Save.

Private Sub mnuSave_Click()

LblStatus.Caption = "Salveaza inregistrarea"

If CulegDate Then

If SaveData Then

ifSaved = True

End If

Call ClearTexts(Me)

End If

mnuAdauga.Enabled = True

Casute True

mnuSave.Enabled = True

mnuAnuleaza.Enabled = True

mnuSterge.Enabled = True

FlxClienti.Enabled = True

End Sub

Procedura SaveFactura apelată în cadrul evenimentului anterior execută adăugarea unei noi înregistrări în tabelul Facturi al bazei de date și afișarea valorilor existente în controalele text, respectiv combobox de pe forma Facturi netrimise, în casetele text existente pe forma Intocmire factură, casete ce nu sunt accesibile utilizatorului, fiind folosite numai pentru afișarea datelor despre factură (date despre client, despre agent și numărul și data întocmirii facturii).

Figura 3.28 Forma Întocmire factură

Pe această formă, pe lângă casetele text folosite pentru afișarea datelor despre factură, mai sunt adăugate butoane de comandă folosite pentru adăugări de produse pe factură, calculul valorii totale al facturii, controale etichete folosite pentru afișarea valorii facturii și un tabel flexibil pentru vizualizarea produselor ce sunt adăugate prin intermediul formei Selecție produse.

În momentul acțiunii asupra butonului Adaugă produs, va fi apelat evenimentul Click corespunzător acestui produs ce va executa următoarea secvență de program:

Private Sub cmdAdauga_Click()

SelectieProduse.Show 1, Me

End Sub

Figura 3.29 Forma Selecție produse

Codul pentru tabelul produse este:

Option Explicit

Private notriger As Boolean

Private Type MyRecord

CodCateg As Long

Den As String

Adaos As Single

End Type

Private SetInreg() As MyRecord

Private Categ As MyRecord

Private ifNew As Boolean

Private Sub cmdAdd_Click()

If lstCategorii.ListIndex >= 0 Then

Pretproduse.myCodcategorie = lstCategorii.ItemData(lstCategorii.ListIndex)

Pretproduse.Show 1, Me

Pretproduse.txtProdus.Enabled = True

Pretproduse.txtStoc.Enabled = True

Call ClearTexts(Me)

Call lstCategorii_Click

Else

MsgBox "Selectati mai intai categoria de produse!", vbInformation

End If

End Sub

Private Sub cmdDelete_Click()

On Error GoTo errHandler

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Produse Where Cod_categorie=" & lstCategorii.ItemData(lstCategorii.ListIndex), dbOpenForwardOnly)

If rst.EOF Then

MsgBox "Nu aveti produse definite in categoria " & txtCategorie & "!", vbInformation

Else

If MsgBox("Doriti sa stergeti inregistrarea?", vbQuestion Or vbYesNo) = vbYes Then

If lstCategorii.ListIndex >= 0 Then

Pretproduse.myCodcategorie = lstCategorii.ItemData(lstCategorii.ListIndex)

If flxProduse.Row > 0 Then

If flxProduse.TextMatrix(flxProduse.Row, 4) <> "" Then

g_DB.Execute "delete from Produse where Cod_produs = " & flxProduse.TextMatrix(flxProduse.Row, 4)

Else

Set Pretproduse = Nothing

End If

Call lstCategorii_Click

End If

End If

End If

End If

Exit Sub

errHandler:

MsgBox "Error " & Err.Description, vbCritical

End Sub

Private Sub cmdCancel_Click()

LblStatus.Caption = "Selecteaza comanda dorita!"

cmdNewInreg.Enabled = True

Casute True

cmdSave.Enabled = True

cmdcancel.Enabled = True

cmdsterg.Enabled = True

lstCategorii.Enabled = True

Call ClearTexts(Me)

End Sub

Private Sub cmdNewInreg_Click()

LblStatus.Caption = "Adauga o noua categorie!"

ifNew = True

Categ.CodCateg = 0

Categ.Den = ""

Categ.Adaos = 0#

txtCategorie.SetFocus

Call ClearTexts(Me)

cmdsterg.Enabled = False

cmdNewInreg.Enabled = False

cmdSave.Enabled = True

Casute True

cmdcancel.Enabled = True

lstCategorii.Enabled = False

End Sub

Private Sub cmdSave_Click()

On Error GoTo errHandler

LblStatus.Caption = "Salveaza categoria introdusa!"

If Trim(txtCategorie.Text) = "" Then

MsgBox "Nu ati specificat categoria!", vbInformation

txtCategorie.SetFocus

Exit Sub

Else

Categ.Den = Trim(txtCategorie.Text)

End If

If Trim(txtTVA.Text) <> "" Then

'Txttva.Text = CSng(Txttva.Text)

If IsNumeric(txtTVA.Text) Then

If CSng(txtTVA.Text) <= 0 Then

MsgBox "TVA-ul trebuie sa fie strict mai mare ca zero!", vbCritical

txtTVA.SetFocus

Exit Sub

Else

Categ.Adaos = CSng(txtTVA.Text)

End If

Else

MsgBox "TVA-ul trebuie sa aiba o valoare numerica!", vbCritical

txtTVA.SetFocus

Exit Sub

End If

txtTVA.Text = CSng(txtTVA.Text)

Else

MsgBox "Specificati TVA-ul!", vbInformation

txtTVA.SetFocus

Exit Sub

End If

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenDynaset, dbFailOnError)

If Trim(txtCategorie.Text) = Trim(rst!Denumire) Then

MsgBox "Categoria exista deja!"

txtCategorie.SetFocus

Else

If ifNew Then

rst.AddNew

rst!Denumire = Categ.Den

rst!TVA = Categ.Adaos

rst.Update

rst.MoveLast

ifNew = False

Else

If lstCategorii.ListIndex >= 0 Then

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii where Cod_categorie = " & Categ.CodCateg, dbOpenDynaset, dbFailOnError)

rst.Edit

rst!Denumire = Categ.Den

rst!TVA = Categ.Adaos

rst.Update

Else

Exit Sub

End If

End If

End If

rst.Close

Set rst = Nothing

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenForwardOnly)

lstCategorii.Clear

Do While Not rst.EOF

lstCategorii.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " (" & IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value) & ")"

lstCategorii.ItemData(lstCategorii.ListCount – 1) = rst.Fields("Cod_categorie").Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

Call lstCategorii_Click

Exit Sub

cmdNewInreg.Enabled = True

Casute True

cmdSave.Enabled = True

cmdcancel.Enabled = True

cmdsterg.Enabled = True

lstCategorii.Enabled = True

Call ClearTexts(Me)

errHandler:

On Error Resume Next

MsgBox "Desription " & Err.Description, vbCritical

If Not rst Is Nothing Then

On Error Resume Next

rst.Close

Set rst = Nothing

End If

End Sub

Private Sub CmdSterg_Click()

On Error GoTo errHandler

Casute False

cmdsterg.Enabled = False

cmdcancel.Enabled = True

lstCategorii.Enabled = True

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("select * From Categorii", dbOpenDynaset, dbForwardOnly)

LblStatus.Caption = "Sterge inregistrarea!"

If Not rst.BOF Then

If MsgBox("Doriti sa stergeti inregistrarea?", vbQuestion Or vbYesNo) = vbYes Then

If lstCategorii.ListIndex > 0 Then

g_DB.Execute "DELETE from Categorii where Cod_categorie = " & lstCategorii.ItemData(lstCategorii.ListIndex), dbFailOnError

If lstCategorii.ListIndex = 2 Then

lstCategorii.ListIndex = 1

If lstCategorii.ListIndex = 1 Then

Call ClearTexts(Me)

End If

Else

lstCategorii.RemoveItem lstCategorii.ListIndex

Call lstCategorii_Click

End If

End If

End If

Else

MsgBox "Nu aveti inregisrari in baza de date!"

End If

Exit Sub

errHandler:

MsgBox "Error " & Err.Description, vbCritical

End Sub

Private Sub Exit_Click()

Unload Me

End Sub

Private Sub Form_Load()

On Error GoTo errHandler

cmdDelete.Enabled = False

Call ReincarcaDate

Exit Sub

Exit Sub

errHandler:

MsgBox "Description " & Err.Description

End Sub

Private Sub PutData()

If lstCategorii.ListIndex >= 0 Then

Categ.CodCateg = lstCategorii.ItemData(lstCategorii.ListIndex)

Dim l_poz As Integer

l_poz = InStr(1, lstCategorii.List(lstCategorii.ListIndex), "(", vbTextCompare)

Categ.Den = Trim(Mid(lstCategorii.List(lstCategorii.ListIndex), 1, l_poz – 1))

txtCategorie.Text = Categ.Den

Dim l_strTVA As String

l_strTVA = Trim(Mid(lstCategorii.List(lstCategorii.ListIndex), l_poz + 1, Len(lstCategorii.List(lstCategorii.ListIndex)) – l_poz – 1))

If IsNumeric(l_strTVA) Then

Categ.Adaos = CSng(l_strTVA)

txtTVA.Text = Categ.Adaos

Else

Categ.Adaos = 0

End If

End If

End Sub

Private Sub lstCategorii_Click()

cmdDelete.Enabled = True

If lstCategorii.ListIndex >= 0 Then

Call PutData

Dim rst As DAO.Recordset

Dim strline As String

Dim contor As Long

Set rst = g_DB.OpenRecordset("SELECT * FROM Produse WHERE Cod_categorie = " & lstCategorii.ItemData(lstCategorii.ListIndex), dbOpenForwardOnly)

flxProduse.Rows = 1

contor = 1

Do While Not rst.EOF

With flxProduse

strline = ""

strline = contor & vbTab

strline = strline & rst!Denumire & vbTab

strline = strline & rst!Pret_fara_TVA & vbTab

strline = strline & rst!Stoc! & vbTab

strline = strline & rst!Cod_produs & vbTab

.AddItem strline

End With

flxProduse.Refresh

rst.MoveNext

contor = contor + 1

Loop

rst.Close

Set rst = Nothing

Else

Categ.CodCateg = 0

Categ.Den = ""

Categ.Adaos = 0#

Call ClearTexts(Me)

End If

cmdSave.Enabled = True

Casute True

cmdcancel.Enabled = True

cmdsterg.Enabled = True

cmdNewInreg.Enabled = False

End Sub

Public Function ReincarcaDate() As Boolean

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenForwardOnly)

lstCategorii.Clear

Do While Not rst.EOF

lstCategorii.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " (" & IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value) & ")"

lstCategorii.ItemData(lstCategorii.ListCount – 1) = rst.Fields("Cod_categorie").Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

With flxProduse

.Cols = 5

.Rows = 1

.TextMatrix(0, 0) = "Cod produs"

.ColWidth(0) = flxProduse.Width * 0.1

.TextMatrix(0, 1) = "Produs"

.ColWidth(1) = flxProduse.Width * 0.3

.TextMatrix(0, 2) = "Pret"

.ColWidth(2) = flxProduse.Width * 0.25

.TextMatrix(0, 3) = "Stoc"

.ColWidth(3) = flxProduse.Width * 0.25

.ColWidth(4) = 0

End With

End Function

Private Sub Casute(bVal As Boolean)

txtCategorie.Enabled = bVal

txtTVA.Enabled = bVal

End Sub

Private Sub flxProduse_EnterCell()

If notriger Then Exit Sub

notriger = True

flxProduse.Col = 0

notriger = False

flxProduse.CellBackColor = &H808080

End Sub

Private Sub flxProduse_LeaveCell()

If notriger Then Exit Sub

notriger = True

flxProduse.Col = 0

notriger = False

flxProduse.CellBackColor = &H8000000F

End Sub

CAP. 4 CONCLUZII ȘI PROPUNERI DE ÎMBUNĂTĂȚIRE

Acest proiect reprezintă un exemplu de aplicație a cărui interfață a fost realizată în Mocrosoft Visual Basic 6 ce utilizează o bază de date Access.

Programul Calcul2004 oferă :

definirea unei structuri organizatorice a firmei printr-o evidență a clienților și produselor;

realizarea operației de întocmire a facturilor;

evidența facturilor emise și a valorii totale a acestora într-o perioadă stabilită de utilizator;

evidența facturilor emise pentru fiecare client;

evidența prețului unitar și a prețului de vânzare al fiecărui produs.

Ca principiu general, prezentul program nu ține o evidență a documentelor de intrare specifice aprovizionării cu marfă a firmei, stocul fiind introdus de către utilizator și actualizat automat după fiecare vânzare a produsului. Implementarea unui asemenea program, precum și o evidență a încasărilor facturilor ar putea extinde în viitor acest program.

LISTING SURSĂ

Forma Meniu

Private Sub mnuAbout_Click()

Dim frm As About

Set frm = New About

frm.Show , Me

End Sub

Private Sub mnuAgenti_Click()

Dim frm As Agenti

Set frm = New Agenti

frm.Show , Me

End Sub

Private Sub mnuAvize_Click()

Dim frm As IntocmireAviz

Set frm = New IntocmireAviz

frm.Show , Me

End Sub

Private Sub mnuClienti_Click()

Dim frm As Clienti

Set frm = New Clienti

frm.Show , Me

End Sub

Private Sub mnuExit_Click()

End

End Sub

Private Sub mnuFacturi_Click()

Dim frm As FacturiNetrimise

Set frm = New FacturiNetrimise

frm.Show , Me

End Sub

Private Sub mnuFacturiA_Click()

Dim frm As FacturiAvize

Set frm = New FacturiAvize

frm.Show , Me

End Sub

Private Sub mnuFacturiClienti_Click()

RaportFacturiEmise.Show , Me

End Sub

Private Sub mnuFacturiData_Click()

Dim frm As FacturiEmise

Set frm = New FacturiEmise

frm.Show , Me

End Sub

Private Sub mnuLstP_Click()

Listaproduse.Show , Me

End Sub

Private Sub mnuProduse_Click()

Dim frm As Produse

Set frm = New Produse

frm.Show , Me

End Sub

Private Sub mnuScUtilizator_Click()

Dim frm As Schimba

Set frm = New Schimba

frm.Show , Me

End Sub

Private Sub mnuSoferi_Click()

Dim frm As Soferi

Set frm = New Soferi

frm.Show , Me

End Sub

Private Sub mnuStoc_Click()

Stoc.Show , Me

End Sub

Forma ÎntocmireFactură

Option Explicit

Private notriger As Boolean

Private myval As Currency

Private g_CanCalc As Boolean

Private Sub cmdAdauga_Click()

SelectieProduse.Show 1, Me

End Sub

Private Sub cmdIntocmeste_Click()

On Error GoTo errHandler

If g_CanCalc Then

Dim rst As DAO.Recordset

g_DB.Execute ("UPDATE Facturi SET Valoare_totala = " & myval & " WHERE

Nr_factura = " & txtNr.Text)

Unload Me

FacturiNetrimise.flxFacturi.Refresh

Else

MsgBox "Mai intai trebuie sa calculati valoarea!", vbExclamation

Exit Sub

End If

Exit Sub

errHandler:

MsgBox "Error " & Err.Description

End Sub

Private Sub cmdValoare_Click()

If CalculeazaValoare Then

'CalculeazaValoare = True

lblcalcul.Caption = Format(myval, "##,##0.00")

Else

'CalculeazaValoare = False

lblcalcul.Caption = "necalculata"

End If

End Sub

Private Sub Form_Load()

With flxProduseF

.Cols = 9

.Rows = 1

.TextMatrix(0, 0) = "Nr. crt."

.ColWidth(0) = .Width * 0.06

.TextMatrix(0, 1) = "Produs"

.ColWidth(1) = .Width * 0.2

.TextMatrix(0, 2) = "T.V.A%"

.ColWidth(2) = .Width * 0.08

.TextMatrix(0, 3) = "Cantitate"

.ColWidth(3) = .Width * 0.08

.TextMatrix(0, 4) = "Pret unitar(fara TVA)"

.ColWidth(4) = .Width * 0.2

.TextMatrix(0, 5) = "Valoare"

.ColWidth(5) = .Width * 0.18

.TextMatrix(0, 6) = "Valoare TVA"

.ColWidth(6) = .Width * 0.18

.ColWidth(7) = 0

.ColWidth(8) = 0

End With

g_CanCalc = False

End Sub

Private Sub flxProduseF_EnterCell()

If notriger Then Exit Sub

notriger = True

flxProduseF.Col = 0

notriger = False

flxProduseF.CellBackColor = &H808080

End Sub

Private Sub flxProduseF_LeaveCell()

If notriger Then Exit Sub

notriger = True

flxProduseF.Col = 0

notriger = False

flxProduseF.CellBackColor = &H8000000F

End Sub

Private Function CalculeazaValoare() As Boolean

On Error GoTo errHandler

'validari

'produsul

If flxProduseF.Row > 0 Then

CalculeazaValoare = True

Else

MsgBox "Adaugai mai intai produse pe factura!", vbInformation

End If

Dim strSQL As String

strSQL = "SELECT Sum([Valoare_fara_TVA]+[Valoare_cu_TVA]) AS Valoare_totala

FROM Facturi INNER JOIN [Produse/Factura] ON Facturi.Nr_factura =

[Produse/Factura].Nr_factura WHERE (((Facturi.Nr_factura)=" & txtNr.Text & "))"

Dim Val As Currency

Dim rst As DAO.Recordset

Dim fld As DAO.Field

Set rst = g_DB.OpenRecordset(strSQL, dbOpenForwardOnly, dbFailOnError)

Do While Not rst.EOF

lblcalcul.Caption = ""

For Each fld In rst.Fields

Val = fld.Value

myval = Val

Next

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

CalculeazaValoare = True

g_CanCalc = True

Exit Function

errHandler:

CalculeazaValoare = False

MsgBox "Introduceti mai intai produse pe factura!", vbInformation

End Function

Forma Produse

Option Explicit

Private notriger As Boolean

Private Type MyRecord

CodCateg As Long

Den As String

Adaos As Single

End Type

Private SetInreg() As MyRecord

Private Categ As MyRecord

Private ifNew As Boolean

Private Sub cmdCancel_Click()

lblStatus.Caption = "Selecteaza comanda dorita!"

cmdNewInreg.Enabled = True

Casute True

cmdSave.Enabled = True

cmdcancel.Enabled = True

lstCategorii.Enabled = True

Call ClearTexts(Me)

End Sub

Private Sub cmdModifStoc_Click()

If lstCategorii.ListIndex >= 0 Then

ModificariProduse.myCodcategorie = lstCategorii.ItemData(lstCategorii.ListIndex)

If flxProduse.Row > 0 Then

If flxProduse.TextMatrix(flxProduse.Row, 4) <> "" Then

ModificariProduse.myIDinreg = CLng(flxProduse.TextMatrix(flxProduse.Row, 4))

ModificariProduse.myprodus = flxProduse.TextMatrix(flxProduse.Row, 1)

ModificariProduse.myPret = CCur(flxProduse.TextMatrix(flxProduse.Row, 2))

ModificariProduse.mystoc = CLng(flxProduse.TextMatrix(flxProduse.Row, 3))

ModificariProduse.txtProdus = ModificariProduse.myprodus

ModificariProduse.txtPret = ModificariProduse.myPret

ModificariProduse.txtStoc = ModificariProduse.mystoc

ModificariProduse.txtProdus.Enabled = False

ModificariProduse.txtPret.Enabled = False

ModificariProduse.Show 1, Me

Else

Set ModificariProduse = Nothing

End If

Call lstCategorii_Click

Else

MsgBox "Comanda gresita! Pentru a putea modifica stocul unui produs trebuie mai intai sa introduceti inregistrari in categoria selectata si anume: " & txtCategorie & "!",

vbInformation

End If

Else

MsgBox "Selectati mai intai categoria de produse!", vbInformation

End If

End Sub

Private Sub ImgExit_Click()

Unload Me

End Sub

Private Sub cmdNewInreg_Click()

txtCategorie.SetFocus

lblStatus.Caption = "Adauga o noua categorie!"

ifNew = True

Categ.CodCateg = 0

Categ.Den = ""

Categ.Adaos = 0#

Call ClearTexts(Me)

cmdNewInreg.Enabled = False

cmdSave.Enabled = True

Casute True

cmdcancel.Enabled = True

lstCategorii.Enabled = False

End Sub

Private Sub cmdSave_Click()

On Error GoTo errHandler

lblStatus.Caption = "Salveaza categoria introdusa!"

If Trim(txtCategorie.Text) = "" Then

MsgBox "Nu ati specificat categoria!", vbInformation

txtCategorie.SetFocus

Exit Sub

Else

Categ.Den = Trim(txtCategorie.Text)

End If

If Trim(txtTVA.Text) <> "" Then

If IsNumeric(txtTVA.Text) Then

If CSng(txtTVA.Text) <= 0 Then

MsgBox "TVA-ul trebuie sa fie strict mai mare ca zero!", vbCritical

txtTVA.SetFocus

Exit Sub

Else

Categ.Adaos = CSng(txtTVA.Text)

End If

Else

MsgBox "TVA-ul trebuie sa aiba o valoare numerica!", vbCritical

txtTVA.SetFocus

Exit Sub

End If

txtTVA.Text = CSng(txtTVA.Text)

Else

MsgBox "Specificati TVA-ul!", vbInformation

txtTVA.SetFocus

Exit Sub

End If

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenDynaset, dbFailOnError)

Do While Not rst.EOF

If Trim(txtCategorie.Text) = Trim(rst!Denumire) Then

MsgBox "Categoria exista deja!"

txtCategorie.SetFocus

Call ClearTexts(Me)

Exit Do

Else

rst.MoveNext

End If

Loop

If rst.EOF Then

If ifNew Then

rst.AddNew

rst!Denumire = Categ.Den

rst!TVA = Categ.Adaos

rst.Update

ifNew = False

Else

If lstCategorii.ListIndex >= 0 Then

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii where Cod_categorie = " & Categ.CodCateg, dbOpenDynaset, dbFailOnError)

rst.Edit

rst!Denumire = Categ.Den

rst!TVA = Categ.Adaos

rst.Update

Else

Exit Sub

End If

End If

End If

rst.Close

Set rst = Nothing

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenForwardOnly)

lstCategorii.Clear

Do While Not rst.EOF

lstCategorii.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " (" &

IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value) & ")"

lstCategorii.ItemData(lstCategorii.ListCount – 1) = rst.Fields("Cod_categorie").Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

Call lstCategorii_Click

Exit Sub

cmdNewInreg.Enabled = True

Casute True

cmdSave.Enabled = True

cmdcancel.Enabled = True

lstCategorii.Enabled = True

Call ClearTexts(Me)

errHandler:

On Error Resume Next

MsgBox "Desription " & Err.Description, vbCritical

If Not rst Is Nothing Then

On Error Resume Next

rst.Close

Set rst = Nothing

End If

End Sub

Private Sub Form_Load()

On Error GoTo errHandler

Call ReincarcaDate

Exit Sub

Exit Sub

errHandler:

MsgBox "Description " & Err.Description

End Sub

Private Sub PutData()

If lstCategorii.ListIndex >= 0 Then

Categ.CodCateg = lstCategorii.ItemData(lstCategorii.ListIndex)

Dim l_poz As Integer

l_poz = InStr(1, lstCategorii.List(lstCategorii.ListIndex), "(", vbTextCompare)

Categ.Den = Trim(Mid(lstCategorii.List(lstCategorii.ListIndex), 1, l_poz – 1))

txtCategorie.Text = Categ.Den

Dim l_strTVA As String

l_strTVA = Trim(Mid(lstCategorii.List(lstCategorii.ListIndex), l_poz + 1,

Len(lstCategorii.List(lstCategorii.ListIndex)) – l_poz – 1))

If IsNumeric(l_strTVA) Then

Categ.Adaos = CSng(l_strTVA)

txtTVA.Text = Categ.Adaos

Else

Categ.Adaos = 0

End If

End If

End Sub

Private Sub lstCategorii_Click()

If lstCategorii.ListIndex >= 0 Then

Call PutData

Dim rst As DAO.Recordset

Dim strline As String

Dim contor As Long

Set rst = g_DB.OpenRecordset("SELECT * FROM Produse WHERE Cod_categorie = " & lstCategorii.ItemData(lstCategorii.ListIndex), dbOpenForwardOnly)

flxProduse.Rows = 1

contor = 1

Do While Not rst.EOF

With flxProduse

strline = ""

strline = contor & vbTab

strline = strline & rst!Denumire & vbTab

strline = strline & rst!Pret_fara_TVA & vbTab

strline = strline & rst!Stoc! & vbTab

strline = strline & rst!Cod_produs & vbTab

.AddItem strline

End With

flxProduse.Refresh

rst.MoveNext

contor = contor + 1

Loop

rst.Close

Set rst = Nothing

Else

Categ.CodCateg = 0

Categ.Den = ""

Categ.Adaos = 0#

Call ClearTexts(Me)

End If

cmdSave.Enabled = True

Casute True

cmdcancel.Enabled = True

cmdNewInreg.Enabled = False

End Sub

Public Function ReincarcaDate() As Boolean

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenForwardOnly)

lstCategorii.Clear

Do While Not rst.EOF

lstCategorii.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " (" &

IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value) & ")"

lstCategorii.ItemData(lstCategorii.ListCount – 1) = rst.Fields("Cod_categorie").Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

With flxProduse

.Cols = 5

.Rows = 1

.TextMatrix(0, 0) = "Cod produs"

.ColWidth(0) = flxProduse.Width * 0.1

.TextMatrix(0, 1) = "Produs"

.ColWidth(1) = flxProduse.Width * 0.38

.TextMatrix(0, 2) = "Pret"

.ColWidth(2) = flxProduse.Width * 0.25

.TextMatrix(0, 3) = "Stoc"

.ColWidth(3) = flxProduse.Width * 0.25

.ColWidth(4) = 0

End With

End Function

Private Sub Casute(bVal As Boolean)

txtCategorie.Enabled = bVal

txtTVA.Enabled = bVal

End Sub

Private Sub cmdAdd_Click()

If lstCategorii.ListIndex >= 0 Then

ModificariProduse.myCodcategorie = lstCategorii.ItemData(lstCategorii.ListIndex)

ModificariProduse.Show 1, Me

ModificariProduse.txtProdus.Enabled = True

ModificariProduse.txtStoc.Enabled = True

Call ClearTexts(Me)

Call lstCategorii_Click

Else

MsgBox "Selectati mai intai categoria de produse!", vbInformation

End If

End Sub

Private Sub cmdModifica_Click()

If lstCategorii.ListIndex >= 0 Then

ModificariProduse.myCodcategorie = lstCategorii.ItemData(lstCategorii.ListIndex)

If flxProduse.Row > 0 Then

If flxProduse.TextMatrix(flxProduse.Row, 4) <> "" Then

ModificariProduse.myIDinreg = CLng(flxProduse.TextMatrix(flxProduse.Row, 4))

ModificariProduse.myprodus = flxProduse.TextMatrix(flxProduse.Row, 1)

ModificariProduse.myPret = CCur(flxProduse.TextMatrix(flxProduse.Row, 2))

ModificariProduse.mystoc = CLng(flxProduse.TextMatrix(flxProduse.Row, 3))

ModificariProduse.txtProdus = ModificariProduse.myprodus

ModificariProduse.txtPret = ModificariProduse.myPret

ModificariProduse.txtStoc = ModificariProduse.mystoc

ModificariProduse.Show 1, Me

Else

Set ModificariProduse = Nothing

End If

Call lstCategorii_Click

Else

MsgBox "Comanda gresita! Pentru a putea modifica pretul unui produs trebuie mai intai sa introduceti inregistrari in categoria selectata si anume: " & txtCategorie & "!", vbInformation

End If

Else

MsgBox "Selectati mai intai categoria de produse!", vbInformation

End If

End Sub

Forma SelecțieClienți

Private Sub cmdAdauga_Click()

Dim rst As DAO.Recordset

If txtClient.Text <> "" Then

Set rst = g_DB.OpenRecordset("select * From Clienti Where Denumire= '" & CStr(txtClient.Text) & "'", dbOpenForwardOnly)

If lstClienti.ListIndex >= 0 Then

FacturiNetrimise.txtCod = CLng(rst.Fields(0).Value)

FacturiNetrimise.txtClient = Trim(rst.Fields(1).Value)

FacturiNetrimise.txtAdresa = Trim(rst.Fields(2).Value)

FacturiNetrimise.txtTelefon = Trim(rst.Fields(3).Value)

FacturiNetrimise.txtCodF = Trim(rst.Fields(4).Value)

Unload Me

FacturiNetrimise.Show

FacturiNetrimise.Enabled = True

Else

Call lstClienti_Click

End If

Else

MsgBox "Selectati clientul!"

End If

End Sub

Private Sub cmdRenunta_Click()

Unload Me

FacturiNetrimise.Show

End Sub

Private Sub Form_Load()

On Error GoTo errHandler

Call ReincarcaDate

Exit Sub

Exit Sub

errHandler:

MsgBox "Description " & Err.Description

End Sub

Private Sub PutData()

If lstClienti.ListIndex >= 0 Then

Dim l_poz As Integer

l_poz = InStr(1, lstClienti.List(lstClienti.ListIndex), " – ", vbTextCompare)

txtClient.Text = Trim(Mid(lstClienti.List(lstClienti.ListIndex), 1, l_poz – 1))

End If

End Sub

Private Sub lstClienti_Click()

If lstClienti.ListIndex >= 0 Then

Call PutData

Else

Call ClearTexts(Me)

End If

End Sub

Public Function ReincarcaDate() As Boolean

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Clienti", dbOpenForwardOnly)

lstClienti.Clear

Do While Not rst.EOF

lstClienti.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " – " &

IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value)

lstClienti.ItemData(lstClienti.ListCount – 1) = rst.Fields("Cod_client").Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

End Function

Private Sub txtcauta_KeyUp(KeyCode As Integer, Shift As Integer)

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("Select * From Clienti Where denumire like """ &

txtcauta.Text & "*""", dbOpenDynaset, dbForwardOnly)

If Not rst.EOF Then

lstClienti.Clear

Do While Not rst.EOF

lstClienti.AddItem (rst.Fields(1).Value & " – " & rst.Fields(2).Value)

rst.MoveNext

Loop

End If

End Sub

Forma SelecțieProduse

Option Explicit

Private Type ProdFact

myIDinreg As Integer

NrF As Integer

CodP As Integer

Cant As Long

ValFTVA As Currency

ValoareCuTVA As Currency

Stoc As Integer

Pret As Currency

End Type

Private g_CanSale As Boolean

Private myReg As ProdFact

Private Sub cmdCancel_Click()

Unload Me

End Sub

Private Function PuneCategorii() As Boolean

On Error GoTo errHandler

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Categorii", dbOpenForwardOnly)

If rst.EOF Then

MsgBox "Nu aveti categorii definite! Selectati meniul Categorii al formei principale si introduceti categoriile de produse!", vbInformation

Produse.Show 1, Me

Me.Hide

End If

Do While Not rst.EOF

lstCategorii.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " – " & IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value)

lstCategorii.ItemData(lstCategorii.ListCount – 1) = rst.Fields(0).Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

PuneCategorii = True

Exit Function

errHandler:

MsgBox "Error " & Err.Description

If Not rst Is Nothing Then

rst.Close

Set rst = Nothing

End If

PuneCategorii = False

End Function

Private Function PuneProduse() As Boolean

On Error GoTo errHandler

lstProduse.Clear

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT * FROM Produse Where Cod_categorie = " & lstCategorii.ItemData(lstCategorii.ListIndex), dbOpenForwardOnly)

If rst.EOF Then

MsgBox "Nu aveti produse definite in aceasta categorie!", vbInformation

End If

Do While Not rst.EOF

lstProduse.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " – " &

IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value)

lstProduse.ItemData(lstProduse.ListCount – 1) = rst.Fields(0).Value

rst.MoveNext

Loop

rst.Close

Set rst = Nothing

PuneProduse = True

Exit Function

errHandler:

MsgBox "Error " & Err.Description

If Not rst Is Nothing Then

rst.Close

Set rst = Nothing

End If

PuneProduse = False

End Function

Private Sub cmdCalcul_Click()

If CalculeazaValoare Then

g_CanSale = True

lblValFara.Caption = Format(myReg.ValFTVA, "##,##0.00")

lblValCu.Caption = Format(myReg.ValoareCuTVA, "##,##0.00")

Else

g_CanSale = False

lblValFara.Caption = "necalculat"

lblValCu.Caption = " necalculat"

End If

End Sub

Private Sub cmdOK_Click()

On Error GoTo errHandler

If g_CanSale Then

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT [Produse/Factura].Nr_factura,

[Produse/Factura].Cod_produs, [Produse/Factura].Cantitate,

[Produse/Factura].Valoare_fara_TVA, [Produse/Factura].Valoare_cu_TVA FROM Facturi

INNER JOIN (Produse INNER JOIN [Produse/Factura] ON Produse.Cod_produs =

[Produse/Factura].Cod_produs) ON Facturi.Nr_factura = [Produse/Factura].Nr_factura",

dbOpenDynaset) 'where (Cod_client = " & txtcod.Text ) and (Cod_agent = " & cboagent. )

If Not rst.EOF Then

rst.AddNew

rst!Nr_factura = IntocmireFactura.txtNr.Text

rst!Cod_produs = lstProduse.ItemData(lstProduse.ListIndex)

rst!cantitate = myReg.Cant

rst!Valoare_fara_TVA = myReg.ValFTVA

rst!Valoare_cu_TVA = myReg.ValoareCuTVA

rst.Update

MsgBox "Adaugare cu succes!", vbInformation

Call StocFinal

Dim strLineFlex As String

strLineFlex = IIf(Not IntocmireFactura.flxProduseF.Rows < 2,

IntocmireFactura.flxProduseF.Rows, 1) & vbTab & txtprodus.Text & vbTab & txtTVA.Text

& vbTab & myReg.Cant & vbTab & myReg.Pret & vbTab & myReg.ValFTVA & vbTab &

myReg.ValoareCuTVA & vbTab & rst.Fields(0).Value & vbTab & rst!Cod_produs

myReg.NrF = rst!Nr_factura

IntocmireFactura.flxProduseF.AddItem strLineFlex

IntocmireFactura.flxProduseF.Row = IntocmireFactura.flxProduseF.Rows – 1

rst.Close

Set rst = Nothing

txtcauta.SetFocus

txtprodus.Text = ""

txtcantitate.Text = ""

lblValFara.Caption = "necalculata"

lblValCu.Caption = "necalculata"

lblStoc.Caption = ""

End If

Else

MsgBox "Mai intai trebuie sa calculati valoarea!", vbExclamation

Exit Sub

End If

Exit Sub

errHandler:

MsgBox "Error " & Err.Description

End Sub

Private Sub lstCategorii_Click()

txtcauta.Enabled = True

Call PuneProduse

Call ClearTexts(Me)

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("Select * from categorii Where Cod_categorie=" & lstCategorii.ItemData(lstCategorii.ListIndex), dbOpenForwardOnly)

If lstCategorii.ListIndex >= 0 Then

txtTVA.Text = rst.Fields(2).Value

End If

txtcauta.SetFocus

g_CanSale = False

lblValFara.Caption = "necalculat"

lblValCu.Caption = " necalculat"

lblStoc.Caption = ""

End Sub

Private Sub lstProduse_Click()

If lstProduse.ListIndex >= 0 Then

Call PutData

If txtStoc > 0 Then

lblStoc.Caption = "Stocul din depozit pentru produsul " & txtprodus.Text & " este de : " & txtStoc.Text & " de bucati!"

Else

lblStoc.Caption = "Nu mai aveti produse in depozit! Stocul este 0!"

End If

Else

txtcauta.SetFocus

txtprodus.Text = ""

txtcantitate.Text = ""

lblValFara.Caption = "necalculata"

lblValCu.Caption = "necalculata"

lblStoc.Caption = ""

End If

txtcantitate.SetFocus

g_CanSale = False

lblValFara.Caption = "necalculat"

lblValCu.Caption = " necalculat"

End Sub

Private Sub PutData()

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("Select * from Produse Where Cod_produs=" & lstProduse.ItemData(lstProduse.ListIndex), dbOpenForwardOnly)

If lstProduse.ListIndex >= 0 Then

Dim l_poz As Integer

l_poz = InStr(1, lstProduse.List(lstProduse.ListIndex), " – ", vbTextCompare)

txtprodus.Text = Trim(Mid(lstProduse.List(lstProduse.ListIndex), 1, l_poz – 1))

txtStoc.Text = rst.Fields(4).Value

txtPret.Text = rst.Fields(2).Value

End If

End Sub

Private Sub Form_Load()

lblStoc.Caption = ""

Call ClearTexts(Me)

txtcauta.Enabled = False

g_CanSale = False

Call PuneCategorii

End Sub

Private Sub txtcauta_KeyUp(KeyCode As Integer, Shift As Integer)

Dim rst As DAO.Recordset

Set rst = g_DB.OpenRecordset("SELECT Produse.Cod_produs, Produse.Denumire, Produse.Pret_fara_TVA,Produse.Cod_categorie, Produse.Stoc, * FROM Categorii INNER JOIN Produse ON Categorii.Cod_categorie = Produse.Cod_categorie WHERE (((Produse.Cod_categorie) = " & lstCategorii.ItemData(lstCategorii.ListIndex) & ") and ((Produse.Denumire) Like """ & txtcauta.Text & "*""))", dbOpenDynaset)

txtcauta.SetFocus

txtprodus.Text = ""

txtcantitate.Text = ""

lblValFara.Caption = "necalculata"

lblValCu.Caption = "necalculata"

lblStoc.Caption = ""

If Not rst.EOF Then

lstProduse.Clear

Do While Not rst.EOF

lstProduse.AddItem IIf(IsNull(rst.Fields(1).Value), "", rst.Fields(1).Value) & " – " &

IIf(IsNull(rst.Fields(2).Value), "", rst.Fields(2).Value)

lstProduse.ItemData(lstProduse.ListCount – 1) = rst.Fields(0).Value

rst.MoveNext

Loop

rst.Close

Else

MsgBox "Selectati mai intai categoria de produse!", vbInformation

End If

End Sub

Private Function CalculeazaValoare() As Boolean

On Error GoTo errHandler

Dim rst As DAO.Recordset

'validari

'produsul

If Trim(txtprodus.Text) <> "" Then

myReg.CodP = lstProduse.ItemData(lstProduse.ListIndex)

Else

MsgBox "Cautati produsul pe care il introduceti in factura!", vbInformation

'txtcauta.SetFocus

CalculeazaValoare = False

Exit Function

End If

'pretul

myReg.Pret = CCur(txtPret.Text)

'cantitatea

If Trim(txtcantitate.Text) <> "" Then

txtcantitate.Text = Trim(txtcantitate.Text)

If IsNumeric(txtcantitate.Text) Then

If CLng(txtcantitate.Text) <= CInt(txtStoc.Text) Then

myReg.Cant = CLng(txtcantitate.Text)

Else

MsgBox "Cantitatea ceruta este prea mare! Stocul actual din depozit este de " & txtStoc.Text & " bucati. Alegeti va rog alta cantitate!", vbInformation

CalculeazaValoare = False

txtcantitate.SetFocus

Exit Function

End If

Else

MsgBox "Cantitatea trebuie sa fie o valoare numerica!", vbInformation

CalculeazaValoare = False

Exit Function

End If

Else

MsgBox "Introduceti va rog cantitatea!", vbExclamation

CalculeazaValoare = False

txtcantitate.SetFocus

Exit Function

End If

'1.Calcul pret produs

Dim l_Pret As Currency

Dim l_TVA As Integer

l_Pret = CCur(txtPret.Text)

l_TVA = txtTVA.Text

'2. calcul valoare totala

myReg.ValFTVA = myReg.Cant * l_Pret

myReg.ValoareCuTVA = (myReg.ValFTVA * l_TVA) \ 100

CalculeazaValoare = True

g_CanSale = True

Exit Function

errHandler:

CalculeazaValoare = False

End Function

Private Sub txtCantitate_Change()

g_CanSale = False

lblValFara.Caption = "necalculat"

lblValCu.Caption = " necalculat"

End Sub

Private Function StocFinal()

On Error GoTo eroare

Dim Stoc As DAO.Recordset

Dim StocInitial As Integer

Dim cantitate As Long

StocInitial = CInt(txtStoc.Text)

cantitate = txtcantitate.Text

StocFinal = StocInitial – cantitate

myReg.Stoc = StocFinal

g_DB.Execute ("UPDATE Produse SET Stoc = " & myReg.Stoc & " WHERE Cod_produs

= " & myReg.CodP)

eroare:

Exit Function

End Function

BIBLIOGRAFIE

Allen Browne Bazele Access 95

Alison Balter Editura Teora, Bucuresti, 1996

Augustin Ionescu BAZE DE DATE Access – Notițe de curs

Liana Stănescu PROGRAMAREA ALCULATOARELOR ÎN Visual Basic – Notițe de curs

Liana Stănescu APLICAȚII ECONOMICE PENTRU

ÎNTREPRINDERI – Notițe de curs

Christopher J. Bockmann VISUAL BASIC – Biblioteca programatorului.

Lars Klander Editura Teora, Bucuresti, 1998

Lingyan Tang

Eric Winemiller VISUAL BASIC 6 – Baze de date

Jason T. Roff Editura Teora, București

Bill Hezman

Ryan Groom

Gheorghe Popa BAZE DE DATE Access

Florentina Berbec Editura Cison, București

Veronica Ivancenco

Aurel Șova

Similar Posts