. 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
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: . Program de Intocmire Si Emitere de Facturi (ID: 148981)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
