Sunteți pe pagina 1din 52

Universitatea Ovidius, Constana

Facultatea de Matematic i Informatic


Specializarea Informatic

Dezvoltarea unei aplicatii in


platforma .NET pentru o
Farmacie

Iulie 2014

Cuprins

1.Introducere

2. Concepte generale despre mediul de dezvoltare


.
2.1 Structura unei aplicatii .NET

2.2 Notiuni folosite in proiect


.
2.2.1. Tehnologia ADO.NET

2.2.2. Baze de date


..
2.2.2.1. Caracteristici ACCESS

3. Notiuni generale despre SGBD-ul utilizat: SQL


.
3.1.
Interogari
..
3.2. Comenzi SQL folosite
..
3.3. Indexul

..
4. Problematica proiectului
.
.
5. Procesul de dezvoltare a aplicatiei

5.1. Baza de date

..
5.1.1. Diagrame entitati-Asociatii (DEA)
..
5.2. Notiuni de inginerie software- UML

5.3. Diagrama cazurilor de utilizare


..
5.4. Aplicatia. Mod de lucru si interfata
.
5.5. Diagrama cazurilor de utilizare

5.6. Diagrame de activitate


..
5.7. Diagrame de comportament

5.8. Diagrame de clasa


.
5.9. Functii implementate in
cod..
5.11. Arhitectuta aplicatiei

5.11.1 Sistemul de meniuri

6. Concluzii

..
6.1. Consideratii personale
..
6.2. Bibliografie

.
7. Anexa

1.Introducere
Scopul acestui proiect este de a facilita si creea un mod eficient de colaborare intre
utilizator si aplicatie. Usurinta parcurgerii bazei de date si structura programului ajuta
utilizatorul sa aiba grija de pacient mai rapid si mai eficient.
Date fiind situatiile acutale ale omenirii, stresul, noxele , problemele medicale,
oamenii tind sa se indrepte tot mai des catre farmacii pentru diferite probleme. Asadar
prin aceasta aplicatie incerc sa creez o mai buna functionare a sitemelor deja in functie.

Am ales ca sub-domeniu o farmacie ce colaboreaza cu niste firme producatore, ce


au o baza de date cu produse ce poate fi accesata de toti userii activi, dar poate fi
actualizata doar de unul dintre acestia.
Produsele stocate in baza de date pot fi sortate dupa numarul lotului din care fac
parte , pretul acestore, precum si firma producatoare.
Datele ce trebuiesc stiute despre pacienti sunt statutul social, numele si prenumele,
CNP-ul si medicul supraveghetor
Eficientizeaz i simplific operaiunile de aprovizionare cu medicamente
Soluia automatizeaz complet aprovizionarea de medicamente, pe baza
identificrii stocurilor i a necesarului de medicamente, reducnd timpul alocat gestiunii
stocurilor i atrgnd reducerea resurselor necesare derulrii acestui proces.
Toate tranzaciile sunt nregistrate automat ntr-un sistem informatic integrat,
prevenind erorile umane de planificare greita a reaprovizionrii cu medicamente sau a
alocrii greite pe secii.
Crete viteza de reacie la aprovizionrile cu medicamente
Datorit actualizrii automate, zilnice, a stocurilor, toate informaiile sunt
disponibile centralizat la nivelul unitii medicale, permitnd decizii proactive de
reaprovizionare cu medicamente, eliminndu-se astfel situaiile riscante pentru pacieni n
care unitatea medical nu are necesarul de medicamente pe stoc.

Exista pe piata programe care deja indeplinesc aproape toate nevoile unei farmacii.
O parte din programele consecrate ce au rezolvat problema administrarii unei farmacii ce
se afla acum pe piata sunt:
Pharmec software
Charisma ERP
Pharma software

1.1. Elemente componente ale unui SGBD. Definitii


Sistemul de gestiune a bazelor de date S.G.B.D. reprezinta sistemul de programe
care permite construirea bazelor de date, introducerea de inregistrari in bazele de date si
dezvoltarea de aplicatii privind bazele de date, permitand astfel accesul utilizatorului la
date printr-un limbaj de nivel inalt, apropiat modului obisnuit de operare; el reprezinta o
interfata intre utilizator si sistemul de operare.
Orice sistem de gestionare a bazelor de date contine:
- limbajul de descriere a datelor (LDD), care permite descrierea structurii bazei de date, a
componentei, a relatiilor dintre componente, a drepturilor de acces al utilizatorilor la baze
de date (BD);
- limbajul de cereri (LC) este limbajul in care se scriu programele pentru realizarea
prelucrarii datelor;
- limbajul de prelucrare a datelor (LPD), care permite operatii asupra BD, cum ar fi
incarcarea BD, inserarea, stergerea, cautarea sau modificarea unui element, realizarea de
statistici.
Principalele sarcini ale gestionarului bazei de date sunt:
- reducerea redundantei prin identificarea informatiilor comune si alcatuirea
corespunzatoare a aplicatiilor;
- eliminarea inconsistentelor ce rezulta din reducerea redundantei;
- utilizarea simultana a datelor de mai multi utilizatori;
- standardizarea informatiilor;
- asigurarea securitatii BD prin acordarea si urmarirea modului de acces al utilizatorilor la
componentele BD;
- asigurarea integritatii BD;
- asigurarea sincronizarii in cazul utilizarii simultane a BD de mai multi utilizatori sau a
distribuirii informatiei pe mai multe sisteme.

2. Concepte generale despre mediul de dezvoltare

Tehnologia .NET, dezvoltata de gigantul Microsoft, se bazeaza pe asa numitul


.NET Framework, care este o platforma de calcul care simplifica dezvoltarea
aplicatiilor in mediul puternic distribuit al Internetului. Acest .NET Framework este
conceput astfel incat sa satisfaca urmatoarele obiective:

Sa ofere un mediu consistent de programare, obiect-orientat, indiferent daca codul


obiectului este stocat si executat local, executat local dar distribuit pe Internet, sau
executat la distanta.
Sa ofere un mediu de executie a codului care sa minimizeze desfasurarea softwareului si conflictele de versiune.

Sa ofere un mediu de executie a codului care sa garanteze executia sigura a


codului, incluzand codul creat de dezvoltatori (third-party) necunoscuti sau
necertificati.

Sa ofere un mediu de executie a codului care sa elimine problemele de


performanta ale mediilor scripted sau interpreted.

Sa faca experienta dezvoltatorului consistenta in cazul variatelor tipuri de aplicatii,


cum ar fi aplicatiile de tip Windows-based si aplicatiile de tip Web-based.

Sa construiasca toate comunicatiile pe standarde industriale care sa asigure faptul


ca codul bazat pe .NET Framework poate fi integrat in orice alt cod.
Platforma .Net este mult mai mult decat un nou limbaj , software development kit
(SDK), sau chiar un sistem de operare. Ofera servicii noi foarte puternice, un nou format
binar independent de procesor, noi limbaje, extensii pentru limbaje vechi si lista continua.
Folosirea eficienta a acestor noi unelte si aplicatii, nu este posibila cunoastere buna a
platforma ce va da viata aplicatiilor.
Premiza din spatele platformei .NET este ca lumea calculatoarelor se schimba de
la un calculator conectat la servere prin retele de genul Internetului, la un calculator unde
toate felurile de device-uri inteligente, calculatoare si servicii, lucreaza impreuna pentru a
oferi o experienta mai bogata utilizatorului. Platforma .NET este raspunsul acestor
provocari pe care schimbarea le va aduce programatorilor.
Platforma .NET este formata din mai multe componente, care pot fi grupate in trei
categorii de baza:

.NET Framework o aplicatie complet noua pentru dezvoltarea platformelor.

Produse .NET diverse aplicatii Microsoft bazate pe .NET Framework, incluzand


noi versiuni de Exchange si SQL Server, XML toate integrate in platforma .NET.

Servicii .NET mai multe servicii .NET, asigurate de Microsoft pentru folosire in
dezvoltarea aplicatiilor ce merg pe .NET Framework. Foarte importante si de
amintit sunt serviciile Web (Web Services).

Insusi .NET Framework poate fi divizat in trei parti:

CLR (Common Language Runtime) este un mediu de executie care se ocupa de


alocarea memoriei, captarea erorilor si interactiunea cu serviciile sistemului de
operare.
Base Class Library este o colectie extinsa de componente pentru programare si
aplicatii pentru interfete de programare (API).
Doua tinte de dezvoltare de nivel inalt. Una dintre ele este pentru aplicatiile Web
(ASP.NET) si alta pentru aplicatii normale Windows (Windows Forms).

Avantajele oferite de catre .NET Framework includ cicluri mai rapide de


dezvoltare (refolosirea codurilor, mai putine surprize de programare, suport pentru mai
multe limbaje de programare), mai putine bug-uri legate de tipul datelor datorita
securitatii integrale, scurgere de memorie redusa datorita Garbage Collector-ului si, in
general, aplicatii sigure.
CLR-ul (common language runtime), este fundatia .NET Framework. Va puteti
gandi la runtime ca la un agent care administreaza codul in momentul executiei, oferind
servicii de baza precum managementul memoriei, managementul thread-urilor, si servicii
de lucru la distanta, in timp ce promulga siguranta tipurilor si alte forme de acuratete a
codului, care asigura securitate si robustete. De fapt, conceptual de management al
codului este un principiu fundamental al runtime-ului. Codul care vizeaza runtime-ul este
cunoscut ca managed code iar codul care nu vizeaza runtime-ul este cunoscut ca
unmanaged code.
Biblioteca de clase, cealalta componenta principala a Framework-ului .NET, este
o colectie cuprinzatoare, obiect-orientata, de tipuri reutilizabile care poate fi folosita
pentru dezvoltarea variatelor aplicatii, pornind de la aplicatiile traditionale in linie de
comanda sau cu interfata grafica (GUI Graphical User Interface), pana la aplicatii
bazate pe ultimele inovatii oferite de ASP.NET, inovatii precum Web Forms sau XML
Web services.

