pentru FINALIZAREA STUDIILOR DE CONVERSIE LA PROGRAMELE DE STUDII POSTUNIVERSITARE ÎN INFORMATICĂ Coordonator științific: Prof. univ. Autor:… [304798]
[anonimizat]:
Prof. univ.
Autor:
Absolvent.
2020
[anonimizat] A ACTIVITATILOR DESFASURATE IN FARMACIE
Coordonator științific:
Prof. univ.
Autor:
Absolvent.
Cuprins
1. Capitolul I. 8
1.1 Introducere 8
1.2 O scurta prezentare a conținuturilor 8
2. Capitolul II 10
2.1 Componenta .NET Framework 10
2. 2 Compilarea programelor pe platforma .NET 12
2.3 Limbajul C# 13
2.3.1 Noțiunea de OOP 13
2.3.2 Mecanismele fundamentale ale OOP 14
2.3.3 Noțiunea de clasa 14
2. 3.4 Datele din interiorul unei clase 17
2.3.5 Funcțiile clasei 19
2.3.6 Moștenirea 28
2.4 Elementele Limbajului SQL 36
2.5 Baze de date relaționale 38
3. Capitolul III. Aplicația de gestiune a unei Farmacii 40
3.1 Scenariu 40
3.2 Baza de date a aplicației 40
3.3 Implementarea aplicației si funcționalitățile acesteia 44
4. Concluzii 72
5. Bibliografie 73
Capitolul I.
Introducere
Dezvoltarea sistemelor de baze reprezintă in ultimii ani unul dintre cele mai importante aspecte in domeniul activității IT. Modul de organizare si funcționalitatea diverselor organizații si instituții depinde de o buna proiectare si implementare a bazei de date. [anonimizat], [anonimizat], [anonimizat], școlile, bibliotecile, etc. sunt dependente de buna funcționare ( corecta si neîntrerupta) a sistemelor de baze de date.
Zilnic oamenii interacționează cu bazele de date: rezervarea unui bilet de tren, o [anonimizat], împrumutul unei cărți de la biblioteca.
Bazele de date au diverse dimensiuni( număr de înregistrări) in funcție de universul sau afacerea pe care o descriu. Marea majoritate a [anonimizat].
Fundamentele bazelor relaționale au fost puse de E.F. Codd in 1970.
Numărul farmaciilor a [anonimizat], numărul medicamentelor a [anonimizat]. Creșterea nivelului de trai in rândul societăți este însoțită/ sporită de tratarea adecvată a afecțiunilor de unde si cererea si oferta din ce in ce mai vasta a medicamentelor si tratamentelor.
[anonimizat], [anonimizat], marea majoritate a aplicațiilor combina limbajul destinat gestionarii bazei de date cu un mediu vizual de programare.
O scurta prezentare a conținuturilor
Lucrarea de fata își propune sa trateze următoarele aspecte:
Capitolul I. Oferă o scurta introducere in utilitatea unei aplicații de gestiune a [anonimizat].
Capitolul II.
Scurta prezentare a Componentei .NET Framework
Compilarea programelor pe platforma .NET
Elemente ale limbajului C#
Elementele Limbajul SQL
Baze de date relaționale
Capitolul III
Scenariu aplicației
Prezentarea bazei de date
Implementarea aplicației cu utilitățile ei.
Capitolul II
Componenta .NET Framework
.NET Framework este o componentă livrată împreună cu sistemul de operare Windows. Reprezintă un mediu care permite dezvoltarea si rularea aplicațiilor si serviciilor Web, independent de platforma. Ea stă la baza tehnologiei .NET si reprezintă ultima interfața dintre aplicațiile .NET si sistemul de operare. In prezent este formata din 3 componente esențiale:
Limbajele C#, VB.NET, C++ și J#. Ele respectă niște specificații OOP numite Common TypeSystem (CTS)pentru a putea fi integrate pe platforma. Elementele lor de baza sunt : clase, interfețe, delegări, tipuri valoare și referință, iar ca mecanisme: moștenire, polimorfism și tratarea excepțiilor
Common LanguageRuntime –platforma de executare a programelor utilizata de toate cele patru limbaje.
Framework ClassLibrary (FCL)-bibliotecile utilizate in realizarea aplicațiilor.
Dezvoltarea de aplicații pe platforma .NET se poate face prin intermediul următoarelor elemente :
un set de limbaje (C#, Visual Basic .NET, J#, Managed C++, Smalltalk, Perl, Fortran, Cobol, Lisp, Pascal etc),
un set de medii de dezvoltare (Visual Studio .NET, Visio),
o bibliotecă de clase pentru crearea serviciilor Web, aplicațiilor Web și aplicațiilor desktop Windows.
Când dezvoltăm aplicații .NET, putem utiliza:
Servere specializate – un set de servere Enterprise .NET (din familia SQL Server 2000, Exchange 2000 etc), care pun la dispoziție funcții de stocare a bazelor de date, email, aplicații B2B (BussinesstoBussiness – comerț electronic între partenerii unei afaceri).
Servicii Web (în special comerciale), utile în aplicații care necesită identificarea utilizatorilor (de exemplu, .NET Passport – un mod de autentificare folosind un singur nume și o parolă pentru toate site-urile vizitate)
Servicii incluse pentru dispozitive non-PC (Pocket PC PhoneEdition, Smartphone, Tablet PC, Smart Display, XBox, set-top boxes, etc.)
Arhitectura .NET Framework
Componenta .NET Framework este formată din compilatoare, biblioteci și alte executabile utile în rularea aplicațiilor .NET.
Fișierele corespunzătoare se află, în general, în directorul C:\WINDOWS\Microsoft.NET\Framework\V2.0…. (corespunzător versiunii instalate).
Principalele caracteristici ale arhitecturi .NET
Independenta dintre procesor si platforma
In scrierea aplicațiilor programatorii nu trebuie sa fie preocupați de caracteristici hardware si software ale sistemului.
Interoperabilitatea limbajelor
Componentele aceleiași aplicații pot fi scrise in diverse limbaje suportate de platforma .NET.
Managementul automat al memoriei
Existenta mecanismului de garbagecollection(alocarea si eliberarea memoriei in mod automat).
Portabilitatea
Un program scris pe platforma .NET poate rula pe orice sistem pe care aceasta platforma este instalata.
Securitatea
Este realizata pe platforma prin mecanismul de tratare a exceptiilor.
2. 2 Compilarea programelor pe platforma .NET
Limbajele de programare pot fi limbaje interpretate si limbaje compilate. Programarea intr-un limbaj interpretat presupune scrierea codului si rularea. Pe parcursul rulării codul este schimbat in cod mașină si executat. Se pot înlătura erorile pe parcurs. Limbajul nu necesită timp de compilarea si legare. Marele dezavantaj: sunt limbaje lente ( exemplu limbajul Visual Basic in momentul apariției).
Codul scris intr-un limbaj compilat se numește cod sursa, este translatat de compilator in cod executabil. In cazul in care apar erori se reia compilarea. Exemplu limbajele C, C++.
Limbajul C# este un limbaj compilat. In comparative cu celelalte doua limbaje menționate mai sus in urma compilării codului se creează un fișier assembly( cu extensia .exe sau .dll). un astfel de fișier poate fi executat pe un sistem fără .NET. Fișierul conține un cod numit limbaj intermediar, CIL (Common Intermediate Language). CIL conține un set de instrucțiuni portabile, independente de platforma si procesor.
In momentul in care un program este executat, CRL activează compilatorul JIT( just in time). Acesta preia codul CIL si-l transforma in executabil.
Un program compilat in format CIL poate rula pe orice sistem pe care s-a instalat CRL.
Fișierul .exe( sau .dll) creat la compilare conține codul CIL si metadatele( datele utilizate de aplicație).
Procesul de compilare C# pe platforma .NET
De ce am alege .NET?
Oferă instrumente pe care le putem folosi si in alte programe, permite accesul ușor la baze de date, realizarea elementelor grafice
Dispune de instrumente( controale) pentru realizarea elementelor grafice in cadrul interfețelor. Controale ce sunt găsite in spațiul de nume System.Windows.Forms
.NET vă oferă clase care efectuează majoritatea sarcinilor uzuale, reducând astfel timpul necesar dezvoltării aplicațiilor.
Limbajul C#
2.3.1 Noțiunea de OOP
Programarea orientata pe obiect (OOP) este cel mai nou stil de programare.
In programarea procedurala se definesc tipuri de date si funcții care lucrează cu aceste tipuri, dar se păstrează o bariera intre acestea. Logica grupării acestora revine programatorului.
In OOP se definesc tipuri de date si metode care lucrează cu acestea, ele se grupează in același obiect.
Acest mod de organizare este net superior in conceperea aplicațiilor de mari dimensiuni, atunci când se lucrează in echipa.
Avantaje deosebite se obțin prin abstractizare. Programul este format dintr-un ansamblu de obiecte cu diverse proprietăți. Obiecte care interacționează intre ele.
2.3.2 Mecanismele fundamentale ale OOP
Încapsularea.
Un obiect încapsulează date si cod care acționează asupra acestora. O regula de baza OOP este aceea ca o parte din membrii sa fie protejați, astfel încât sa nu fie accesați din afara, iar alți publici. Cei publici formează interfața.
Abstractizarea
Modelarea realității prin intermediul claselor care copiază caracteristicile obiectului real.
Moștenirea
Reprezintă mecanismul prin care o clasa deriva din alta clasa. Prin derivare înțelegem păstrarea comportamentului clasei si adăugarea de comportamente specifice noi clase.
Exemplu: vrem sa construim un buton cu colturile rotunjite, luminos. Ne vom folosi de butonul existent ( clasa Button din Forms) si vom adaugă codul cerut suplimentar.
Principalul beneficiu al moștenirii este reutilizarea codului.
Polimorfismul
Reprezintă posibilitatea mai multor obiecte dintr-o ierarhie de clase de a utiliza metode cu același nume dar comportament diferit.
2.3.3 Noțiunea de clasa
Definiție : Clasa este o unitate logica care modelează un obiect real sau abstract. Ea încapsulează date si funcții care operează cu aceste date.
Datele pot fi câmpuri sau constante. Funcțiile pot fi: metode, proprietăți, constructori, destructori, operatori, evenimente.
Pentru definire se folosește cuvântul chei class.
Sintaxa:
class nume
{
//campuri
[modificator acces] tip1 nume1;
[modificator acces] tip2 nume2;
………………………………..
[modificator acces] tip n nume n;
//metode
[modificator acces] tip_returnat nume_metoda1 (Parametrii1)
[modificator acces] tip_returnat nume_metoda2 (Parametrii2)
………………………………………………………………..
[modificator acces] tip_returnatnume_metoda n (Parametrii n)
}
Modificatori de acces controlează accesul la membrii clasei.
Pentru a crea un obiect dintr-o clasa se procedează conform exemplului de mai jos.
class A
{
//membrii
}
A a=new A(); //crearea unui obiect de tip A
Accesarea membrilor unei clase se face prin folosirea operatorului „.”.
a.membru
Exemplu: programul următor definește 2 clase: clasa Numere si clasa Program. In clasa Program, in funcția Main se creează un obiect de tip Numere si apoi se apelează metodele clasei Numere.
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespace clasa1
{
classNumere
{
privateintx,y;//camp privatcepaote fi accesatdoar din metodele sale
publicint Suma()
{
return x + y;
}
publicvoidInit(int a, int b)
{
x=a;
y=b;
}
publicintAfisarex()
{
return x;
}
publicintAfisarey()
{
return y;
}
}
classProgram
{
staticvoid Main(string[] args)
{
Numere n=newNumere();
// n.x=4;// campul x esteprivatsi nu paote fi accesat din altaclasa.
int s=n.Suma();//metodepublicece pot fi apelate
Console.WriteLine("valoareasumei="+s);
n.Init(5,6);
s=n.Suma();
Console.WriteLine("valoareasumei="+s);
Console.WriteLine("valoarealui x="+n.Afisarex());
Console.WriteLine("valoarealui y=" + n.Afisarey());
Console.ReadLine();
}
}
}
Rezultatul:
2. 3.4 Datele din interiorul unei clase
Datele din interiorul clasei sunt cunoscute ca variabile sau atribute. Tipul acestor date poate fi oricare dintre tipurile limbajului C#.
Declararea datelor. Sintaxa:
[modificator acces] tip_data nume;
Observații:
In cazul in care modificatorul de acces lipsește se considera a fi private.
Numele este un identificator stabilit de programator.
O clasificare a datelor membre poate fi considerata in: constante si câmpuri.
Constantele sunt valori fixe declarate prin intermediul cuvântului cheie const.
Sintaxa:
[modificator acces] const tip identificator=expresieConstanta;
Tipul acestor date constante poate fi orice tip predefinit fără object si enum.
Exemplu:
classExempluConstanta
{
public constint MAX=1000;
public conststring cale=”\dosar\b”;
constdouble MIN=MAX/11.3;
}
Campul reprezintă o variabila a clasei.
Sintaxa:
[modificator acces] tip identificator [=valoare];
Observații:
Pe lângă modificatori de acces studiați anterior se mai adaugă si: new, readonly, volatile, static;
După cerințe se poate face o inițializare explicita la declararea acestor câmpuri.
Exemplu:
class Data
{
public int nota;
protectedstring nume;
intid;//implicit este un camp privat
static void Main()
Data o=new Data();
o.id=13;
}
}
Un câmp de instanța reprezintă un câmp pentru care nu se specifica modificatorul static. In acest caz el se regăsește in orice obiect instanția al clasei.
o.id=13 //accesarea câmpului de instanța
Un câmp static este cel care folosește modificatorul static. Accesarea unui astfel de câmp din afara clasei se poate face doar prin numele clasei (câmpul aparține doar clasei).
class Data
{
public static n=4;
Static void Main()
{
Data.n–;
}
}
Câmpurile readonly sunt specificate de modificatorul readonly. Inițializarea (modificarea valori) se face fie la declarare fie prin intermediul constructorului.
class Data
{
public readonlyint x=14;
public readonlyint y;
public class Data(int n)
{
this.y=n;
}
}
Câmpurile volatile, folosesc modificatorul volatile. Astfel de câmpuri pot fi doar de următoarele tipuri.
byte, sbyte, short, ushort, int, uint, char, float, bool;
enumerare de tip byte, sbyte, short, ushort, int, uint;
tip referința;
Inițializarea implicita a câmpurilor unei clase respecta valorile din tabel:
2.3.5 Funcțiile clasei
Funcțiile din interiorul clasei pot sa fie de următoarele tipuri: constructorii, destructori, metode, proprietăți, evenimente, indexatori si operatori.
Constructori
Definiție: Constructorul este o funcție speciala care are rol in crearea si construirea obiectelor. La fiecare instanțiere a unui obiect dintr-o clasa se apelează constructorul clasei.
Observații:
Toate clasele au constructori( cel puțin unul);
Constructorii au același nume cu cel al clasei;
Constructorii nu returnează nimic si pot avea modificatori de acces;
Se pot defini proprii constructori, in lipsa lor se apelează cei impliciți;
Un constructor implicit inițializează câmpurile clasei cu valori implicite;
Constructorii pot fi declarați statici pentru inițializarea membrilor statici ai claselor.
Intr-o clasa pot exista mai mulți constructori in funcție de setările dorite pentru câmpuri. Diferențierea dintre ei se face prin parametrii din lista (numărul acestora si/sau tipul acestora).
Sintaxa:
modificator_accesnume_constructor([parametri])([initializator]
[{
corp_constructor;
}]
Observații: „initializator” permite invocarea numelui unui constructor anume înaintea execuției corpului constructorului curent. El are doua forme:
base ([parametri]) si this ([parametri]). Daca nu este precizat in mod automat el este base()
Exista si notiunea de constructor de copiere atunci când se dorește crearea de obiecte copii fidele ale altor obiecte.
Destructori
O clasa poate sa aiba un singur destructor si mai mulți constructori. Rolul destructorului este acela de a distruge obiectele( instanțele clasei).
Observații:
Nu are parametrii
Nu are modificator de acces
Se apelează automat
Nu poate fi moștenit
Este precedat de caracterul „~”
Exemplu:
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespace destructor
{
classPunct
{
publicint x;
publicint y;
publicPunct(int a, int b)
{
x = a;
y = b;
}
~Punct()
{
Console.WriteLine("Apel destructor");
}
}
classProgram
{
staticvoid Main()
{
Punct P = newPunct(10, 10);
Console.WriteLine(P.x + " " + P.y);
Console.ReadLine();
}
}
}
Metode
Sunt funcții care implementează acțiuni.
Sintaxa:
[modificator_acces] tip_returnatnume_metoda ([parametrii])
[{
corp_metoda;
}]
Observații:
In lipsa modificatorului acesta este private
Pe lângă modificatorii standard se adaugă si new, static, virtual, sealed, averride, abstract, extern
Poate fi orice tip definit sau void când nu returnează nimic
nume_metoda este un identificator. Atunci când definește doar un membru al interfeței este precedat de numele interfeței
[nume_interfata].[nume_metoda]
lista de parametri este formata dintr-o succesiune de declarări de forma următoare:
[atribut][modificator] tip_parametrunume_parametru
Unde, modificator poate sa fie ref (parametri de intrare, parametri ieșire), aut (parametri de ieșire). In lipsa acestui modificator parametrii sunt considerați de intrare si se transmit prin valoare (la ieșire din metoda își pierd valoarea).
Numele metodei trebuie sa fie diferit de cel al altor membrii. Apelul metodelor se face folosind operatorul „ .”. Exista doua forme de apel:
[nume_obiect].[nume_metoda] pentru functii nestatice
[nume_clasa].[nume_metoda] pentru functii statice
Suprancarcarea metodelor.
Operația se numește overloading. Presupune ca doua sau mai multe metode sa aibă același nume in aceeași clasa. Metodele trebuie totuși sa difere prin numărul si/sau tipul parametrilor formali.
Exemplu:
classSupraincaracare
{
void M(int x) {}
void M(char y){}//supraincaracare corecta;
void M(int x, char y){}//supraincaracare corecta;
int M(int x){}//incorect, acelasi tip de parametru formal)
}
Proprietatii
Este o functie a clasei ce permite sa accesam sau/si sa modificam caracteristicile unui obiect al clasei.
Vin in sprijinul accesării câmpurilor private, ca si cum ar fi declarate publice. Nu se încalecă protecția acestor câmpuri.
Sintaxa:
[atribut] modificator_accestipReturnatnumeProprietate
{
get{
}
set{
}
}
Observații:
modificator acces, poate fi orice tip clasic de modificator la care se adaugă: new, static, virtual, sealed, override, abstract, extern.
tipReturnat, poate fi orice tip al limbajului C#.
„get” corespunde unei metode fără parametrii si returnează o valoare de același tip cu al proprietății.
„set” corespunde unei metode cu un singur parametru al cărui tip este același cu tipul proprietății. Nu returnează nimic (void).
Este modalitatea recomandata pentru accesarea câmpurilor si protejarea lor in același timp. Parametrul care se transmite in cazul „set” nu apare explicit in sintaxa, el este implicit identificat prin „value”.
In interiorul lui set se poate plasa orice cod defensiv de protectie a câmpului asociat acestor proprietății.
namespaceproprietatii
{
classPunct
{
privatedouble x;
privatedouble y;
publicdouble P1
{
get
{
Console.WriteLine("Se acceseaza get din X");
return x;
}
set
{
Console.WriteLine("Se acceseaza set din X");
if (value> 3000)
x = 3000;
else
x = value;
}
}
classProgram
{
staticvoid Main()
{
Punct P = newPunct();
// P.x = 3;//Error 1 'proprietatii.Punct.x' is inaccessible due to its protection level- incorect
P.P1 = 3001;//se apeleaza set sin P1.
Console.WriteLine("valoarealui x="+P.P1);
}}
Daca dorim sa asociem proprietatea unui câmp static trebuie sa o declaram statica.
Nu pot fi supraîncărcați.
Evenimente si delegări
Evenimentele sunt membrii dintr-o clasa ce realizeaza notificari privind starea lor catre celelalte obiecte.
Clasa in care a avut loc evenimentul pune la dispoziția celorlalte clase un delegat, o referința către o funcție necunoscuta care va avea doar un antet specificat, urmând ca ea sa fie implementata la nivelul fiecărei clase interesata de eveniment.
Implementarea metodelor ce răspund la evenimente poarta numele de „tratarea evenimentelor”.
Sintaxa:
[atribut] [modificatorAcces] eventipDelegat nume
Unde,
modificatorAccessunt cei standard.
tipDelegat este un tip de date derivat din clasa Delegate a spațiului System.
Definirea unui tipDelegat se realizează:
[atribut][modificatorAcces] delegate tipRezultat nume[listaParametri]
Exemplu:
Clasa Vector cu metodele: constructor Vector, Afisare, si antetul si o metoda delegate. Clasa Program in care se implementează metoda delegate si metoda Main() . Programul verifica daca vectorul este crescător sau descrescător.
Operatori
Un operator ca membru al unei clase reprezinta o operatie care poate fi aplicata unei instanțe a clasei.
Operatorul ca membru reprezintă o supraîncărcare. C# permite redefinirea semnificației unui operator standard.
Sintaxa:
[atribut] modificatorOperatordecalaratieOperatorcorpOperator
Observații:
declararea operatorului trebuie sa fie publica sau statica
nu se accepta drept parametrii decât cei valoare
operatori unari au un singur parametru
operatorii binari au doi parametrii
operatorul „=” nu se supraîncarcă
daca supraîncărcam „==” atunci suntem obligați sa supraîncărcam si „!=” ( la fel in cazul „<”,”>” analog cu „<=”,”<=”.
Operatorii unari.
Sintaxa:
tip operator operatorUnar( tip operand)
{
}
Pot fi supraîncărcați următori operatori unari:+, -, !, ~, ++, –, true, false;
Observații:
tipOperand trebuie sa fie de tipul clasei in care se definește operatorul unar
operatorii +, -, !, ~ returnează orice tip de date
operatorii ++, – returnează un rezultat de tipul clasei
operatorii true si false returnează tipul bool.
Exemplu: Clasa Complex in care vom supraîncarcă -,++.
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceoperatori_unari
{
classComplex
{
publicdouble x;
publicdouble y;
public Complex(doublea,double b)
{
x = a;
y = b;
}
publicstaticComplexoperator -(Complex
{
a.x=-a.x;
a.y=-a.y;
return a;
}
publicstaticComplexoperator ++(Complex a)
{
a.x=2*a.x;
a.y=2*a.y;
return a;
}
}
classProgram
{
staticvoid Main()
{
Complex C;
C=newComplex(2.3,5);
Console.WriteLine(C.x+"+"+C.y+"*i");
C=-C;
Console.WriteLine(C.x+"+"+C.y+"*i");
C++;
Console.WriteLine(C.x + "+" + C.y + "*i");
Console.ReadLine(); }}}
Operatori binari.
Sintaxa:
tip operator operatorBinar (tip operand, tip operand)
{
}
Pot fi supraîncărcați operatorii binari: +, -, *, /, %, &, |, ^, <<, >>, ==, !=,<, >, <=, >=
Observație:
cel puțin unul dintre tip operand trebuie sa fie de tipul clasei
Operatori de conversie.
Operatorii pot fi de conversie implicita sau explicita.
Sintaxa:
implicit operator tip (tip operand) {}
explicit operator tip (tip operand) {}
Se poate realiza conversia dintr-un tip de baza într-o clasa si invers sau dintr-un tip de clasa in alt tip de clasa.
Exemplu: Conversia dintr-un tip de clasa in alt tip de clasa.
using System;
usingSystem.Threading.Tasks;
namespace ConsoleApplication7
{
classC1
{
publicint x;
public C1(int a)
{
x=a;
}
publicstaticexplicitoperatorC2(C1 c1)
{
C2 c2=newC2(c1.x*3,c1.x*5);
return c2;
}
}
classC2
{
publicint x;
publicint y;
public C2(inta,int b)
{
x=a;
y=b;
}
}
classProgram
{
staticvoid Main()
{
C1 c1=newC1(12);
Console.WriteLine(c1.x);
C2 c2=(C2)c1;
Console.WriteLine(c2.x+","+c2.y);
Console.ReadLine();
}}}
2.3.6 Moștenirea
Noțiuni generale
Este unul dintre principiile de baza ale OOP. Ea permite definirea unor noi clase pornind de la o clasa de baza, spunem ca o extinde.
Pe baza procesului de moștenire se pot crea ierarhii de clase.
Exemplu:
Ierarhie de clase
Esența moștenirii consta in a spune ca un obiect al clasei derivate este un obiect al clasei de baza.
Exemple:
Triunghiul isoscel este un Triunghi
Triunghiul este o Figura
Paralelogramul este un Patrulater
Extinderea presupune o specializare, iar moștenirea tuturor caracteristicilor clasei de baza presupune o generalizare.
Implementarea moștenirii
Fie clasa Triunghi care moștenește clasa Figura:
class Figura //clasa de baza
{
//membrii clasei de baza;}
class Triunghi: Figura //clasa care deriva din Figura
{
//membrii clasei triunghi
}
Clasa Triunghi va include toti membrii clasei Figura si in plus proprii membrii (excepție constructorii clasei de baza nu pot fi moșteniți).
Observații:
In C# toate clasele sunt derivate. Orice clasa deriva in mod direct sau indirect din clasa object (ea sta la baza tuturor ierarhilor de clase).
O clasa nu poate moșteni decât o singura clasa
Nu se accepta in C# moștenirea multipla
Adâncimea ierarhiei de moștenire nu are limite
class B:A{}
class C:B{}
class D:C{}
……………
Accesarea membrilor moșteniți
Un obiect al unei clase derivate moștenește toți membrii clasei de baza cu excepția constructorilor. Totuși prin intermediul modificatorilor de acces se poate restricționa accesul la uni dintre ei.
Modificatori de acces sunt: public, private, protected, internal si protectedinternal.
Observații:
Metodele clasei derivate pot accesa membrii publici si protejați ai clasei de baza.
Metodele unei clase pot accesa orice membru al clasei respective indiferent de nivelul de protecție
In afara clasei de baza si a celei derivate se pot accesa numai membrii publici ai clasei de baza.
Membrii unei clase marcați cu internal sunt vizibili pentru toate clasele din același fișier
Membrii unei clase marcați cu protectedinternal sunt vizibili tuturor celor care o moștenesc.
Constructorii claselor derivate
Constructorii nu se mostenesc in clasele derivate dar se pot apela pentru construirea unor porțiuni de obiect.
Observații:
La crearea unui obiect al unei clase derivate se apelează implicit constructorul clasei de baza, apoi se executa codul.
Se poate realiza si un apel explicit folosind sintaxa:
public ClasaDerivata: base()
{
}
Cazul devine obligatoriu atunci când clasa de baza are constructor cu parametrii.
Exemplu: Clasa de baza Dreptunghi si clasa derivata Patrat.
Using System;
usingSystem.Collections.Generic;
namespaceconstructori_derivati
{
classDreptunghi
{
publicint l;
publicint L;
publicDreptunghi()
{
Console.WriteLine("se apeleazaconstructorul din clasa de Dreptunghi");
}
}
classPatrat:Dreptunghi
{
publicPatrat()
{
Console.WriteLine("se apeleazaconstructorul din clasaPatrat");
L = l;
}
}
classProgram
{
staticvoid Main()
{
Patrat P = newPatrat();
Console.ReadLine();
}
}
}
Membri ascunși
Exista posibilitatea ca unul dintre câmpurile clasei derivate sa aibă același nume cu unul dintre câmpurile clasei de baza( sau o metoda sa aibă aceeași signatura).in acest caz se spune ca membrii clasei de baza sunt ascunșii clasei moștenitoare. Pentru accesarea acestora membrii vor folosi cuvântul cheie new plasat in fata membrilor din clasa derivata si base la accesare.
Exemplu:
using System;
usingSystem.Collections.Generic;
namespace ConsoleApplication8
{
classBaza
{
publicint x=7;
publicvoidMetoda()
{
Console.WriteLine("Metoda din clasabaza");
}
}
classDerivata:Baza
{
newpublicint x=10;
newpublicvoidMetoda()
{
base.Metoda();
Console.WriteLine("s-a accesatmetoda din derivata care a apelatmetoda din bazasicampul din baza"+base.x);
}
}
classProgram
{
staticvoid Main()
{
Derivata d=newDerivata();
d.Metoda();
Console.ReadLine();
}
}
}
2.3.7 Polimorfismul
Polimorfismul, drept concept fundamental al OOP, permite un comportament diferențiat al unei entități. Este caracteristica unei variabile de a putea referi obiecte de tipuri diferite.
Din punct de vedere al moștenirii, polimorfismul permite invocarea metodelor derivate cu ajutorul referințelor la clasa de baza.
Conversia referințelor
Putem transforma o referința la clasa derivata într-o referința la clasa de baza, prin intermediul operatorului de conversie.
Exemplu:
Using System;
usingSystem.Collections.Generic;
namespace ConsoleApplication9
{
classBaza
{
publicvoidAfis()
{
Console.WriteLine("Afis() din Baza");
}
}
classDerivata : Baza
{
newpublicvoidAfis()
{
Console.WriteLine("Afis() din derivata");
}
}
classProgram
{
staticvoid Main()
{
Derivata D = newDerivata();
D.Afis();
Baza B = (Baza)D;//s-a realizatconversiareferinteicatreclasa de baza;
B.Afis();
Console.ReadLine();
}
}
}
Metode virtuale
O referința la un obiect din clasa de baza nu poate invoca o metoda definita cu new.
Pentru realizarea polimorfismului bazat pe moștenire, trebuie ca in clasa de baza sa fie definit membrul virtual, iar la redefinirea membrului cu aceeași signatura in clasa derivata se adaugă override.
}
Pentru un lant de derivare pornind de la clasa de baza cu definirea unei metode virtuale, in clasele derivate putem sau nu sa redefinim metodele respective.
Exemplu:
using System;
usingSystem.Threading.Tasks;
namespace ConsoleApplication10
{
classA1
{
virtualpublicvoidAfis()
{
Console.WriteLine("Afis() din A1");
}
}
classA2 : A1
{
}
classA3 : A2
{
overridepublicvoidAfis()
{
Console.WriteLine("Afis() din A3");
}
}
classA4 : A3
{
}
classProgram
{
staticvoid Main()
{
A1 a = newA2();
a.Afis();
a = newA3();
a.Afis();
a = newA4();
a.Afis();
Console.ReadLine();
}
}
}
Observații:
Membrii cum ar fi: metode, proprietăți, evenimente, indexatori pot fi declarați virtual.
Câmpurile nu pot fi declarate virtual.
Metodele override nu pot avea alt modificator de acces decât cel al metodei virtual.
Metodele statice nu pot fi redefinite.
Modificatorul sealed
Plasat în fața unei metode sau a unei proprietății interzice moștenirea acestora în derivare (împiedica redefinirea lor).
Utilitatea polimorfismului se rezumă la posibilitatea utilizări unei colecții de clase care derivă dintr-o clasă de bază, clase care utilizează metode declarate virtuale în clasa de bază.
Elementele Limbajului SQL
SQL (Structured Query Language) este în prezent, unul din cele mai puternice limbaje structurate pentru interogarea bazelor de date relaționale.
Este un limbaj neprocedural și declarativ, deoarece utilizatorul descrie ce date vrea să obțină, fără a fi nevoie să stabilească modalitățile de a ajunge la datele respective. Nu poate fi considerat un limbaj de programare sau unul de sistem, ci mai degrabă face parte din categoria limbajelor de aplicații, fiind orientat pe mulțimi. Foarte frecvent, este utilizat în administrarea bazelor de date client/server, aplicația client fiind cea care generează instrucțiunile SQL. Lansat inițial de IBM. Standardizat prima dată de ANSI, apoi ISO
Instrucțiunile SQL pot fi grupate în:
instrucțiuni de definire a datelor, care permit descrierea structurii BD –Limbajul DDL
instrucțiuni de manipulate a datelor: adaugă, șterge, modifică înregistrări –Limbajul DML
instrucțiuni de selecție a datelor, care permit consultarea BD instrucțiuni de procesare a tranzacțiilor –Limbajul DQL
instrucțiuni de control al tranzacțiilor- Limbajul TCL
Permisiunea asupra datelor-DCL
În limbajul SQL standardizat de ISO nu se folosesc termenii formali de relație, atribut, tuplu, ci tabel, coloană, rând.
Operații de baza in SQL
SELECT
SELECT este format din doua clauze:
SELECT[DISTINCT] in cadrul acesteia se specifica numele coloanelor ce trebuie returnate.
Pentru a selecta toate coloanele se poate folosi simbolul asterisc *. Cuvântul cheie DISTINCT
adăugat după cuvântul cheie SELECT elimină rândurile duplicat din rezultatele înregistrării.
FROM in care sunt specificate tabelele din care extragem .
Exemple:
SELECT nume, prenume, functie FROM angajati
Semnificație: Selectează nume, prenume, functie pentru toate înregistrările din tabelul angajati.
SELECT nume, salariu FROM angajat WHERE salariu BETWEEN 2000 AND 2500
Semnificație: Selectează numele si salariu angajatilor pentru care salariu este cuprins intre 2000 si 2500
SELECT nume, functie, salariu, n_dept FROM angajat WHERE functie = 'director'
OR (functia = 'secretar' AND n_dept = 10);
Semnificație: Se afișează toți angajați (nume, functie, salariu, departament) din tabelul angajati care au funcția director sau secretar in departamentul 10.
INSERT
Are drept rezultat inserarea de rânduri noi intr-un tabel.
Variante:
inserează un singur rând
INSERT INTO nume_tabel [(lista_de_coloane)] VALUES (lista_de_valori);
Observație:
– lista de coloane este opțională, in cazul in care exista este încadrata in paranteze.
– cuvântul cheie NULL poate fi folosit în lista de valori pentru specificarea unei valori nule
pentru o coloană
Baze de date relaționale
O baza de date este o colecție de informații ce descriu un univers o afacere (BD).
Operațiile care se executa asupra bazei de date se fac cu ajutorul unui Sistem de gestiune a bazelor de date( SGBD).
Intr-o baza de date relaționala datele sunt memorate in tabele. Fiecare rând dintr-un tabel reprezintă o înregistrare, fiecare coloana reprezintă un câmp, un atribut.
Tabelele au câmpuri unice după care se identifica fiecare înregistrare in mod unic, aceste câmpuri poarta numele de chei primare. Corespondenta unei chei primare dintr-un tabel in altul, poarta numele de cheie străina. Prin intermediul acestor doua tipuri de câmpuri se realizează relațiile intre tabele.
Etapele necesare proiectării unei baze de date relaționale sunt:
Identificarea entităților(tabelelor), atributelor(câmpurilor) si a relațiilor dintre ele.
Construirea modelului conceptual ( diagrama entitate- relație).
Normalizarea bazei de date, pentru înlăturarea datelor redundante, păstrarea integrității bazei de date, înlăturarea tuturor greșelilor
Capitolul III. Aplicația de gestiune a unei Farmacii
Scenariu
Aplicația își propune sa gestioneze corect bunurile existente intr-o farmacie. Prin bunuri înțelegem medicamente și preparate.
Păstrarea medicamentelor, înregistrarea clienților, evidența clienților, realizare vânzărilor și toate operațiile care au loc presupun activitatea de gestionare.
Scopul proiectului este de a permite:
– adăugarea, modificarea sau ștergerea medicamentelor
– adăugarea, modificarea sau ștergerea clienților
– eliberarea de medicamente pe baza rețetelor
– emiterea de bonuri
– efectuarea de tranzacții
Farmacia primește două tipuri de rețete: compensate si necompensate.
Medicamentele pot sa fie: sintetice, nesintetice și semisintetice.
Farmacia a încheiat contracte cu mai mulți producători care au fost înregistrați in baza de date. Farmacistul incarna medicamentele in baza de date sau modifica stocul si/sau prețul. In cazul in care un medicament este scos de pe piața îl șterge din baza de date.
Medicamentele pot sa aibă o consistenta solida, lichida sau gazoasa. Ele sunt recomandate de emitent (cabinet medicale) intr-o anumita doza.
Rețeta este documentul medical pe care doctorul îl emite către farmacist pentru a elibera medicamente.
Farmacistul va înregistra datele de pe rețeta, inclusive cele ale clientului apoi va elibera medicamentele si bonul de casa.
Baza de date a aplicației
Baza de date va conține informații despre:
Medicamente
un cod de înregistrare
Denumire
Producător
Tipul de substanțe pe care îl conțin (natural, sintetice, semisintetice)
Modul in care se găsește substanța (solida, lichida, gazoasa)
Cantitatea de medicament
Prețul
Clienți
Un cod de înregistrare
Nume
Prenume
Data nașterii
Retete
Codul rețetei
Emitentul
Data de emitere
Tipul rețetei care poate fi compensate/necompensat
Localitate cabinet medical
Vânzările
Codul rețetei pentru care se efectuează vânzarea
Codul medicamentului
Cantitatea
Doza in care se vinde
Bonurile
Codul clientului pentru care se emite bonul
Codul rețetei
Totalul de plata
Data de emitere
Aplicația dezvoltată trebuie să permită:
Introducerea datelor.
Se permite introducerea de medicamente, pentru fiecare medicament introdus se completează mai multe câmpuri.
Se permite introducerea de clienți, adăugarea unui nou client se face în momentul în care se face o vânzare in baza unei rețete( datele existente pe rețeta vor fi memorate in baza de de date)
Pentru adăugarea unui nou client se completează mai multe câmpuri.
Editarea datelor.
Se permite editarea medicamentelor,al clienților si datelor de pe rețeta daca au fost cumva greșit introduse.
Înregistrarea unei vânzări implică automat completarea datelor cu privire la vânzări, iar în cazul în care vânzarea este făcută în baza unei rețete se completează câmpurile necesare.
Eliberarea bonului se va face ținând cont de tipul rețetei daca este sau nu compensata.
Modelul conceptual este creat pornind de la aceste entități si caracteristicile lor.
Proiectarea la nivel logic( schema relaționala) va cuprinde următoarele tabele:
MEDICAMENT(cod_m, denumire, producător, nat_substanta,nat_excipient,stoc,pret )
CLIENT(cod_client, nume, prenume,data_nasterii)
VANZARE(cod_reteta, cod_m, cantitate, doza)
RETETA(cod_reteta, cod_client, emitent, localitate, data_eliberarii, tip_reteta)
BON(cod_reteta, cod_client, total, data_emitere)
Realizarea acestor s-a făcut in Visual C# 2010, prin crearea unei noi baze de date cu numele farmacie.mdf
Structura tabelelor este următoarea:
Implementarea aplicației si funcționalitățile acesteia
Limbaj C# si Limbajul SQL stau la baza acestei aplicații. Limbajul C# fiind un limbaj Visual, orientat pe obiect pune la dispoziție o gama diversa de de controale in mediul sau Visual. Realizarea interfeței este facilitata de existenta acestora. In spatele lor se regăsesc metode cu codul necesar realizări diverselor operații.
Intrucât este o aplicație care gestionează o baza de date are nevoie de un limbaj de manipulare a acesteia. Limbajul folosit este SQL, care permite o portabilitate in Visual C#.
După crearea bazei de date descrisa mai s-a realizat o conexiune la aceasta si a fost conceput formularul cu care pornește aplicația.
Formularul de pornirea a aplicației Pornire.cs
Meniul construit prin intermediul controller-ului MenuStrip are următoarele opțiuni: Fisier, Medicamente, Clienti, Retete, Vanzari si Inchidere.
Accesarea tab-ului Fisier pune la dispoziție următoarele alternative:
Alegând opțíunea Clienti se apelează metoda Click :
private void clientiToolStripMenuItem1_Click(object sender, EventArgs e)
{
new Clienti().Show();
}
ce permite afișarea unui nou formular Clienti.cs cu structura:
Formularul are un obiect DataGridView construit pe baza tabelului Client, un buton care exporta datele in format pdf si un buton de închidere. Codul care se găsește sub ambele butoane se regăsește mai jos:
Pentru butonul de Inchidere
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
Pentru butonul Exporta PDF
public void exportGridToPdf(DataGridView dgw, string filename)
{
BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.EMBEDDED);
PdfPTable pdftable = new PdfPTable(dgw.Columns.Count);
pdftable.DefaultCell.Padding = 3;
pdftable.WidthPercentage = 100;
pdftable.HorizontalAlignment = Element.ALIGN_LEFT;
pdftable.DefaultCell.BorderWidth = 1;
iTextSharp.text.Font text = new iTextSharp.text.Font(bf, 10, iTextSharp.text.Font.NORMAL);
foreach (DataGridViewColumn column in dgw.Columns)
{
PdfPCell cell = new PdfPCell(new Phrase(column.HeaderText, text));
cell.BackgroundColor = new iTextSharp.text.BaseColor(240, 240, 240);
pdftable.AddCell(cell);
}
foreach (DataGridViewRow row in dgw.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
pdftable.AddCell(new Phrase(cell.Value.ToString(), text));
}
}
var savefiledialoge = new SaveFileDialog();
savefiledialoge.FileName = filename;
savefiledialoge.DefaultExt = ".pdf";
if (savefiledialoge.ShowDialog() == DialogResult.OK)
{
using (FileStream stream = new FileStream(savefiledialoge.FileName, FileMode.Create))
{
Document pdfdoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
PdfWriter.GetInstance(pdfdoc, stream);
pdfdoc.Open();
pdfdoc.Add(pdftable);
pdfdoc.Close();
stream.Close();
MessageBox.Show("Raportul a fost salvat cu succes!");
//pdfdoc.OpenDocument();
}
}
}
private void button1_Click(object sender, EventArgs e)
{
exportGridToPdf(dataGridView1, "raport-clienti");
}
Fiecare din următoarele opțiuni funcționează pe baza aceluiași principiu : se creează un obiect DataGridView care extrage datele din tabelul adecvat le afișează si permite realizarea exportului in format pdf pe baza metodelor implementate in mod asemănător celor de mai sus in spatele celor doua butoane: Exporta PDF si Inchidere
Tabul Medicamente pune la dispoziție următoarele opțiuni:
Accesând Adăugare ( control-ul ToolStripMenuItem) invocam evenimentul Click cu metoda de mai jos :
private void adaugareToolStripMenuItem_Click(object sender, EventArgs e)
{
new Adaugare_medicament().Show();
}
se permite deschiderea formularului Adaugare_medicament.cs. Acesta este cel ce realizeaza operația de adăugare a unui medicament nou in stocul farmaciei. Se completează câmpurile cu datele cerute.
Prin apăsarea butonului Adaugare se apelează metoda cu codul de mai jos:
private void b1_Click(object sender, EventArgs e)
{
string insertsql;
insertsql = "insert into medicament(cod_m, denumire, producator, nat_substanta,nat_excipient,stoc, pret) values('" + t1.Text + "','" + t2.Text + "','" + cb1.Text + "','" + cb2.Text + "','" + cb3.Text + "'," + t3.Text + "," + t4.Text + ")";
try
{
SqlCommand cmd = new SqlCommand(insertsql, co);
cmd.ExecuteNonQuery();
t1.Text = "";
t2.Text = "";
t3.Text = "";
t4.Text = "";
le.Text = "Adaugare cu succes!!!!! ";
le.Visible = true;
}
catch (System.Data.SqlClient.SqlException)
{
le.Text = "Atentie nu se poate adauga cheie primara duplicata sau un tip de data necorespunzator!!!!! ";
le.Visible = true;
t1.Text = "";
t2.Text = "";
t3.Text = "";
t4.Text = "";
}
}
Conectarea se realizeaza prin secventa plasata in constructorul clasei:
public Adaugare_medicament()
{
InitializeComponent();
string s = " Data Source=.\\SQLEXPRESS;AttachDbFilename=" + System.IO.Path.GetFullPath("farmacie.mdf") + ";Integrated Security=True;Connect Timeout=30;User Instance=True";
MessageBox.Show(s);
co = new SqlConnection(s);
co.Open();
le.Visible = false;
}
La alegerea opțiuni Modificare se apelează metoda ce deschide formularul Modificare_m.cs ce permite selectarea codului de medicament pentru care dorim modificarea stocului/ prețului.
In spatele controlului ComboBox ( cb1) se creează legătura ce selectează codurile tuturor medicamentelor existente in tabelul Medicament:
public Modificare_m()
{
InitializeComponent();
string s = " Data Source=.\\SQLEXPRESS;AttachDbFilename=" + System.IO.Path.GetFullPath("farmacie.mdf") + ";Integrated Security=True;Connect Timeout=30;User Instance=True";
MessageBox.Show(s);
co = new SqlConnection(s);
co.Open();
string selectSQL = "SELECT cod_m FROM medicament";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "medicament");
foreach (DataRow r in ds.Tables["medicament"].Rows)
{
cb1.Items.Add(r[0]);
}
if (cb1.Items.Count > 0)
cb1.SelectedIndex = 0;
}
Evenimentul de selecție din acest control ComboBox este setat astfel încât sa apeleze metoda ce găsește datele corespondente codului de medicament selectat, folosim următorul cod:
private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
string t = (string)cb1.SelectedItem;
if (t == null || t.Length == 0)
{
return;
}
string selectSQL = "SELECT * FROM medicament WHERE cod_m='" + t + "'";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "medicament");
DataRow r = ds.Tables["medicament"].Rows[0];
l1.Text = Convert.ToString(r["denumire"]);
l2.Text = Convert.ToString(r["producator"]);
l3.Text = Convert.ToString(r["nat_substanta"]);
l4.Text = Convert.ToString(r["nat_excipient"]);
t1.Text = Convert.ToString(r["stoc"]);
t2.Text = Convert.ToString(r["pret"]);
l1.Visible = true;
l2.Visible = true;
l3.Visible = true;
l4.Visible = true;
l5.Visible = true;
l6.Visible = true;
t1.Visible = true;
t2.Visible = true;
cb1.Enabled = false;
}
La apăsarea butonului Modificare prin evenimentul Click se apelează metoda cu codul următor:
private void b1_Click_1(object sender, EventArgs e)
{
string sql = "update medicament set stoc= " + t1.Text + ", pret=" + t2.Text + " where cod_m='"+cb1.Text+"'";
SqlCommand cmd = new SqlCommand(sql, co);
cmd.ExecuteNonQuery();
le.Text = "Modificare cu succes a datelor despre medicament!!!!! ";
le.Visible = true;
}
Se realizează practic o actualizare cu cod al Limbajului SQL.
La selectarea opțiunii Ștergere, controlul ToolStripMenuItem apelează metoda ce afișează formularul Stergere_m.cs:
In spatele control-ului ComboBox (cb1) s-a creat legătura de selecție a codurilor de medicamente existente in table, după modelul descris mai sus la opearația de modificare.
Evenimentul de selecție a unui element apelează metoda de mai jos ce creează corespondenta dintre codul medicamentului si câmpurile pe care le dorim afișate:
private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
string t = (string)cb1.SelectedItem;
if (t == null || t.Length == 0)
{
return;
}
string selectSQL = "SELECT * FROM medicament WHERE cod_m='" + t + "'";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "medicament");
DataRow r = ds.Tables["medicament"].Rows[0];
l1.Text = Convert.ToString(r["denumire"]);
l2.Text = Convert.ToString(r["producator"]);
l3.Text = Convert.ToString(r["nat_substanta"]);
l4.Text = Convert.ToString(r["nat_excipient"]);
l5.Text = Convert.ToString(r["stoc"]);
l6.Text = Convert.ToString(r["pret"]);
l1.Visible = true;
l2.Visible = true;
l3.Visible = true;
l4.Visible = true;
l5.Visible = true;
l6.Visible = true;
}
Apăsând butonul Ștergere, evenimentul click apelează metoda ce permite ștergerea medicamentului printr-o secvență SQL:
private void button1_Click(object sender, EventArgs e)
{
string deletesql = "delete from medicament where cod_m='" + cb1.Text + "'";
try
{
SqlCommand cmd = new SqlCommand(deletesql, co);
cmd.ExecuteNonQuery();
le.Text = "Stergerea medicamentului efectuata!!!";
l1.Visible = true;
l2.Visible = true;
l3.Visible = true;
l4.Visible = true;
l5.Visible = true;
l6.Visible = true;
le.Visible = true;
}
catch (System.Data.SqlClient.SqlException)
{ le.Text = "Nu se poate face stergerea medicamentului "; }
le.Visible = true;
}
Fila Clienti are următoarele opțiuni:
Selectarea opțiunii Adăugare ( ToolStripMenu) prin evenimentul click invoca metoda ce afișează formularul de adăugare a unui nou client:
private void adaugareToolStripMenuItem_Click(object sender, EventArgs e)
{
new Adaugare_medicament().Show();
}
După completarea datelor necesare unui nou client pentru Adăugarea acestuia apăsam butonul corespunzător care prin intermediul evenimentului Click apelează metoda de mai jos care realizează operația:
private void b1_Click(object sender, EventArgs e)
{
string insertsql;
//MessageBox.Show(Convert.ToString(dt1.Text));
insertsql = "insert into client(cod_client, nume, prenume, data_nastere) values('" + t1.Text + "','" + t2.Text + "','" + t3.Text + "','" + Convert.ToDateTime(dt1.Text) + "')";
try
{
SqlCommand cmd = new SqlCommand(insertsql, co);
cmd.ExecuteNonQuery();
t1.Text = "";
t2.Text = "";
t3.Text = "";
//t4.Text = "";
//tb55.Text = "";
//tb66.Text = "";
le.Text = "Adaugare cu succes!!!!! ";
le.Visible = true;
}
catch (System.Data.SqlClient.SqlException)
{
le.Text = "Atentie nu se poate adauga cheie primara duplicata sau un tip de data necorespunzator!!!!! ";
le.Visible = true;
t1.Text = "";
t2.Text = "";
t3.Text = "";
//t4.Text = "";
// tb55.Text = "";
// tb66.Text = "";
}
}
Butonul de Închidere apelează:
private void b2_Click(object sender, EventArgs e)
{
this.Close();
}
Opțiunea Modificare ( ToolStripMenu) prin evenimentul Click apelează metoda ce deschide formularul Modificare_c.cs .
private void modificareToolStripMenuItem_Click(object sender, EventArgs e)
{
new Modificare_m().Show();
}
In spatele control-ului ComboBox este creata legătura cu codurile de client existente in tabelul Client. Secvența de cod este plasata in constructorul corespunzător clasei.
public Modificare_c()
{
InitializeComponent();
string s = " Data Source=.\\SQLEXPRESS;AttachDbFilename=" + System.IO.Path.GetFullPath("farmacie.mdf") + ";Integrated Security=True;Connect Timeout=30;User Instance=True";
// MessageBox.Show(s);
co = new SqlConnection(s);
co.Open();
string selectSQL = "SELECT cod_client FROM client";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "client");
foreach (DataRow r in ds.Tables["client"].Rows)
{
cb1.Items.Add(r[0]);
}
if (cb1.Items.Count > 0)
cb1.SelectedIndex = 0;
}
Evenimentul de selecție atașat ComboBox-ului cb1, apelează metoda ce asociază codului de client selectat datele corespondente in table: nume, prenume, data_nasterii.
private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
string t = (string)cb1.SelectedItem;
if (t == null || t.Length == 0)
{
return;
}
string selectSQL = "SELECT * FROM client WHERE cod_client='" + t + "'";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "client");
DataRow r = ds.Tables["client"].Rows[0];
t1.Text = Convert.ToString(r["nume"]);
t2.Text = Convert.ToString(r["prenume"]);
dt1.Text = Convert.ToString(r["data_nastere"]);
l1.Visible = true;
l2.Visible = true;
l3.Visible = true;
t1.Visible = true;
t2.Visible = true;
dt1.Visible = true;
}
Aceste câmpuri pot fi modificate. Înregistrarea in baza de date a modificărilor efectuate se face prin declanșarea evenimentului Click asociat butonului Modificare. Acest eveniment apelează metoda următoare:
private void b1_Click(object sender, EventArgs e)
{
string sql = "update client set nume= '" + t1.Text + "', prenume='" + t2.Text + "',data_nastere=' "+Convert.ToDateTime(dt1.Text)+"' where cod_client='" + cb1.Text + "'";
SqlCommand cmd = new SqlCommand(sql, co);
cmd.ExecuteNonQuery();
le.Text = "Modificare cu succes a datelor despre client!!!!! ";
le.Visible = true;
//cb1.Enabled = true;
}
Metoda care folosește o secvența a Limbajului SQL pentru actualizarea datelor.
Tot in meniul Clienti avem opțiunea de Stergere. Execuția acesteia determina evenimentul Click, asociat control-ului ToolStripMenuItem sa apeleze metoda ce deschide formularul corespunzător operației de ștergere a unui client, Stergere_c.cs.
private void stergereToolStripMenuItem1_Click(object sender, EventArgs e)
{
new Stergere_c().Show();
}
Formularul permite selectarea codului de client pe care dorim să îl ștergem. In spatele ComboBox-ului asociat avem codul ce asociază coloana cod_client din tabelul Clienti.
public Stergere_c()
{
InitializeComponent();
string s = " Data Source=.\\SQLEXPRESS;AttachDbFilename=" + System.IO.Path.GetFullPath("farmacie.mdf") + ";Integrated Security=True;Connect Timeout=30;User Instance=True";
MessageBox.Show(s);
co = new SqlConnection(s);
co.Open();
string selectSQL = "SELECT cod_client FROM client";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "client");
foreach (DataRow r in ds.Tables["client"].Rows)
{
cb1.Items.Add(r[0]);
}
if (cb1.Items.Count > 0)
cb1.SelectedIndex = 0;
}
Evenimentul de selecție a unui element din lista ComboBox-ului apelează metoda ce găsește in tabelul Client informațiile atașate fiecărui client:
private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
string t = (string)cb1.SelectedItem;
if (t == null || t.Length == 0)
{
return;
}
string selectSQL = "SELECT * FROM client WHERE cod_client='" + t + "'";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "client");
DataRow r = ds.Tables["client"].Rows[0];
l1.Text = Convert.ToString(r["nume"]);
l2.Text = Convert.ToString(r["prenume"]);
dt1.Text = Convert.ToString(r["data_nastere"]);
l1.Visible = true;
l2.Visible = true;
l3.Visible = true;
dt1.Visible = true;
dt1.Enabled = true;
le.Visible = false;
}
Daca dorim intradevăr ștergerea respectivului client, prin apăsarea butonului Stergere, evenimentul Click apelează metoda:
private void b1_Click(object sender, EventArgs e)
{
string deletesql = "delete from client where cod_client='" + cb1.Text + "'";
try
{
SqlCommand cmd = new SqlCommand(deletesql, co);
cmd.ExecuteNonQuery();
le.Text = "Stergerea clientului efectuata!!!";
l1.Visible = false;
l2.Visible = false;
l3.Visible = false;
dt1.Visible = false;
le.Visible = true;
}
catch (System.Data.SqlClient.SqlException)
{ le.Text = "Nu se poate face stergerea medicamentului "; }
le.Visible = true;
}
Aceasta conține secvența de ștergere a Limbajului SQL.
Meniul Retete are următoarele opțiuni:
Alegere opțiuni Eliberare Reteta, apelează metoda ce afișează formularul Eliberare_reteta.cs, prin intermediul evenimentului Click:
private void eliberareRetetaToolStripMenuItem_Click(object sender, EventArgs e)
{
new Eliberare_reteta().Show();
}
Datele rețetei primite de la client se completează in acest formular pentru o buna evidenta. Codul rețetei trebuie sa fie unic, codul clientului se alege din lista CoboBox-ului asociat. In spatele acestuia, constructorul clasei are asociat codul de legătura cu tabelul client.
public Eliberare_reteta()
{
InitializeComponent();
string s = " Data Source=.\\SQLEXPRESS;AttachDbFilename=" + System.IO.Path.GetFullPath("farmacie.mdf") + ";Integrated Security=True;Connect Timeout=30;User Instance=True";
//MessageBox.Show(s);
co = new SqlConnection(s);
co.Open();
string selectSQL = "SELECT cod_client FROM client";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "client");
foreach (DataRow r in ds.Tables["client"].Rows)
{
cb1.Items.Add(r[0]);
}
if (cb1.Items.Count > 0)
cb1.SelectedIndex = 0;
Automat selecția codului de client, prin acest eveniment apelează metoda ce asociază datele corespondente din tabelul Client.
După completarea acestor date, evenimentul Click asociat butonului Adaugare Reteta, apelează metoda următoare ce inserează in baza de date noua rețeta si face vizibile șapte noi controale.
private void b1_Click(object sender, EventArgs e)
{
string insertsql;
insertsql = "insert into reteta(cod_reteta, cod_client, emitent, localitate,tip_reteta,dat_eliberarii) values('" + t1.Text + "','" + cb1.Text + "','" + t2.Text + "','" + t3.Text + "','" + cb2.Text + "','" + Convert.ToDateTime(dt1.Text) + "')";
try
{
SqlCommand cmd = new SqlCommand(insertsql, co);
cmd.ExecuteNonQuery();
// t1.Text = "";
// t2.Text = "";
//t3.Text = "";
le.Text = "Adaugare cu succes a retetei!!!!! ";
t1.Enabled = false;
t2.Enabled = false;
t3.Enabled = false;
cb1.Enabled = false;
cb2.Enabled = false;
dt1.Enabled = false;
t1.Enabled = false;
le.Visible = true;
//l1.Visible = true;
l2.Visible = true;
cb3.Visible = true;
t4.Visible = true;
t5.Visible = true;
l4.Visible = true;
l5.Visible = true;
b2.Visible = true;
}
catch (System.Data.SqlClient.SqlException)
{
le.Text = "Atentie nu se poate adauga exista reteta sau un tip de data necorespunzator!!!!! ";
le.Visible = true;
t1.Text = "";
t2.Text = "";
t3.Text = "";
}
string den = "SELECT * FROM medicament WHERE denumire='" + cb3.Text + "'";
SqlCommand cmd1 = new SqlCommand(den, co);
SqlDataAdapter adapter1 = new SqlDataAdapter(cmd1);
DataSet ds1 = new DataSet();
adapter1.Fill(ds1, "medicament");
DataRow r1 = ds1.Tables["medicament"].Rows[0];
l1.Text = Convert.ToString(r1["cod_m"]);
}
Cel de-al doilea este ComboBox căruia in constructorul clasei i-au fost asociate legăturile cu toate medicamentele existente in tabelul Medicament.
selectSQL = "SELECT denumire FROM medicament";
cmd = new SqlCommand(selectSQL, co);
adapter = new SqlDataAdapter(cmd);
ds = new DataSet();
adapter.Fill(ds, "medicament");
foreach (DataRow r1 in ds.Tables["medicament"].Rows)
{
cb3.Items.Add(r1[0]);
}
if (cb3.Items.Count > 0)
cb3.SelectedIndex = 0;
Evenimentul de selecție determina apelul metodei:
private void cb3_SelectedIndexChanged(object sender, EventArgs e)
{
string den = "SELECT * FROM medicament WHERE denumire='" + cb3.Text + "'";
SqlCommand cmd1 = new SqlCommand(den, co);
SqlDataAdapter adapter1 = new SqlDataAdapter(cmd1);
DataSet ds1 = new DataSet();
adapter1.Fill(ds1, "medicament");
DataRow r1 = ds1.Tables["medicament"].Rows[0];
l1.Text = Convert.ToString(r1["cod_m"]);
}
Avem posibilitatea sa adăugam pe rețeta medicamente existente in farmacie însoțite de cantitate si stoc. Prin apăsarea butonului Adăugare Medicament, evenimentul Click apelează următoarea metoda:
private void b2_Click(object sender, EventArgs e)
{
string ins;
ins = "insert into vanzare( cod_reteta, cod_m, cantitate, doza) values('" + t1.Text + "','" + l1.Text + "'," + t4.Text + "," + t5.Text + ")";
try
{
SqlCommand cmd = new SqlCommand(ins, co);
cmd.ExecuteNonQuery();
// t1.Text = "";
t4.Text = "";
t5.Text = "";
le.Text = "Adaugare cu succes!!!!! ";
le.Visible = true;
string selectSQL = "SELECT vanzare.cod_m, denumire, cantitate, doza,pret FROM vanzare, medicament where medicament.cod_m=vanzare.cod_m and medicament.cod_m='"+l1.Text+"' and cod_reteta='" + t1.Text + "' ";
/*and cod_reteta='"+t1.Text+"'*/
SqlCommand cmd2 = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd2);
DataSet ds = new DataSet();
adapter.Fill(ds, "medicament");
foreach (DataRow r in ds.Tables["medicament"].Rows)
{
l11.Text += r["cod_m"] + "\n" + "––––––" + "\n";
l12.Text += r["denumire"] + "\n" + "––––––" + "\n";
l13.Text += r["pret"] + "\n" + "––––––" + "\n";
a = Convert.ToInt32(r["pret"]);
}
DataSet ds1 = new DataSet();
adapter.Fill(ds1, "vanzare");
foreach (DataRow r1 in ds1.Tables["vanzare"].Rows)
{
l14.Text += r1["cantitate"] + "\n" + "–––––" + "\n";
l15.Text += r1["doza"] + "\n" + "–––––" + "\n";
b = Convert.ToInt32(r1["cantitate"]);
}
t = t + a*b;
// MessageBox.Show(Convert.ToString(t));
}
catch (System.Data.SqlClient.SqlException)
{
le.Text = "Atentie nu se poate adauga medicament existenta sau un tip de data necorespunzator!!!!! ";
le.Visible = true;
// t1.Text = "";
t4.Text = "";
t5.Text = "";
}
}
In momentul adăugări unui medicament o data publică t calculează prețul total al medicamentelor prin înmulțirea cantității introduse cu prețul asociat medicamentului in tabelul Medicament, acest total efectuat v-a fi introdus pe bonul emis si înregistrat in tabelul Bon.
Adăugarea unui medicament determina inserarea acestuia in tabela de Vanzare însoțit de codul rețetei, cantitatea și doza în care se administrează.
Butonul Finalizare Adaugare Medicamente, prin evenimentul Click, apelează metoda ce inserează datele bonului fără a completa câmpul data_emiterii:
private void button1_Click_1(object sender, EventArgs e)
{
string ins;
ins = "insert into bon( cod_reteta, cod_client, total) values('" + t1.Text + "','" + cb1.Text + "'," + t + ")";
try
{
SqlCommand cmd = new SqlCommand(ins, co);
cmd.ExecuteNonQuery();
// t1.Text = "";
//t4.Text = "";
// t5.Text = "";
le.Text = "Adaugare cu succes pe bon de vanzare !!!!! ";
le.Visible = true;
this.Close();
}
catch (System.Data.SqlClient.SqlException)
{
le.Text = "Atentie nu se pot adauga pe bon spre vanzare!!!!! ";
le.Visible = true;
// t1.Text = "";
//t4.Text = "";
//t5.Text = "";
}
}
Din meniul Retete, opțiunea Modificare Reteta, prin evenimentul Click asociat ToolMenuStripItem, apelează metoda ce afișează formularul Modificare_r.cs
private void modificareRetetaToolStripMenuItem_Click(object sender, EventArgs e)
{
new Modificare_r().Show();
}
Acest formular permite modificarea datelor, despre rețeta. Primul control ComboBox are asociat in constructorul clasei, codul rețetei din tabelul Reteta:
public Modificare_r()
{
InitializeComponent();
string s = " Data Source=.\\SQLEXPRESS;AttachDbFilename=" + System.IO.Path.GetFullPath("farmacie.mdf") + ";Integrated Security=True;Connect Timeout=30;User Instance=True";
MessageBox.Show(s);
co = new SqlConnection(s);
co.Open();
string selectSQL = "SELECT cod_reteta FROM reteta";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "reteta");
foreach (DataRow r in ds.Tables["reteta"].Rows)
{
cb1.Items.Add(r[0]);
}
if (cb1.Items.Count > 0)
cb1.SelectedIndex = 0;
}
La evenimentul de selecție asociat acestuia, se apelează metoda ce realizează corespondenta cu informațiile despre rețeta existente in tabelul Reteta:
private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
string t = (string)cb1.SelectedItem;
if (t == null || t.Length == 0)
{
return;
}
string selectSQL = "SELECT * FROM reteta WHERE cod_reteta='" + t + "'";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "reteta");
DataRow r = ds.Tables["reteta"].Rows[0];
l1.Text = Convert.ToString(r["cod_client"]);
/*
l2.Text = Convert.ToString(r["prenume"]);
*/
t1.Text = Convert.ToString(r["emitent"]);
t2.Text = Convert.ToString(r["localitate"]);
cb2.Text = Convert.ToString(r["tip_reteta"]);
dt1.Text = Convert.ToString(r["dat_eliberarii"]);
cb2.Visible = true;
//l2.Visible = true;
l3.Visible = true;
t1.Visible = true;
t2.Visible = true;
dt1.Visible = true;
l1.Visible = true;
l4.Visible = true;
l5.Visible = true;
l6.Visible = true;
}
Efectuăm schimbările dorite pentru următoarele câmpuri: producator, emitent, tip_reteta si data_emiterii:
Prin apăsarea butonului Modificare, evenimentul Click asociat apelează metoda ce actualizează informațiile din baza de date:
private void b1_Click(object sender, EventArgs e)
{
string sql = "update reteta set emitent= '" + t1.Text + "', localitate='" + t2.Text + "',tip_reteta='"+cb2.Text+"', dat_eliberarii=' " + Convert.ToDateTime(dt1.Text) + "' where cod_reteta='" + cb1.Text + "'";
SqlCommand cmd = new SqlCommand(sql, co);
cmd.ExecuteNonQuery();
le.Text = "Modificare cu succes a datelor despre reteta!!!!! ";
le.Visible = true;
}
Meniul Vanzari pune la dispoziție următoarele opțiuni:
Opțiunea Raport Vânzări, prin evenimentul Click asociat controlului ToolMenuStripItem, apelează metoda ce afișează formularul Raport_vanzari.cs:
private void adaugaToolStripMenuItem_Click(object sender, EventArgs e)
{
new Raport_vanzari().Show();
}
Realizarea acestui raport a fost posibila prin plasarea codului următor in constructorul clasei:
public Raport_vanzari()
{
InitializeComponent();
string s = " Data Source=.\\SQLEXPRESS;AttachDbFilename=" + System.IO.Path.GetFullPath("farmacie.mdf") + ";Integrated Security=True;Connect Timeout=30;User Instance=True";
//MessageBox.Show(s);
co = new SqlConnection(s);
co.Open();
string selectSQL = "SELECT cod_reteta, cod_m, cantitate, doza FROM vanzare";
/*and cod_reteta='"+t1.Text+"'*/
SqlCommand cmd2 = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd2);
DataSet ds = new DataSet();
adapter.Fill(ds, "vanzare");
l11.Text += "\n" + "––––––-" + "\n\n";
l12.Text += "\n" + "––––––-" + "\n\n";
l13.Text += "\n" + "––––––-" + "\n\n";
l14.Text += "\n" + "––––––-" + "\n\n";
l14.Text += "\n" + "––––––-" + "\n\n";
foreach (DataRow r in ds.Tables["vanzare"].Rows)
{
l11.Text += r["cod_reteta"] + "\n" + "––––––" + "\n";
l12.Text += r["cod_m"] + "\n" + "––––––" + "\n";
l13.Text += r["cantitate"] + "\n" + "––––––" + "\n";
l14.Text += r["doza"] + "\n" + "–––––" + "\n";
}
}
Opțiunea a doua Emitere Bon, permite emiterea bonului de vânzare si salvarea acestuia in format pdf.
Evenimentul Click asociat controlului ToolMenuStripItem, apelează metoda ce afișează formularul necesar efectuării operațiilor amintite mai sus:
private void vizualizeazaToolStripMenuItem_Click(object sender, EventArgs e)
{
new Eliberare_b().Show();
}
In spatele controlului de tip ComboBox, este creata legătura cu câmpul cod_reteta a tabele Bon pentru care dorim emiterea bonului, lucru posibil prin adăugarea codului următor in constructorul clasei:
public Eliberare_b()
{
InitializeComponent();
string s = " Data Source=.\\SQLEXPRESS;AttachDbFilename=" + System.IO.Path.GetFullPath("farmacie.mdf") + ";Integrated Security=True;Connect Timeout=30;User Instance=True";
MessageBox.Show(s);
co = new SqlConnection(s);
co.Open();
string selectSQL = "SELECT cod_reteta FROM bon";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "bon");
foreach (DataRow r in ds.Tables["bon"].Rows)
{
cb1.Items.Add(r[0]);
}
if (cb1.Items.Count > 0)
cb1.SelectedIndex = 0;
}
Evenimentul de selecție asociat acestui ComboBox, apelează metoda ce realizează corespondenta cu datele din tabela Client, Reteta si Bon:
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
string t = (string)cb1.SelectedItem;
if (t == null || t.Length == 0)
{
return;
}
string selectSQL = "SELECT * FROM bon WHERE cod_reteta='" + t + "'";
SqlCommand cmd = new SqlCommand(selectSQL, co);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "bon");
DataRow r = ds.Tables["bon"].Rows[0];
l1.Text = Convert.ToString(r["cod_client"]);
l3.Text = Convert.ToString(r["total"]);
string t1 = l1.Text;
if (t1 == null || t1.Length == 0)
{
return;
}
MessageBox.Show(l1.Text);
string selectSQL1 = "SELECT * FROM client WHERE cod_client='" + t1 + "'";
SqlCommand cmd1 = new SqlCommand(selectSQL1, co);
SqlDataAdapter adapter1 = new SqlDataAdapter(cmd1);
DataSet ds1 = new DataSet();
adapter1.Fill(ds1, "client");
DataRow r1 = ds1.Tables["client"].Rows[0];
l2.Text = Convert.ToString(r1["nume"]);
l5.Text = Convert.ToString(r1["prenume"]);
string selectSQL2 = "SELECT * FROM reteta WHERE cod_reteta='" + cb1.Text + "'";
SqlCommand cmd2 = new SqlCommand(selectSQL2, co);
SqlDataAdapter adapter2 = new SqlDataAdapter(cmd2);
DataSet ds2 = new DataSet();
adapter2.Fill(ds2, "reteta");
DataRow r2 = ds2.Tables["reteta"].Rows[0];
l4.Text = Convert.ToString(r2["tip_reteta"]);
l1.Visible = true;
l22.Visible = true;
l33.Visible = true;
dt1.Visible = true;
dt1.Enabled = true;
le.Visible = false;
string tc = l4.Text;
if (tc.Length == 10)
p.Text = "RESTUL DE PLATA ESTE O –RETETA ESTE COMPENSATA ";
else
p.Text="RESTUL DE PLATA ESTE "+l3.Text +" RETETA ESTE NECOMPENSATA";
p.Visible = true;
}
Tot in aceasta metoda se verifica tipul Retetei, daca este Compensata, restul de plata al clientului va fi 0.
Pentru emiterea bonului se apăsa butonul Emitere Bon, evenimentul Click asociat acestuia apelează metoda următoarea ce actualizează câmpul data_emitere cu selecția realizata in controlul dt1( DataTimePicker).
private void b1_Click(object sender, EventArgs e)
{
string insertsql;
//MessageBox.Show(Convert.ToString(dt1.Text));
insertsql = "update bon set data_vanzare= '" + Convert.ToDateTime(dt1.Text) + "'";
try
{
SqlCommand cmd = new SqlCommand(insertsql, co);
cmd.ExecuteNonQuery();
l1.Text = "";
l3.Text = "";
le.Text = "Emiterea bonului cu succes!!!!! ";
le.Visible = true;
}
catch (System.Data.SqlClient.SqlException)
{
le.Text = "Atentie nu se poate emite bonul, a fost deja emis sau date incorecte!!!!! ";
le.Visible = true;
l1.Text = "";
l3.Text = "";
}
}
După emiterea bonului acesta poate fi salivat in format pf, prin asocierea metodei evenimentului Click corespunzător butonului Salvare ca bon pdf:
private void emitereBon()
{
var savefiledialoge = new SaveFileDialog();
savefiledialoge.FileName = "bon";
savefiledialoge.DefaultExt = ".pdf";
if (savefiledialoge.ShowDialog() == DialogResult.OK)
{
using (FileStream stream = new FileStream(savefiledialoge.FileName, FileMode.Create))
{
Document document = new Document(PageSize.A6, 10f, 10f, 10f, 0f);
PdfWriter.GetInstance(document, stream);
document.Open();
Paragraph p1 = new Paragraph("Bon reteta");
//p1.Alignment = Element.ALIGN_CENTER;
p1.Font.Size = 16;
Paragraph codReteta = new Paragraph("Cod reteta: " + cb1.SelectedItem.ToString());
Paragraph nume = new Paragraph("Nume client: " + l2.Text);
Paragraph prenume = new Paragraph("Prenume client: " + l5.Text);
Paragraph total = new Paragraph("Pret total: " + l3.Text + " RON");
Paragraph tip = new Paragraph("Tip reteta: " + l4.Text);
document.Add(p1);
document.Add(codReteta);
document.Add(tip);
document.Add(nume);
document.Add(prenume);
document.Add(new Paragraph("__________________________________"));
document.Add(total);
document.Add(new Paragraph("Data emiterii: " + dt1.Value.ToString()));
document.Close();
stream.Close();
MessageBox.Show("Bonul a fost salvat cu succes!");
}
}
}
private void b3_Click(object sender, EventArgs e)
{
emitereBon();
}
Inchiderea aplicației se face din meniul Închidere sau opțiune Inchidere din Fisier.
Concluzii
Aplicația de gestiune a activităților desfășurate in farmacie, este o tema de actualitate care vine in sprijinul tuturor celor care interacționează cu baza de date corespunzătoare. Ea vine in sprijinul angajaților din farmacie dar și a clienților, pentru care timpul de așteptare este evident imbunătățit.
Pe viitor doresc sa îmbunătățesc funcționalitățile acestei aplicații astfel încât sa cuprind o serie de tranzacții ce se pot desfășura online, să implementez programul cardurilor de fidelitate, să integrez tehnologia ASP in construcția aplicației sa facilitez astfel extinderea afacerii in mediul online.
Domeniul de activitate al bazelor de date va cunoaște o continua dezvoltare si extindere, motiv pentru care voi aprofunda acest domeniu pe viitor.
Mediul Visual C# folosit oferă obiecte utile proiectări unei interfețe plăcute. Obiectele de tip control sunt clase care au propriile metode si evenimente asociate.
Limbajul SQL este compatibil cu proiectarea vizuala a aplicației C#.
Bibliografie
Niță, Adrian, Mariana, Niță, Olăroiu, Nicolae, Pintea, Rodica, Sichim, Cristina, Tarasă, Daniela, Tătăran, Mihai (coord.), Lupan, Nușa-Dumitriu (coord.), Jucovschi, Petru (coord.), 2008, Introducere in .Net Framework , Editura Byblos SRL.
Wright, Peter, 2006, Beginning Visual C# 2005 Express Edition: From Novice to Professional.
Chris, Pappas, William, Murray, 2004, C# pentru programarea Web, editura B.I.C. ALL.
Albahari, Ben, 2000, A Comparative Overview of C#, Genamics.
Petzold, Charles, 2003, Programare in Windows cu C#, Editura Teora.
http://docs.oracle.com/javase/tutorial/
Murachs SQL Server 2016 pentru dezvoltatori- Editura Mike Murach & Associates Inc.
http://cursuri.cs.pub.ro/
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: pentru FINALIZAREA STUDIILOR DE CONVERSIE LA PROGRAMELE DE STUDII POSTUNIVERSITARE ÎN INFORMATICĂ Coordonator științific: Prof. univ. Autor:… [304798] (ID: 304798)
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.