Versiunile de .NET Framework

2.1. Structura unei aplicaii .NET


O aplicaie pentru platforma .NET (un assembly) este format din patru
componente: un assembly manifest ce conine informaii despre assembly precum
versiunea, cultura, fiierele componente, semntura digital etc.;cod Intermediate
Language; tabele de metadata i resurse. Aceste componente se regsesc ntr-unul sau mai
multe module.
Pentru fiiere executabile exist ntotdeauna un modul principal, care conine
punctul de intrare al aplicaiei. De menionat c, cu toate c modulele conin cod IL i
metadata, ele nu pot fi executate independent, n afara contextului assembly-ului.

Pentru majoritatea aplicaiilor, este suficient un singur modul. Platforma permite


executarea aplicaiilor ce menin module pe alte calculatoare, modulele fiind copiate pe
calculatorul pe care ruleaz aplicaia doar n momentul n care sunt referite n aceast
situaie, pentru un assembly de dimensiuni mari, este indicat folosirea modulelor
multiple.
Desigur, o aplicaie poate apela cod dintr-un assembly extern la fel cum o
aplicaie pentru platforma Windows poate apela funcii din bibliotecile sistemului sau
biblioteci scrise de utilizatori.

2.2. Notiuni folosite in proiect


Mediul integrat de dezvoltare Visual Basic contine urmatoarele elemente
principale:
Bara de meniu (Menu Bar) Afiseaza comenzile, grupate pe categorii, care pot fi
folosite pentru a lucra in Visual Basic. In afara meniurilor
standard File, Edit, View, Window si Help (existente in majoritatea aplicatiilor
Windows), sunt si meniuri care asigura accesul la functiile specifice programarii in Visual
Basic, cum ar fi Project, Format sau Debug.
Meniuri contextuale (Context Menu)
Contin comenzi rapide pentru actiunile
cele mai frecvent folosite. Pentru a deschide un meniu contextual se executa clic-dreapta
pe obiectul dorit. Lista optiunilor meniului contextual depinde de componenta pe care s-a
executat clic-dreapta. Spre exemplu, meniul contextual afisat cand executati clic-dreapta
pe caseta instrumentelor Visual Basic (Toolbox) va permite sa afisati caseta de
dialog Components, sa ascundeti caseta instrumentelor, sa ancorati sau nu caseta
instrumentelor sau sa adaugati o eticheta particularizata la caseta.
Barele cu instrumente (Toolbar) Asigura accesul rapid la cele mai utilizate
comenzi din mediul de programare. Cu un singur clic pe un buton din aceste bare se
lanseaza in executie operatia asociata acestuia. In mod prestabilit, bara
instrumentelor Standard este afisata la deschiderea sesiunii Visual Basic. Barele
suplimentare, de editare, proiectare formular si depanare pot fi afisate sau ascunse
folosind comanda Toolbars din meniul View.
Caseta instrumentelor Visual Basic (Toolbox) Asigura un set de instrumente cu
ajutorul carora pe timpul proiectarii se plaseaza controale pe formular. Pe langa eticheta

prestabilita (General) a casetei instrumentelor, puteti crea propriile etichete personalizate


(selectand optiunea Add Tab din meniul contextual si adaugand instrumentele dorite pe
eticheta rezultata).
Fereastra Project Explorer Listeaza formularele si modulele din proiectul curent.
Un proiect este o colectie de fisiere, de diferite tipuri (extensii) folosite la construirea
unei aplicatii.
Fereastra Properties
Listeaza valorile proprietatilor pentru formularul sau
controlul selectat. O proprietate este o caracteristica a unui obiect, cum ar fi marimea,
titlul sau culoarea (in general, o caracteristica a aspectului obiectului).
Exploratorul obiectelor (Object Browser) Listeaza obiectele disponibile pentru a fi
folosite in proiectul curent si asigura o metoda rapida de navigare prin cod. El poate fi
folosit pentru a explora obiectele din Visual Basic si din alte aplicatii, pentru a determina
metodele si proprietatile disponibile ale acestor obiecte si pentru a lipi proceduri de cod
in aplicatie.
Fereastra de proiectare a formularului (Form Designer)
Serveste ca o
fereastra pe care o particularizati pentru a realiza interfata aplicatiei. Prin adaugarea pe
formular a unor controale, grafice si imagini puteti crea o interfata grafica cu aspectul pe
care-l vreti. O interfata grafica poate fi construita din mai multe formulare, fiecare avand
propria sa fereastra de proiectare.
Fereastra editorului de cod (Code )
Serveste ca editor de text pentru
introducerea codului aplicatiei. Pentru fiecare formular sau modul din aplicatie se creaza
o fereastra separata de editare a codului.
2.2.1.Tehnologia ADO.NET
Un capitol important in cadrul platformei VS.NET este dat de tehnologia ADO
(ActiveX Data Objects) de gestionare a bazelor de date. ADO.NET reprezinta o multime
de biblioteci de programe ce permit interactiunea cu sistemele de stocare a datelor (baze
de date, fisiere XML, Excel, etc.).
Arhitectura ADO.NET include trei componente principale:
- baza de date: este suportul in care se stocheaza datele

- Data Provider (Furnizorul de date) : reprezinta colectia de obiecte prin care ne


conectam la baza de date si operam modificari in ea;
- DataSet-ul: obiect local programului in care se salveaza datele provenite din
baza.

Exista mai multe sisteme de stocare pe piata, fiecare folosind un protocol diferit de
comunicatie, de aceea ADO.NET dispune de cate un DataProvider pentru fiecare tip de
baza de date:
- ODBC DataProvider: pentru baze de date mai vechi, ce folosesc protocolul
ODBC
- OleDB DataProvider: pentru Acces, Excel,..;
- Oracle DataProvider: pentru baze de date Oracle;
- SQL DataProvider: pentru Microsoft SQLServer;

Indiferent de provider-ul folosit, etapele necesare in manipularea bazelor de date sunt


urmatoarele:
- stabilirea conexiunii cu baza de date;
- instantierea obiectului din clasa DataAdapter prin intermediul caruia se executa
comenzi de selectare/modificare a informatiilor din baza de date;
- generarea unui DataSet in care se vor stoca pe plan local informatiile din baza de
date;
- prelucrarea/modificarea datelor locale si transmiterea modificarilor in baza de
date;
- inchiderea conexiunii.

2.2.2. Baze de date

Baza de date este un serviciu ce lucreaza independent de programul nostru la care


noi putem apela sa stocam informatii diverse in cantitati foarte mari, dupa care sa cerem
aceste informatii conform unor criterii si tehnici de filtrare. Daca luam ca exemplu
activitatea dintr-o farmacie, atunci constatam ca ne trebuie o baza de date formata din
tabele in care sa introducem informatiile specifice acestei activitati:
- un tabel Producatori, in care sa salvam pe linii detaliile pentru fiecare
Producator asociat farmaciei;
- tabele pentru produse, medici, pacienti, tipuri pacienti: in care sa se salveze
structura organizatorica a farmaciei;
- etc
Tabelele nu sunt independente unele de altele, intre ele exista relatii de legatura
care sa permita obtinerea de informatii complexe, culese din mai multe tabele legate prin
aceste relatii. De exemplu, tabela Produse este legata de tabela Producatori (fiecare
produs apartine unui producator) etc.
Avantajele utilizarii bazelor de date in constructia programelor de gestionare a
informatiilor sunt evidente:
- baza de date primeste o cantitate mare de informatii pe diverse cai si de la mai
multi utilizatori simultan, le stocheaza intr-un depozit unic astfel incat, orice informatie
introdusa de un utilizator este vizibila tuturor. De exemplu, daca un utilizator a introdus
in baza de date produsul unui producator , un al doilea utilizator poate vizualiza
adaugarea fara sa fie nevoie sa mearga la celalalt utilizator ca . Cei doi utilizatori
lucreaza in sedii diferite, cu aplicatii diferite, dar informatia este vizibila tuturor.
- baza de date dispune de mecanisme puternice de extragere a informatiilor
complexe. Pe baza limbajului SQL (Structured Query Language) utilizatorul scrie
instructiuni de selectie a datelor din mai multe tabele simultan si conform unor criterii de
filtrare performante. Astfel, pot cere de exemplu bazei de date (cu ajutorul unei
instructiuni SQL), sa-mi dea produsul cu pretul cea mai mare din lotul .
- accepta deschiderea mai multor sesiuni de lucru simultan, astfel incat pot lucra
diversi utilizatori (unii introduc date, altii vizualizeaza, altii modifica), fara sa se blocheze
unul pe celalalt.
- baza de date este independenta fata de aplicatiile care o utilizeaza, unii utilizatori
introduc date printr-o interfata realizata in Oracle Forms, altii printr-un program dezvoltat
in VS.NET, altii vizualizeaza date prin Oracle Reports, sau Crystal Reports, sau pur si
simplu, printr-un editor SQL. Fiecare isi deschide o sesiune de lucru specifica prin care
are acces la toate informatiile din baza de date.

Sunt mai multe servere de baze de date (SGBD) pe piata de software: Oracle, SQL
Server, MySql, Acces, FoxPro, etc. Utilizatorul alege SGBD-ul care satisface cel mai
bine compromisul intre performanta si pret. In continuare noi vom lucra cu o baza de date
Oracle 9i, fiind o baza cu performante deosebite la un pret de cost rezonabil.

2.2.2.1. Caracteristici ACCESS


Conceptul original de Access a fost pentru utilizatorii finali s poat s "acceseze"
date din orice surs. Alte caracteristici includ: importul i exportul de date de mai multe
formate, cum ar fi Excel , Outlook , ASCII , dBase , Paradox , FoxPro , SQL Server ,
Oracle , ODBC , etc.
De asemenea, Access are i posibilitatea de a folosi baze de date externe,
nenglobate, n formatele: Microsoft Excel, Liste SharePoint, text, XML, Microsoft
Outlook, HTML, dBase, Paradox, Lotus 1-2-3, ODBC -conforme cu containerele de
date, inclusiv: Microsoft SQL Server, Oracle, MySQL, PostgreSQL, - avnd aceleai
posibiliti de utilizare aceasta pentru vizualizare, interogare, editare, i de raportare.
Acest lucru permite apelarea datelor existente cele mai recente date. Se pot
efectua operaii de join SQL ntre seturile de date de diferite formate, stocate pe diferite
platforme.
Access stocheaz toate tabelele de baze de date, interogri, formulare, rapoarte,
macrocomenzi i module n baza de date Jet Access ca un singur fiier. Microsoft Access
utilizeaz att formatul ACCDB, ct i MDB.
Un fiier MDE / ACCDE este o baz de date Microsoft Access fi ier cu toate
modulele compilate i tot codul surs editabil eliminat, care cuprinde toate componentele:
tabele, interogri, module, macrocomenzi, formulare i rapoarte.
Utilizatorii pot crea tabele, interogri, formulare i rapoarte i macrocomenzi
Utilizatorii avansai pot folosi Visual Basic pentru a scrie soluii bogate cu avansate de
manipulare a datelor i de control al utilizatorului.
Exist abloane pentru baze de date, att n cadrul programului ct i pe site-ul
oficial. Acestea permit utilizatorilor s construiasc o baz de date cu tabele, interogri ,
formulare, rapoarte i macrocomenzi predefinite. abloanele nu includ cod Visual Basic.
De asemenea, are i modul de lucru n multiutilizator n reea.

Access este un instrument pentru proiectarea aplicaiilor de baze de date i


implementarea acestora, instrument care poate fi utilizat pentru a urmri informa iile
importante. Este posibil s pstrai datele pe computer sau s le publicai pe Web, astfel
nct i alte persoane s poat utiliza baza de date folosind un browser Web.
Multe persoane ncep s utilizeze Access cnd programul pe care l utilizeaz
pentru a urmri ceva devine din ce n ce mai puin potrivit pentru activitatea respectiv.
De exemplu, s presupunem c suntei organizator de evenimente i dorii s urmrii
toate detaliile pe care trebuie s le gestionai pentru a organiza evenimente de succes.
Dac utilizai un procesor de text sau un program de calcul tabelar pentru acest lucru, este
posibil s ntmpinai curnd probleme cu date dublur sau neuniforme. Avei
posibilitatea s utilizai software de planificare, ns urmrirea informaiilor financiare
ntr-un calendar nu este o alegere bun.
Uneori, avei nevoie de o baz de date relaional pentru a urmri astfel de
informaii: un depozit de date care a fost mprit n colecii mai mici de date (numite
tabele) pentru a elimina redundana, apoi au fost asociate pe baza unor fragmente comune
de informaii (numite cmpuri). De exemplu, o baz de date relaional pentru
organizarea de evenimente poate conine un tabel cu informaiile despre clieni, un tabel
cu informaii despre furnizori i un tabel cu informaii despre eveniment. Tabelul cu
informaii despre eveniment poate avea un cmp care s l asocieze cu tabelul despre
clieni i un cmp care s l asocieze cu tabelul despre furnizori. Astfel, de exemplu, dac
s-a modificat numrul de telefon al unui furnizor, informaiile se pot modifica o singur
dat n tabelul cu furnizori, n loc s se modifice n fiecare eveniment care implic
furnizorul.

Access este un instrument pe care avei posibilitatea s l utilizai pentru a dezvolta


rapid i uor aplicaii de baze de date relaionale care v ajut s gestiona i informa iile.
Avei posibilitatea s creai o baz de date care s v ajute s urmri i aproape orice tip de
informaii, cum ar fi inventare, persoane de contact pentru afaceri sau procese de afaceri.
De fapt, Access este nsoit de abloane pe care avei posibilitatea s le utiliza i imediat
pentru a urmri o varietate de informaii, facilitnd experiena chiar i pentru un
nceptor.

3.Notiuni generale despre SGBD-ul utilizat: SQL


SQL (Structured Query Language - Limbaj Structurat de Interogare) este un
limbaj de programare specific pentru manipularea datelor n sistemele de manipulare a
bazelor de date relaionale (RDBMS), iar la origine este un limbaj bazat pe algebra
relaional. Acesta are ca scop inserarea datelor, interogaii, actualizare i tergere,
modificarea i crearea schemelor, precum i controlul accesului la date. A devenit un
standard n domeniu (standardizat ANSI-ISO), fiind cel mai popular limbaj utilizat pentru
creearea, modificarea, regsirea i manipularea datelor de ctre SGBD-urile (Sistemele de
Gestiune a Bazelor de Date) relaionale. Pe lng versiunile standardizate ale limbajului,
exist o mulime de dialecte i variante, unele proprietare, fiind specifice anumitor
SGBD-uri i de asemenea coninnd extensii pentru a suporta SBD-urile (Sistemele de
Baze de Date) obiectuale (obiectual-relaionale).
SQL permite att accesul la coninutul bazelor de date, ct i la structura acestora.
SQL a fost iniial dezvoltat la IBM de ctre Donald D. Chamberlin i Raymond F.
Boyce n anul 1974. Iniial, numele era SEQUEL (Structured Query Language), avea ca
scop manipularea i regsirea datelor stocate n bazele de date rela ionale IBM.
La sfritul anilor '70, Relational Software, Inc. (n prezentOracle Corporation) a
vzut potenialul acestor concepte descrise de Codd, Chamberlin i Boyce, i a dezvoltat
propriul SQL RDBMS cu aplicaii la U.S. Navy, Central Intelligence Agency i U.S.
government. n iunie 1979, Relational Software, Inc. a introdus prima implementare
comercial disponibil de SQL, Oracle. Dup testarea SQL, au aprut implementri ale
acestui limbaj i din partea firmei IBM: SQL/DS i DB2.
Limbajul SQL este divizat n urmtoarele elemente:

Clauze, care sunt componente ale instruciunilor i interogrilor.


Expresii, al cror efect este producerea de valori scalare sau tabele.
Predicates, pot specifica condiii care sunt evaluate de SQL conform logicii
ternare sau logicii booleene, n scopul limitrii efectelor instruciunilor, sau pentru a
influena cursul programului.
Interogrile, au ca scop regsirea datelor dup criterii specifice.

Instruciunile, pot avea un efect persistent asupra datelor sau structurii datelor,
sau pot controla tranzaciile, conexiunile sau cursul programului. n general,
instruciunile SQL se termin cu caracterul punct-virgul (";"), dei acest lucru nu este
obligatoriu n toate platformele SQL. Spaiile albe suplimentare sunt ignorate, dar ele
pot fi folosite pentru lizibilitatea codului SQL

Oricrei coloane (sau cmp) dintr-un tabel SQL i este asignat un tip de dat, la fel ca n
toate celelalte limbaje de programare. Tipurile de date sunt urmtoarele:

CHARACTER (sau CHAR) - ir de caractere


INTEGER (sau SMALLINT) - numr ntreg

FLOAT, REAL sau DOUBLE PRECISION - numr real

NUMERIC(precision, scale) sau DECIMAL(precision, scale) - numr zecimal ,


unde precision nseamn numrul de cifre din partea ntreag, scale nseamn
numrul de zecimale.

DATE - data zilei.

TIME - ora.

Funcia sistem NOW ntoarce data i ora curent.

3.1. Interogri
Cea mai des utilizat instruciune n SQL este instruciunea SELECT.
SELECT [ALL | DISTINCT] coloana1 [,coloana2]
[INTO fiier]
FROM tabel1 [,tabel2]
[WHERE condiie] [ AND|OR condiie...]
[GROUP BY list-coloane]

[HAVING condiii]
[ORDER BY list-coloane [ASC | DESC] ]

Clauza INTO este utilizat pentru a transfera rezultatul interogrii ntr-o nou
tabel; valabil n Microsoft Access, dar nu n toate platformele SQL.
Clauza WHERE este utilizat pentru a specifica condiii trebuie s ndeplineasc
coloanele din care se face selecia. Aceast condiie este o expresie logic ob inut
prin alicarea operatorilor conjuncie (AND) i disjuncie (OR) asupra unor expresii
logice elementare obinute cu ajutorul operatorilor: = (egal), <> (diferit), < (mai mic
dect), <= (mai mic sau egal dect), > (mai mare dect), >= (mai mare sau egal
dect), LIKE (permite selectarea potrivirilor pariale cu ajutorul operatorului %; de
exemplu: select city, state from towntable where state LIKE 'north%');

Clauza GROUP BY permite gruparea coloanelor multiple n scopul prelucrrii


acestora prin funciile agregate: AVG - media aritmetic; COUNT - numrul
articolelor; MAX - maximul; MIN - minimul; SUM - suma.

Clauza HAVING Spre deosebire de clauza WHERE, acioneaz asupra rndurilor


rezultate din clauza GROUP BY , aplicndu-le condiia, spre a fi ulterior prelucrare
prin funciile agregate

Clauza ORDER BY Ordoneaz rezultatele interogrii n ordine alfabetic dup


unul sau mai multe cmpuri. ASC nseamn n ordine cresctoare, iar DESC - ordine
descresctoare. Ordinea implicit este cresctoare.

Alte cuvinte cheie: ALL - Toate articolele; DISTINCT - Numai articolele unice,
fr duplicate.

3.2. Comenzi SQL folosite

SHOW DATABASES;
USE numele_bazei_de_date
SHOW TABLES;
SHOW COLUMNS;
CREATE DATABASE numele_bazei;
CREATE TABLE tabel_unu (camp_a
TEXT);
CREATE TABLE tabel_unu (camp_a
TEXT, camp_b INT, camp_c TINYINT);

DROP TABLE tabel_unu;


DROP DATABASE numele_bazei;
INSERT INTRO tabel (camp1, camp2,
camp3) VALUES (valoarea1, valoarea2,
valoarea3);

INSERT INTRO tabel (camp1, camp2)


VALUES (valoarea1, valoarea2);

INSERT INTRO tabel VALUES


(valoarea1, valoarea2, valoarea3);

afiseaza o lista cu numele bazelor de date


existente
alegerea bazei de date cu care lucram in
continuare
afiseaza tabelele existente in baza curenta
afiseaza informatii despre coloanele unui
tabel
creeaza o baza de date cu numele respectiv
creeaza tabelul tabel_unu cu un camp
numit 'camp_a' al carui tip este TEXT
creeaza tabelul 'tabel_unu' cu un camp
numit 'camp_a' al carui tip este TEXT, un
camp numit 'camp_b' in care datele de pe
coloana respectiva vor fi numere intregi si
in campul 'camp_c' vor fi introduse doar
numere intre -128 si 127
sterge tabelul numit 'tabel_unu'
sterge baza de date cu numele
'numele_bazei'
introduce in tabelul cu numele 'tabel', in
'campul1' 'valoarea1', in 'campul2'
'valoarea2' si in 'campul3' 'valoarea3'. Iata
cum ar arata in format tabelar:
campul1

campul2

campul3

valoarea1

valoarea2

valoarea3

Se poate omite una din coloane, daca avem


5 coloane, dar vrem sa introducem numai in
3, specificam campul si valoarea doar
pentru cele pe care le vrem, restul le
ignoram.
campul1

campul2

valoarea1

valoarea2

campul3

o varianta simplificata care se poate aplica


doar cand introducem valori in toate
campurile tabelului (nu se poate omite)

INSERT INTRO tabel VALUES


(valoarea1, valoarea2, ``);
SELECT * FROM tabel;
SELECT campul1 FROM tabel;
SELECT campul1, campul2 FROM tabel
SELECT * FROM tabel WHERE campul1
= 'valoare1';
SELECT campul1, campul2 FROM tabel
WHERE campul2 LIKE 'valoare2';
SELECT campul1, campul2 FROM tabel
WHERE campul2 LIKE 'valoare2%';
SELECT campul1, campul2 FROM tabel
WHERE campul2 LIKE '%valoare2';
SELECT campul1, campul2 FROM tabel
WHERE campul2 LIKE '%valoare2%';
SELECT * FROM tabel WHERE
campul1=valoare1 AND campul2 LIKE
'%valoare2%';
SELECT campul1, campul2 FROM tabel
WHERE campul1 != valoarea3;
SELECT campul1, campul2 FROM tabel
WHERE campul2 NOT LIKE
'valoarea3%';
SELECT campul1 FROM tabel ORDER
BY campul1 ASC;
SELECT campul1, campul2 FROM tabel
ORDER BY campul1 ASC, campul2
DESC;
SELECT count(*) FROM tabel;
SELECT count (*) FROM tabel WHERE
campul1=variabila1;
SELECT camp1 FROM tabel GROUP BY
camp1 ORDER BY camp1 ASC;
SELECT * FROM tabel LIMIT 0,3;

identica ca cea dinainte, doar ca in lipsa


unei valori se pun ghilimele.
Afiseaza tot (*) ce exista in tabelul cu
numele 'tabel'
afiseaza continutul campului 'campul1' din
tabelul 'tabel'
afiseaza continutul campurilor 'campul1' si
'campul2' din tabelul 'tabel'
afiseaza campurile a caror continut este la
fel cu 'valoare1'
cauta si afiseaza toate inregistrarile in care
'campul2' este asemanator cu 'valoare2'
cauta si afiseaza toate inregistrarile in care
'campul2' incepe cu 'valoare2'
cauta si afiseaza toate inregistrarile in care
'campul2' se termina cu 'valoare2'
cauta si afiseaza toate inregistrarile in care
'campul2' se aseamana cu 'valoare2' oriunde
in cadrul textului.
afiseaza toate campurile care contin
'valoarea1' si se asemanana cu 'valoare2'
cauta si afiseaza toate campurile care
difera de 'valoarea3'
cauta si afiseaza toate campurile care nu
incep cu 'valoare3'
afiseaza continutul campului 'campul1' in
ordine crescatoare
afiseaza continutul campului 1 in ordine
crescatoare si campul 2 in ordine
descrescatoare.
afiseaza cate inregistrari sunt in total in
tabel
cate inregistrari sunt in tabel al caror
'camp1' este 'variabila1'
afiseaza continutul campului 1 grupat dupa
'camp1' ascendent
afiseaza din tabel incepand de la prima

SELECT * FROM tabel LIMIT 10,5;


DELETE FROM tabel WHERE conditii;
UPDATE tabel SET coloana1='noua
valoare a coloanei 1', coloana2='noua
valoare a coloanei 2' WHERE conditii;
ALTER TABLE tabel ADD dat TEXT;
ALTER TABLE tabel CHANGE dat data
TEXT;
ALTER TABLE tabel CHANGE data data
DATE;
ALTER TABLE tabel ADD nr
MEDIUMINT UNSIGNED AFTER
coloana1;

Pentru

crearea

tabelului

Produse

inregistrare inca 3.
afiseaza incepand de la inregistrarea 10
inca 5 inregistrari din tabel
sterge inregistrarea din tabel. Sintaxa este
la fel ca la comanda SELECT.
pentru actuaizarea continutului unei
inregistrari din tabel. Sintaxa este la fel ca
la comanda SELECT.
adaugare la tabelul existent a unei coloane
numita 'dat' de tip text.
redenumeste coloana numita 'dat' cu
numele 'data'
modifica tipul coloanei 'data' din 'TEXT' in
coloana de tip 'DATE'
adauga o coloana numita 'nr' dupa
'coloana1' in tabelul 'tabel'

am

uitilizat

urmatoarea

create table Produse( ID AutoNumber,


Nume_produse varchar2(20) primary key,
Nr_lot number(6)not null,
Producator varchar 2(30) not null,
Data_expirare date not null ,
Data_fabricare date not null );

Pentru crearea tabelului Producatori am utilizat urmatoarea comanda:


create table Producatori(ID AutoNumber,
Nume_producator varchar2(30) primary key,
Adresa varchar2(50) not null,
Numar_telefon number(5,2) not null
Persoana_contact varchar2(30) not null);

comanda:

Pentru crearea tabelului Medici am utilizat urmatoarea comanda:


create table Medici(ID AutoNumber primary key,
Nume varchar2(30) not null,
Specializare varchar2(30) not null):

Pentru crearea tabelului Pacienti am utilizat urmatoare comanda:


create table Pacienti(ID AutoNumber,
cnp number(13) primary key,
nume varchar2(30) not null,adresa varchar2(30) not null,
nr_telefon number(10) not null,functie varchar2(20) not null,
medic_supraveghetor varchar2(20) references Medici(nume),
reteta number(3) not null);

3.3. Indexul
INDECSI - Cel mai folosit tip de index este id-ul. Id-ul este un numar unic de
identificare pentru un element distinct (un rand) al unui tabel. Un exemplu de id din viata
reala este numerotarea cd-urilor. Cand aveti un cd nou il numerotati si il puneti in raft la
sfarsit iar in catalog puteti sa il puneti sortat dupa titlu sau dupa numarul de ordine. La fel
si intr-o baza de date, puteti crea un camp care sa introduca automat un nr pentru fiecare
rand nou adaugat in baza de date si la afisare puteti sa il folositi (de exemplu la
vizualizarea ultimilor 10 vizitatori folositi id-ul - vezi sectiunea de monitorizare a
traficului de pe acest site).
Pentru a creea un index avem urmatoarele comenzi:
Sa zicem ca avem o baza de date numita lista cu un camp caseta si adaugam
campul id_casete - comanda este urmatoarea:
ALTER TABLE `caseta` ADD `id_caseta` INT;
ALTER TABLE `caseta` CHANGE `id_caseta` `id_caseta` INT(11) UNSIGNED NOT
NULL;
ALTER TABLE `caseta` ADD PRIMARY KEY (id_caseta);

ALTER TABLE `caseta` CHANGE `id_caseta` `id_caseta` INT(11) UNSIGNED


DEFAULT "0" NOT NULL AUTO_INCREMENT;
Si din acest moment, orice caseta noua introdusa va avea automat un nr de ordine.
Este posibil ca toata insiruirea de comenzi de mai sus sa se poata face printr-o singura
linie de cod, dar este mai sigur sa faceti cate o modificare in parte decat toate odata,
pentru a detecta eventualele erori. Este bine sa creati un id la inceputul tabelului, cand nu
aveti intrari in baza de date, pentru a face incrementarea automat, altfel e posibil sa va
dea erori. Cu ajutorul id-ului puteti afisa de exemplu noutatile, cu o comanda de genul afiseaza ultimele 10 intrari sortate dupa id..., stiind ca intotdeauna ultima intrare are
numarul cel mai mare.
Interogari:
In cazul Farmaciei, se doresc urmatoarele:
Produsele: data lor de expirare, data de fabricare, numarul lotului din care fac
parte, producatorul, cantitatea, pretul, tva-ul.
Producatori: Numele firmei, adresa, numarul de telefon si numele persoanei de
contact
Medic: numele si specializarea
Pacienti: nume, prenume, tip, numar de telefon, medical supraveghetor, CNP-ul si
reteta

4. Problematica proiectului
Farmacie este locul unde se prepar i se vnd medicamente conform re etelor
medicale i normelor din farmacologie. Farmacistul are printre altele datoria de a explica
cumprtorului i efectele secundare nedorite ale medicamentului, ca i despre fenomenul
de potenare a dou preparate farmocologice.
Farmaciile cu circuit nchis vor asigura medicamente pentru bolnavii internai n
uniti sanitare, pentru serviciul de ambulan i pentru ambulatoriu n cadrul
programelor naionale de sntate, potrivit unui proiect al Ministerului Sntii.

Ministrul Sntii a elaborat un proiect de Ordin pentru modificarea i


completarea Ordinului ministrului Sntii privind aprobarea normelor de nfiinare,
organizare i funcionare a farmaciilor i drogheriilor. Una dintre modificrile propuse n
proiectul de Ordin vizeaz statutul farmaciilor cu circuit nchis, readucnd n obiectul de
activitate al acestora eliberearea medicamentelor din programele naionale de sntate, de
la farmaciile cu circuit deschis. Astfel, potrivit proiectului, "farmacia cu circuit nchis este
unitatea farmaceutic ce asigur asistena cu medicamente de uz uman pentru bolnavii
internai n uniti sanitare i n alte instituii cu reea sanitar proprie i pentru serviciul
de ambulan, precum i pentru ambulatoriu n cadrul programelor naionale de sntate
i ambulatoriul instituiilor cu reea sanitar proprie".
Pentru farmaciile comunitare din mediul rural i urban, organizarea i dotarea
ncperii de receptur i laborator vor fi fcute numai n cazul n care acestea declar c
prepar formule magistrale i oficiale. Depozitul n care se pstreaz medicamentele i
alte produse permise a se elibera prin farmaciile comunitare trebuie s aib o suprafa de
minimum 10 metri ptrai, s permit asigurarea condiiilor normale de umiditate i s fie
prevzut cu un sistem propriu de asigurare a temperaturii necesare conservrii
medicamentelor n condiiile normale de depozitare prevzute de ctre productor.
Prin aceasta aplicatie incerc sa usurez munca farmacistilor oferindu-le o interfata
prietenoasa, usor de folosit, ce simplifica adaugarea de noi informatii in baza de date si ce
sorteza si contorizeaza orice schimbare in stocul farmaciei.
Probleme generale intampinate in software-urile farmaceutice sunt timpul de
raspuns, dificultatea cautarii unor informatii deoarece sunt foarte multe similaritati.
Aplicatia mea este concisa, gaseate imediat informatia dorita daca parametrii sunt corecti,
elimina folosirea hartiilor si pierderea acestora deoarece salveaza fiecare factura, NIR,
bon , intr-o tabela si intr-un fisier text iar aceste date sunt stocate pe hard disk-ul extern
timp de 5 luni.

5. Procesul de dezvoltare al aplicatiei


5.1. Baza de date
Primul pas n realizarea unei aplicaii de baze de date este analiza datelor i
realizarea unei scheme conceptuale (model conceptual) al acestor date.

n aceast etap sunt analizate natura i modul de utilizare a datelor. Sunt


identificate datele care vor trebui memorate i procesate, se mpart aceste date n grupuri
logice i se identific relaiile care exist ntre aceste grupuri.
Analiza datelor este un proces uneori dificil, care necesit mult timp, ns este o
etap absolut obligatorie. Fr o analiz atent a datelor i a modului de utilizare a
acestora, vom realiza o baz de date care putem constata n final c nu ntrunete cerinele
beneficiarului. Costurile modificrii acestei baze de date este mult mai mare dect
costurile pe care le-ar fi implicat etapa de analiz i realizare a modelului conceptual.
Modificarea modelului conceptual este mult mai uoar dect modificarea unor tabele
deja existente, care eventual conin i o mulime de date. Ideea de baz a analizei datelor
i construirii modelului conceptual este "s msori de dou ori i s tai o singur dat".
Informaiile necesare realizrii modelului conceptual se obin folosind metode
convenionale precum intervievarea oamenilor din cadrul organizaiei i studierea
documentelor folosite.
Odat obinute aceste informaii ele trebuiesc reprezentate ntr-o form
convenional care s poat fi uor neleas de toat lumea. O astfel de reprezentare este
diagrama entiti-relaii, numit i harta relaiilor, sau ERD-ul (Entity Relationship
Diagram). Aceste scheme sunt un instrument util care uureaz comunicarea dintre
specialitii care proiecteaz bazele de date i programatori pe de o parte i beneficiari, pe
de alt parte. Acetia din urm pot nelege cu uurin o astfel de schem, chiar dac nu
sunt cunosctori n domeniul IT.
O entitate poate fi definit ca un lucru care este recunoscut ca fiind capabil s
existe independent i care poate fi identificat n mod unic. O entitate este o abstractizare a
complexitii unui anumit domeniu. Cnd vorbim despre o entitate ne referim n mod
normal la un aspect din lumea real, care poate fi diferit de alte aspecte din lumea real.
O entitate poate fi un obiect fizic cum ar fi o cas sau o main, un eveniment, cum ar fi
vnzarea unei case sau repararea mainii, sau un concept, cum ar fi o tranzacie a unui
client sau un ordin de plat.
Dei termenul entitate este cel mai frecvent utilizat, ar trebui s facem deosebirea
ntre o entitate i un tip de entitate. O tip de entitate este o categorie. O entitate, strict
vorbind, este un exemplu al unui anumit tip de entitate. Exist multe cazuri, de obicei, a
unui tip de entitate. Deoarece termenul tip de entitate este oarecum greoi, cei mai mul i
oameni tind s foloseasc termenul entitate ca un sinonim pentru acest termen. Entit ile

care pot fi considerate ca substantive. Exemple: un computer, un angajat, un cntec, o


teorem matematic.
O relaie captureaza modul n care dou sau mai multe entiti sunt legate una de
alta. Relaiile pot fi considerate ca verbe, care leag dou sau mai multe substantive.
Seturile de entiti sunt desenate ca dreptunghiuri, relaiile ca romburi. Dac un set
de entiti particip la un set de relaii, acestea sunt conectate cu o linie.
Atributele sunt desenate ca ovaluri i sunt conectate cu o linie pentru la o entitate
sau la un set de relaii.
Limitrile cardinale pot fi exprimate dup cum urmeaz:

o linie dubl indic o limitare de participare, relaie total sau funcie surjectiv:
toate entitile din acel set de entiti trebuie s participe la cel puin o relaie din
setul de relaii;

o sgeat dinspre setul de entiti ctre setul de relaii indic o limitare tip cheie
unic, adic o relaie injectiv: fiecare entitate din setul de entiti poate participa
n cel puin o relaie din setul de relaii;

o linie groas indic ambele relaii, adic bijectivitate: fiecare entitate din setul de
entiti este implicat n exact o relaie.

un nume subliniat a unui atribut indic faptul c acel atribut este cheie unic: dou
entiti sau relaii diferite care au acest atribut au ntotdeauna valori diferite pentru
acest atribut.

Atributele sunt adesea omise, deoarece acestea pot creea dezordine n diagram; n
alte tehnici de diagram, atributele entitilor se reprezint adesea n dreptunghiurile
pentru seturi de entitate.

5.1.2. Diagrame entitati-asociatii (DEA)

5.2. Notiuni de inginerie software UML

UML = limbaj de modelare vizual, orientat obiect, care descrie (reprezint)


proprietile structurale i dinamice ale unui sistem software. Prin sistem software se
ntelege o BD sau un modul de cod n general.
Spre deosebire de modelul EAE, UML este o colecie de tehnici de modelare,
folosite pentru tratarea multor aspecte ale procesului de concepere i dezvoltare a
software-ului, de la proiectarea BD la interaciunea modulelor de cod.
Fiecare tehnic de modelare de mai sus d o vedere diferit, static sau dinamic, a
unei aplicaii. Colecia de vederi se numete model. Iat unele din tehnicile de modelare
UML: diagrame de clase, sau diagrame statice de structur, care modeleaz entitile unui
sistem prin clase cu atribute i comportare. Diagramele de clas descriu, de asemenea,
asocierile dintre clase i constrngerile asupra acestora. Apoi, alte tehnici: diagrame de
obiecte, diagrame de caz de utilizare, diagrame de stare, diagrame de secvene,
diagrame de activitate, diagrame de colaborare.
Clase UML
Clasa UML modeleaz componentele (entitile) de interes ale unui sistem. Clasa
are instane, sau realizri. Aceste instane sunt obiectele clasei. Prin conceptul de clas se
descriu structura i comportarea obiectelor clasei. Structura conine atributele fiecrui
obiect din clas. Comportarea include operaiunile ce pot fi executate (efectuate) pe
(asupra) o instan specific de obiect.

Diagrama UML

5.3 Diagrama cazurilor de utilizare


Aplicatia mea se infatiseaza cu o interfata prietenoasa ce permite utilizatorului
gestionarea undei baze de date cu usurinta.
Utilizatorul poate modifica baza de date, adaugand produsele impreuna cu toate
datele necesare introducerii lor. Cele mai importante date pentru medicamente sunt data
expirarii si data fabricarii, numarul lotului din care apartin acestea precum si numele
producatorului, deoarece pot exista mai multi producatori care fabrica acelasi tip de
medicament.
Pe langa produse, mai exista un form pentru pacienti. Acestia sunt stocati in baza
de date dupa tipul lor si dupa reteta. Pot exista pacienti ce nu cumpara cu o reteta. De
asemenea in tabela pentru pacienti se pot gasi date precum numele pacientului, CNP-ul si
medical supraveghetor.
Tabelul de producatori stocheaza date despre firma producatoare, adresa, persoana
de contact precum si numarul de telefon. Daca utilizatorul logat are drepturi suficiente
acesta poate adauga sau sterge date din tabela in cauza.

Medicamentele vandute sunt scazute din stocul total si nu mai sunt puse la
socoteala in momentul efectuarii unei verificari de stoc. Retetele au un cod unic de
identificare asa canu pot exista doi pacienti care beneficiaza de aceiasi reteta si nici doi
medici ce elibereaza aceiasi reteta .

5.4. Aplicatia. Mod de lucru, implementare si interfata


In cele ce urmeaza va voi prezenta aplicatia, modul de lucru si implementarea
acesteia.
Pagina de start :

Aceasta fereastra face legatura cu toate celelalte pagini de care utilizatorul are
nevoie. Desigur daca nu este nici un utilizator conectat , dand clic pe oricare dintre
butoane inafara de cel de inchidere nu va afecta in nici un fel starea programului si nici
nu va schimba pagina de start.

Pagina Vanzari

In aceasta pagina putem introduce datele despre produsele ce urmeaza a fi


vandute. Codul retetei nu este obligatoriu. Daca nu completam acea fereastar
pacientul ce beneficiaza de produsele cumparate va fi adaugat intr-ul table
separate.
In nomentul in care dorim sa adaugam o noua inregistrare vom da click pe
butonul Bon nou. Acesta ne va deschide o a doua fereasta ce ne va ajuta sa creem
un nou bon . Dupa apasarea butonului confirmare putem adauga restul de date.

Pagina NIR

In aceasta pagina gasim nota de intrare si receptie. Asta inseamna ca in acest


form sunt introduse toate produsele care intra in farmacie, cantitatea lor si
producatorul.

5.5. Diagrama cazurilor de utilizare

Un use case este o reprezentare la nivel conceptual a unei interactiuni dintre un


actor si un sistem si a activitatilor care se produc si pe care sistemul le face.

Un caz de utilizare este o secventa a tranzactiilor realizate de sistem ca raspuns la


evenimentele declansate de un actor sistemului.

Un caz de utilizare contine toate evenimentele care pot surveni in cadrul perechii
actor - caz de utilizare, nu neaparat unul ce va apare in orice scenariu particular.

Un caz de utilizare poate de asemenea descrie comportamentul unui set de obiecte,


ca de exemplu o organizatie.

O diagrama use case este folosita n general pentru a indica sau caracteriza
functionalitatile si comportamentul sistemului ce interactioneaza cu unul sau mai
multi actori. Un actor poate fi un utilizator sau orice sistem ce poate interactiona
cu sistemul modelat.

Att timp ce actorii reprezinta utilizatorii, ei ajuta la construirea unei imagini clare a ceea
ce se asteapta a se ntmpla n sistem. Cazurile de utilizare sunt construite pe baza
nevoilor pe care le au actorii (utilizatorii). Aceasta asigura faptul ca sistemul va produce
ceea ce s-a dorit.

Element
Actori

Caz de utilizare
(Use-Case)
Asociere

Descriere
Un actor este, in principiu, un utilizator al
sistemului, dar poate fi si un alt sistem
informatics care interactioneaza cu sistemul
analizat
Cazurile de utilizare se reprezinta sub forma unei
elipse in interiorul careia este scris numele
cazului respectiv. Numele incepe de obicei cu un
verb
Asocierea este utilizata pentru a indica legatura
dintre un actor si un caz de utilizare, in sensul ca
acel actor participa intr-ul fel oarecare in acel caz

Notatie

5.6. Diagrama de activitate

Activity Diagram reprezint o modalitate de modelare vizual a fluxurilor.

Cu ajutorul activity diagram pot fi modelate foarte bine use case-urile, dar, n
aceeai msur, aceste diagrame pot fi folosite pentru modelarea proceselor de
business (fr legtur cu sistemul informatic).

Notatiile sunt foarte asemntoare cu cele din diagrama de stare deoarece activity
diagram nu sunt altceva dect o variaie a statechart diagram.

5.7. Diagrame de componente


O component este un modul soft (cod surs, cod binar, dll, executabil etc) cu o
interfat bine definit.
Un tip de component reprezint o parte distinct, realocabil, a implementrii
unui sistem.
In UML, termenul de componenta desemneaza un element software fizic din
componenta unui sistem. Astfel, o componenta poate fi: cod binar, document, fisier
continand cod sursa sau date, tabela a unei baze de date.
O componenta binara este o parte fizica si substituibila a unui sistem, care
realizeaza si este in conformitate cu un set de interfete.
Componentele binare sunt independente de limbajul de programare in care au fost
codificate iar utilizarea lor se bazeaza exclusiv pe interfete. Tehnologiile folosite in
prezent pentru crearea de componente binare sunt: COM+, DCOM,CORBA, Java Beans.

5.8. Diagramele de clasa


Diagrama de clase
Modeleaz vocabularul sistemului ce trebuie dezvoltat
Surprinde conexiunile semantice sau interaciunile care se stabilesc ntre
elementele componente
Folosit pentru a modela structura unui program
Poate conine
Clase/Interfee
Obiecte
Legaturi
- Asociere
- Agregare
- Generalizare
- Dependen
- Realizare

Clase
Modeleaz vocabularul = identific conceptele pe care clientul sau programatorul le
folosete pentru a descrie soluia problemei
Pot fi:
- Abstracii care fac parte din domeniul problemei
- Clase necesare la momentul implementrii
Obiect
Reprezint o instan a unei clase
Are identitate i valori ale atributelor
Legaturi
ntre clase
- A. Generalizare
- B. Dependen
- C. Realizare
ntre instane ale claselor
- D. Asociere
- E. Agregare

5.9. Functii implementate in cod


FUNCTIA DE REFRESH PENTRU CAMPURI
Private Sub goleste_campuri()
Txtnume.Text = ""
Txtlot.Text = ""
Txtcantitate.Text = ""
Txtdataf.Text = ""
Txtdatae.Text = ""
Txtproducator.Text = ""
Txtpret.Text = ""
Txtptva.Text = ""
Txttva.Text = ""
End Sub

VALIDARI

If Txtnume.Text = "" Then


Beep()
MsgBox("Completati Denumire Produs !")
Txtnume.Focus()
Exit Sub
End If
If Txtlot.Text = "" Then
Beep()
MsgBox("Completati Numarul lotului !")
Txtlot.Focus()
Exit Sub
End If
If Txtdataf.Text = "" Then
Beep()
MsgBox("Completati data fabricarii !")
Txtdataf.Focus()
Exit Sub
End If
If Txtdatae.Text = "" Then
Beep()
MsgBox("Completati data expirarii !")
Txtdatae.Focus()
Exit Sub
End If
If Txtcantitate.Text = "" Then
Beep()
MsgBox("Completati cantitatea !")
Txtcantitate.Focus()
Exit Sub
End If
If Txtproducator.Text = "" Then
Beep()
MsgBox("Completati Numele producatorului !")
Txtproducator.Focus()

5.10. Arhitectura aplicatiei

5.7.1 Sistemul de meniuri

6. Concluzii
6.1. Consideratii personale
Am creeat aceasta aplicatie gandindu-ma ca de multe ori am fost la farmacie
iar softul acestora sa blocat, sau a trebui sa stau la coada deoarece
asistentul/farmacistul nu se descurca asa de bine cu soft-ul ales de Firma.
Tind sa cred ca aplicatia mea are o interfata prietenoasa, cu care orice
persoana se poate descurca dupa putine explicatii. Aplicatia contine Validari ce
ajuta la eliminarea partiala a erorilor umane si este destul de precisa. Utilizatorul isi
poate indeplini sarcinile cu o mult mai multa simplitate avand in vedere ca
programul se ocupa de efectuarea facturilor in baza bonului si a persoanei
beneficiare, stocheaza datele pentru o buna perioada de timp, si nu ingreuneaza
sistemul.
In aplicatie nu pot avea acces persoanele straine, sau cele care nu au un nume de
utilizator si o parola.

6.2.Bibliografie
1.http://www.unixinside.org/papers/C++-Book/cap10.html
2.www.scritub.com
3.http://en.wikipedia.org/wiki/Windows_Workflow_Foundation
4.http://stackoverflow.com/questions/10133946/datagridview-does-not-refresh-afterdataset-update-vb-net
5.http://www.c-sharpcorner.com/Forums/Thread/212884/visual-studio-2012-wpfdatagrid-slow-in-refresh.aspx
6.http://office.microsoft.com/en-us/access-help/enforce-referential-integritybetween-tables-adp-HP003084014.aspx
7.www.bazededate.org/ModelulUnificat.pdf
8.http://office.microsoft.com/ro-ro/access-help/despre-proiectarea-unei-baze-de-dateHP005189136.aspx
9.http://www.w3schools.com/sql/sql_datatypes.asp
10.http://ro.wikipedia.org/wiki/SQL
11.http://office.microsoft.com/en-001/access-help/access-sql-basic-concepts-vocabulary-andsyntax-HA010256402.aspx
12.http://www.rasfoiesc.com/educatie/informatica/Notiuni-de-baza-Visual-Basic47.php
13.http://lifehacker.com/5791578/what-is-the-net-framework-and-why-do-i-need-it
14.http://biblioteca.regielive.ro/cursuri/electronica/tehnologia-net-270908.html
15.http://www.bigresource.com/VB-Search-Button-Code-tTtQpYQrZu.html
16.Baze de date si utilizarea acestora Adriana Olteanu, Magdalena Anghel, Radu Nicolae
Pietraru , 2005

7. Anexa

Formul Adaugare_produs
Imports System.Data.OleDb
Public Class Adauga_produs
Dim con As New OleDbConnection
Dim cmd As New OleDbCommand
Private Sub Adauga_produs_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'FarmacieDataSet.Produse' table. You can move,
or remove it, as needed.
Me.ProduseTableAdapter.Fill(Me.FarmacieDataSet.Produse)
End Sub
Private Sub goleste_campuri()
Txtnume.Text = ""
Txtlot.Text = ""
Txtcantitate.Text = ""
Txtdataf.Text = ""
Txtdatae.Text = ""
Txtproducator.Text = ""
Txtpret.Text = ""
Txtptva.Text = ""
Txttva.Text = ""
End Sub
Private Sub adauga_inregistrare()
Dim listaCampuri As String
Dim listaValori As String
con.ConnectionString = ProduseTableAdapter.Connection.ConnectionString
cmd.Connection = con
listaCampuri = "Nume_produs, Numar_lot, Data_fabricarii, Data_expirarii, Producator,
Cantitate, Pret, TVA, Pret_cu_TVA"
listaValori = "'" & Txtnume.Text & "','" & Txtlot.Text & "','" & Txtdataf.Text & "','" &
Txtdatae.Text & "','" & Txtproducator.Text & "','" & Txtcantitate.Text & "','" & Txtpret.Text & "','" &
Txttva.Text & "','" & Txtptva.Text & "'"

cmd.CommandText = "Insert into Produse(" & listaCampuri & ") " & "Select " & listaValori
MsgBox(cmd.CommandText)
con.Open()
cmd.ExecuteNonQuery()
con.Close()
End Sub
Private Sub refresh_grid(ByVal p As Integer)
ProduseTableAdapter.Fill(FarmacieDataSet.Produse)
ProduseBindingSource.Position = p
End Sub

Private Sub Produse_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles MyBase.Load
'TODO: This line of code loads data into the 'FarmacieDataSet.Producatori' table. You can
move, or remove it, as needed.
Me.ProduseTableAdapter.Fill(Me.FarmacieDataSet.Produse)
ProduseTableAdapter.Connection.ConnectionString =
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ds
'onfigurare(butoane)
Btnresetare.Visible = True
Btnadaugare.Visible = True
Btninapoi.Visible = True
Btnstergere.Visible = True
'Protectie componente
DataGridView1.AllowUserToAddRows = True
DataGridView1.AllowUserToDeleteRows = True
DataGridView1.ReadOnly = True
Txtnume.ReadOnly = False
Txtlot.ReadOnly = False
Txtcantitate.ReadOnly = False
Txtdataf.ReadOnly = False
Txtdatae.ReadOnly = False
Txtproducator.ReadOnly = False
Txtpret.ReadOnly = False
Txtptva.ReadOnly = False
Txttva.ReadOnly = False
End Sub
Private Sub AdaMod(ByVal t As String)
'Configurare butoane
Btnresetare.Visible = True
Btnadaugare.Visible = True
Btninapoi.Visible = True
Btnstergere.Visible = True
Btnadaugare.Enabled = True
Btnresetare.Enabled = True
Btninapoi.Enabled = True
Btnstergere.Enabled = True
'Dezlegare controale Panel
Txtnume.DataBindings.Clear()
Txtlot.DataBindings.Clear()
Txtcantitate.DataBindings.Clear()
Txtdataf.DataBindings.Clear()
Txtdatae.DataBindings.Clear()
Txtproducator.DataBindings.Clear()
Txtpret.DataBindings.Clear()
Txtptva.DataBindings.Clear()
Txttva.DataBindings.Clear()
'Ridicare protectie actualizare
Txtnume.ReadOnly = False

Txtlot.ReadOnly = False
Txtcantitate.ReadOnly = False
Txtdataf.ReadOnly = False
Txtdatae.ReadOnly = False
Txtproducator.ReadOnly = False
Txtpret.ReadOnly = False
Txtptva.ReadOnly = False
Txttva.ReadOnly = False

'Pozitionare cursor pe primul camp


Txtnume.Focus()
End Sub
Private Sub Btnadaugare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Btnadaugare.Click
If Txtnume.Text = "" Then
Beep()
MsgBox("Completati Denumire Produs !")
Txtnume.Focus()
Exit Sub
End If
If Txtlot.Text = "" Then
Beep()
MsgBox("Completati Numarul lotului !")
Txtlot.Focus()
Exit Sub
End If
If Txtdataf.Text = "" Then
Beep()
MsgBox("Completati data fabricarii !")
Txtdataf.Focus()
Exit Sub
End If
If Txtdatae.Text = "" Then
Beep()
MsgBox("Completati data expirarii !")
Txtdatae.Focus()
Exit Sub
End If
If Txtcantitate.Text = "" Then
Beep()
MsgBox("Completati cantitatea !")
Txtcantitate.Focus()
Exit Sub
End If
If Txtproducator.Text = "" Then
Beep()
MsgBox("Completati Numele producatorului !")
Txtproducator.Focus()
Exit Sub
End If
If Txtpret.Text = "" Then
Beep()

MsgBox("Completati pretul !")


Txtpret.Focus()
Exit Sub
End If
If Txttva.Text = "" Then
Beep()
MsgBox("Completati valoarea TVA-ului !")
Txttva.Focus()
Exit Sub
End If
If Txtptva.Text = "" Then
Beep()
MsgBox("Completati Pretul cu TVA al produsului !")
Txtptva.Focus()
Exit Sub
End If
AdaMod("ADAUGARE")
'Initializare campuri Panel
adauga_inregistrare()
goleste_campuri()
End Sub
Private Sub Txtnume_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles
Txtnume.Leave
Dim rdr As OleDbDataReader
If Txtnume.Text = "" Then Exit Sub
con.ConnectionString = ProduseTableAdapter.Connection.ConnectionString
cmd.Connection = con
cmd.CommandText = "Select * from Produse Where Nume_produs = '" & Txtnume.Text & "'"
con.Open()
rdr = cmd.ExecuteReader
If rdr.Read Then
Beep()
MsgBox("Nume deja existent !")
Txtnume.Focus()
End If
con.Close()
End Sub
Private Sub Btnresetare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Btnresetare.Click
'onfigurare(butoane)
Btnresetare.Visible = True
Btnadaugare.Enabled = True
Btninapoi.Enabled = True

'Protectie componente
DataGridView1.AllowUserToAddRows = True
DataGridView1.AllowUserToDeleteRows = True
DataGridView1.ReadOnly = True
Txtnume.ReadOnly = True
Txtnume.ReadOnly = True
Txtlot.ReadOnly = True
Txtcantitate.ReadOnly = True
Txtdataf.ReadOnly = True
Txtdatae.ReadOnly = True
Txtproducator.ReadOnly = True
Txtpret.ReadOnly = True
Txtptva.ReadOnly = True
Txttva.ReadOnly = True
'Legare controale
Txtnume.DataBindings.Add("", ProduseBindingSource, "Nume_produs")
Txtlot.DataBindings.Add("", ProduseBindingSource, "Numar_lot")
Txtcantitate.DataBindings.Add("", ProduseBindingSource, "Cantitate")
Txtdataf.DataBindings.Add("", ProduseBindingSource, "Data_fabricarii")
Txtdatae.DataBindings.Add("", ProduseBindingSource, "Data_expirarii")
Txtproducator.DataBindings.Add("", ProduseBindingSource, "Producator")
Txtpret.DataBindings.Add("", ProduseBindingSource, "Pret")
Txtptva.DataBindings.Add("", ProduseBindingSource, "Pret_cu_TVA")
Txttva.DataBindings.Add("", ProduseBindingSource, "TVA")
End Sub
Private Sub Btninapoi_Click(sender As Object, e As EventArgs) Handles Btninapoi.Click
Me.Close()
End Sub
Private Sub Btnstergere_Click(sender As Object, e As EventArgs) Handles Btnstergere.Click
Dim rdr As OleDbDataReader
Dim p As Long

If MsgBox("Confirmati stergerea", MsgBoxStyle.OkCancel + MsgBoxStyle.Exclamation) =


MsgBoxResult.Cancel Then _
Exit Sub
'Validare integritate referentiala
con.ConnectionString = ProduseTableAdapter.Connection.ConnectionString
cmd.Connection = con
cmd.CommandText = "Select * from Produse where Nume_produs = '" &
ProduseBindingSource.Current("Nume_produs") & "'"
con.Open()
rdr = cmd.ExecuteReader()
rdr.Close()
'Se efectueaza stergerea
cmd.CommandText = "DELETE from Produse where Nume_produs = '" &
ProduseBindingSource.Current("Nume_produs") & "'"

cmd.ExecuteNonQuery()
con.Close()
'Salvare pozitie produs crt
p = ProduseBindingSource.Position
'Refresh grid
Me.ProduseTableAdapter.Fill(Me.FarmacieDataSet.Produse)
'Refacere pozitie
ProduseBindingSource.Position = p
End Sub
Private Sub Btnrefresh_Click(sender As Object, e As EventArgs) Handles Btnrefresh.Click
Me.ProduseTableAdapter.Fill(Me.FarmacieDataSet.Produse)
End Sub
End Class

Formul Vanzari
Imports System.Data.OleDb
Public Class Vanzari
Public ID As Long
Dim con As New OleDbConnection
Dim cmd As New OleDbCommand
Dim rdr As OleDbDataReader
Private Sub Btninapoi_Click(sender As Object, e As EventArgs) Handles Btninapoi.Click
Me.Close()

End Sub
Private Sub Vanzari_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'FarmacieDataSet.Tip_Pacienti' table. You can
move, or remove it, as needed.
Me.Tip_PacientiTableAdapter.Fill(Me.FarmacieDataSet.Tip_Pacienti)
'TODO: This line of code loads data into the 'FarmacieDataSet.Produse' table. You can move,
or remove it, as needed.
Me.ProduseTableAdapter.Fill(Me.FarmacieDataSet.Produse)
'TODO: This line of code loads data into the 'FarmacieDataSet.Vanzari' table. You can move,
or remove it, as needed.
Me.VanzariTableAdapter.Fill(Me.FarmacieDataSet.Vanzari)
'TODO: This line of code loads data into the 'FarmacieDataSet.Producatori' table. You can
move, or remove it, as needed.
Me.ProduseTableAdapter.Fill(Me.FarmacieDataSet.Produse)
End Sub
Private Sub completeazaDateVanzare()
Try
VanzariBindingSource.Current("Produs") = ProduseBindingSource.Current("Nume_produs")
VanzariBindingSource.Current("Pret") = ProduseBindingSource.Current("Pret_cu_TVA")
VanzariBindingSource.Current("Pacient") =
PacientiBindingSource.Current("Nume_pacient")
VanzariBindingSource.Current("Cod retera") = PacientiBindingSource.Current("Reteta")

VanzariBindingSource.Current("Medic") =
PacientiBindingSource.Current("Medic_supraveghetor")
VanzariBindingSource.Current("ID") = ProduseBindingSource.Current("ID")
calcValori()
DataGridView1.Refresh()
Catch ex As Exception
End Try
End Sub
Private Sub calcValori()
Dim v As Decimal
Dim tva As Decimal
Dim c As Decimal
Dim p As Decimal
Dim vtva As Decimal
Dim i As ULong
i = VanzariBindingSource.Position
If IsDBNull(VanzariBindingSource.Current("Pret")) Then Exit Sub
If IsDBNull(VanzariBindingSource.Current("Cantitate")) Then Exit Sub
c = VanzariBindingSource.Current("Cantitate")
p = VanzariBindingSource.Current("PretVanzare")
vtva = ProduseBindingSource.Current("TVA")
v=c*p
vtva = v * tva / 100
VanzariBindingSource.Current("Pret") = v
ProduseBindingSource.Current("TVA") = tva
DataGridView1.Refresh()
End Sub
Private Sub calcTotal()
Dim s1 As Decimal
Dim s2 As Decimal
For Each rec In VanzariBindingSource
If Not IsDBNull(rec("Pret")) Then s1 = s1 + rec("Pret")
If Not IsDBNull(rec("TVA")) Then s2 = s2 + rec("TVA")
Next
txtTotalValoare.Text = s1
txtValoareTVA.Text = s2
TxtTotalComanda.Text = s1 + s2
End Sub
Private Sub CalcNr()
cmd.CommandText = "Select Max(ID) as MaxNr from Vanzari"
con.Open()
rdr = cmd.ExecuteReader
rdr.Read()
If IsDBNull(rdr("MaxNr")) Then
Txtbon.Text = 1
Else

Txtbon.Text = rdr("MaxNr") + 1
End If
rdr.Close()
con.Close()
End Sub
Private Sub adaugaComanda()
Dim d As Date
Dim usdate As String
Dim id As ULong
Dim rec As DataRow
d = dpData.Value
usdate = d.Month & "/" & d.Day & "/" & d.Year
cmd.CommandText = "Insert into Vanzari(ID, Data, Tip_pacient) " & _
"Select " & TxtID.Text & ",#" & usdate & "#," & Cmbtip.SelectedValue
con.Open()
cmd.ExecuteNonQuery()
'Determin idComanda
cmd.CommandText = "Select ID from Vanzari where NrComanda = " & TxtID.Text & _
" and Data = #" & usdate & "# and Tip_pacient=" & Cmbtip.SelectedValue
rdr = cmd.ExecuteReader()
rdr.Read()
id = rdr("ID")
rdr.Close()
For Each rec In FarmacieDataSet.Vanzari
cmd.CommandText = "Insert into Vanzari(ID, Medic, Pacient, Cod reteta, Tip_pacient,
Produs, Cantitate, Pret, Pret_cu_TVA) Select " & _
id & "," & rec("Medic") & "," & rec("ID") & "," & rec("Pret") & "," &
rec("Cantitate") & _
"," & rec("Pret_cu_TVA")
cmd.ExecuteNonQuery()
Next
con.Close()
End Sub
Private Sub initCampuri()
Dim n As ULong
Dim i As ULong
CalcNr()
Cmbtip.SelectedIndex = -1
n = FarmacieDataSet.Vanzari.Count
For i = 1 To n
FarmacieDataSet.Vanzari(0).Delete()
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load

PacientiTableAdapter.Connection.ConnectionString =
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ds
ProduseTableAdapter.Connection.ConnectionString =
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ds
con.ConnectionString = PacientiTableAdapter.Connection.ConnectionString
cmd.Connection = con
Me.PacientiTableAdapter.Fill(Me.FarmacieDataSet.Pacienti)
Me.ProduseTableAdapter.Fill(Me.FarmacieDataSet.Produse)
If ID = 0 Then
CalcNr()
Else
CompleteazaDateComanda()
End If
End Sub
Private Sub CompleteazaDateComanda()
Dim pacient As Long
Dim dc As Date
Dim rec As DataRow
cmd.CommandText = "Select * from Vanzari where ID = " & TxtID.Text
con.Open()
rdr = cmd.ExecuteReader
rdr.Read()
dc = rdr("DataComanda")
dpData.Value = dc
pacient = rdr("Pacient")
Cmbtip.SelectedValue = pacient
rdr.Close()
cmd.CommandText = "SELECT Vanzari.ID," & _
"Vanzari.Pret,Vanzari.Cantitate, " & _
"Vanzari.TVA, Produse.Nume_produs, " & _
"Vanzari.ID " & _
"FROM ((Vanzari LEFT OUTER JOIN " & _
"Produse ON Vanzari.ID = Produse.IdProdus) " & _
"WHERE(Vanzari.ID = " & ID &
") ORDER BY Vanzari.ID"
rdr = cmd.ExecuteReader
While rdr.Read
rec = FarmacieDataSet.Vanzari.NewRow
rec("ID") = rdr("ID")
rec("Produs") = rdr("Nume_produs")
rec("Pret") = rdr("Pret_cu_TVA")
rec("Cantitate") = rdr("Cantitate")
rec("IdProdus") = rdr("IdProdus")
rec("CotaTVA") = rdr("CotaTVA")
rec("Pret") = rec("Pret_cu_TVA") * rec("Cantitate")
rec("TVA") = rec("Pret") * rec("TVA") / 100
FarmacieDataSet.Vanzari.AddVanzariRow(rec)
End While
rdr.Close()

con.Close()
calcTotal()
End Sub
Private Sub ProduseBindingSource_CurrentChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles ProduseBindingSource.CurrentChanged
completeazaDateVanzare()
'Me.DataGridView1.CurrentCell = Me.DataGridView1(2, 0)
End Sub
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
calcValori()
End Sub
Private Sub DataGridView1_CellMouseClick(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles
DataGridView1.CellMouseClick
If DataGridView1.CurrentCell.ColumnIndex <> 1 Then Exit Sub
End Sub
Private Sub DataGridView1_DataError(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
MsgBox(e.Exception.Message)
End Sub
Private Sub VanzariBindingSource_CurrentChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles VanzariBindingSource.CurrentChanged
Try
VanzariBindingSource.Current("Nrc") = VanzariBindingSource.Position + 1
calcTotal()
Catch ex As Exception
End Try
End Sub
Private Sub TxtTotalComanda_MouseClick(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles TxtTotalComanda.MouseClick
calcTotal()
End Sub
Private Sub txtTotalValoare_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles txtTotalValoare.Click
calcTotal()
End Sub
Private Sub txtValoareTVA_MouseClick(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles txtValoareTVA.MouseClick
calcTotal()
End Sub

Private Sub DataGridView1_UserDeletedRow(ByVal sender As Object, ByVal e As


System.Windows.Forms.DataGridViewRowEventArgs) Handles DataGridView1.UserDeletedRow
Dim rec As DataRow
Dim i As Integer
i=1
For Each rec In FarmacieDataSet.Vanzari
rec("ID") = i
i=i+1
Next
End Sub
Private Sub DataGridView1_UserDeletingRow(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles
DataGridView1.UserDeletingRow
If MsgBox("Confirmati stergerea", vbOKCancel + MsgBoxStyle.Exclamation) = vbCancel
Then e.Cancel = True
End Sub
Private Sub btnConfirmare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnConfirmare.Click
If TxtID.Text = "" Then
Beep() : MsgBox("Completati Id-ul comenzii") : TxtID.Focus() : Exit Sub
End If
If Cmbtip.Text = "" Then
Beep() : MsgBox("Completati tipul pacientului") : Cmbtip.Focus() : Exit Sub
End If
End Sub
Private Sub modificaComanda()
Dim d As Date
Dim usdate As String
d = dpData.Value
usdate = d.Month & "/" & d.Day & "/" & d.Year
cmd.CommandText = "Update Vanzari Set ID = " & TxtID.Text & _
", DataComanda = #" & usdate & "#" & _
", Tip_pacient = " & Cmbtip.SelectedValue & _
" Where ID = " & ID
con.Open()
cmd.ExecuteNonQuery()
'Sterg continutul comenzii din baza de date
cmd.CommandText = "Delete from Vanzari Where ID = " & ID
cmd.ExecuteNonQuery()
'Adaug noul continut al comenzii in baza de date
For Each rec In FarmacieDataSet.Vanzari
cmd.CommandText = "Insert into Vanzari(ID, Medic, Pacient, Cod reteta, Tip_pacient,
Produs, Cantitate, Pret, Pret_cu_TVA) Select " & _
ID & "," & rec("Medic") & "," & rec("ID") & "," & rec("Pret") & "," &
rec("Cantitate") & _
"," & rec("Pret_cu_TVA")
cmd.ExecuteNonQuery()
Next

con.Close()
End Sub
Private Sub Btnbonnou_Click(sender As Object, e As EventArgs) Handles Btnbonnou.Click
Bon.Show()
End Sub
Private Sub Btnconfirmare_Click_1(sender As Object, e As EventArgs) Handles
Btnconfirmare.Click
CompleteazaDateComanda()
adaugaComanda()
End Sub
End Class