Gestionaremagazinairsoft [610788]
Ministerul Educației Naționale
Universitatea ”OVIDIUS ” Constanța
Facultat ea de Matematică și Informatică
Specializarea Informatică
Constanța 2018
LUCRARE DE LICENȚ A
Coordonator științific,
Lect. Dr. Șerban Cristina
Absolvent: [anonimizat] ”OVIDIUS ” Constanța
Facultat ea de Matematică și Informatică
Specializarea Informatică
Constanța 2018
LUCRARE DE LICENȚ A
Sistem software pentru gestionarea
unui magazin de echipament Airsoft
Coordonator științific,
Lect. Dr. Șerban Cristina
Absolvent: [anonimizat]
3
1 INTRODUCERE
1.1 Contextul temei
Contextul realizării acestei aplicații este al raspândirii jocurilor de tip Airsoft concomitent cu
dezvoltarea tehnologiei și apariția magazinelor de echipament pentru acest joc.
Datorită d ezvoltărilor tehnologice din ultime vreme gestionarea afacerilor a devenit mai
eficient ă. Din ce în ce mai multe magazine își crează software pentru administrarea business -ului,
pentru diverse p rocese economice: stocuri, livrări, personal.
Avându -și originea în Japonia anilor ’50 , datorit ă legilor locale cu privire la armele de foc,
airsoftul este un joc sportiv de simulare a unui conflict cu ajutorul unor replice ale armelor reale ce
folosesc proiectile sferice care nu sunt făcute din metal. Acesta s-a dezvoltat în SUA, fiind o
alternativă la paintball. Pe măsura ce internetul s -a răspăndit pe glob, airsoftul a crescut în
popularitate enorm, mai ales în Europa și în Amer ica. Este prezent și în România, având din ce în ce
mai mulți practicanți, lucrul care a dus la apariția magazinelor de produse Airsoft.
1.2 Motivația
Am ales tema aceasta deaorece sunt pasionat de lucrurile cu aer milităresc. Unul din motive a
fost dorința de a învăța și de a aprofunda procesul de dezvoltare pentru aplicațiile C#. Totodată am
integrat și o bază de date în Access. Este important ca un programator să știe cum să interacționeze
cu o bază de date. El trebuie să înțeleagă cum funcționează atunci când dezvoltă aplica ții.
Ca sistem de operare am ales Microsoft Windows deoarece C# este cel mai folosit limbaj de
progra mare pentru platformele Windows și poate comunica cu o baza de da te Microsoft Access
foarte ușor, prin tehnologia OleDB.
1.3 Enunțul temei
Tema lucrării de faț ă constă în realizarea unei aplicații software pentru administrarea unu i
magazin de echipament Airsoft, folosind limbajul de programare C#, IDE -ul Microsoft Visual
Studio și o bază de date Microsoft A ccess.
1.4 Obiective generale
Obiectivul principal al aceste i aplicații software este gestionarea unui magazin A irsoft,
folosind o aplicație C#, pentru a oferi un grad ridicat de standardizare și eficientizare.
4
Un alt obiectiv este oferirea posibilității unui utilizator de a vizualiza lista de produse.
Totodată, e l poate și să adauge produse noi sau să modifice ori să șteargă produse din cele existente.
Ținănd cont că este vorba de un magazin, un lucru la fel de important este administrarea
comenzilor, putându -se vizualiza, respectiv ad ăuga comenzi.
De asemenea, este necesară vizualizarea unor statistici, cum ar fi cele mai vândute produse
sau profitul lunar ,precum și generarea unor rapoarte baza te pe ele .
1.5 Cerințele sistemului
1.5.1 Cerințe funcț ionale
Vizualizare și m odificare produse: Utilizatorul poate vedea toate produse le. De asemenea el are
posibilitatea de a adăuga,modifica respectiv șterge produse.
Vizualizare și a dăugare comenzi: Un utilizator poate vedea comenzile și conținutul lor. El are și
opțiunea de a adăuga comenzi noi.
Afișare statistici: Sistemul permit e afișarea statisticilor despre vânzări,produse, etc. În plus,
utilizatorul are opțiunea de a salva statisticile într -un fișier PDF.
1.5.2 Cerințe nefuncționale
Utilizabilitate : Aplica ția este bazată pe interfețe grafice astfel încât poate fi utilizată relativ ușor.
Robustețe : Aplicația trebuie să verifice datele care sunt introduse de către utili zator. În cazul în care
formatul lor nu e corect se afișează un mesaj de eroare și i se permite să reintroducă datele.
Performanță: Aplica ția trebuie să răspundă la se lecția unei opțiuni din interfață cât mai rapid. Ea
trebuie și să nu consume prea multă memorie.
1.6 Tehnologii folosite
1.6.1 Visual Studio
Microsoft Visual Studio [1] este un mediu integrat de dezvoltare (IDE în engleză) , fiind un
program ce poate fi folosit în dezvoltarea software -ului. În componența lui intră editorul standard și
depanatorul. Pe lânga acestea Visual Studio include și compilatoare , instrumente ce completează
5
codul (cum ar fi IntelliSense) și multe alte instrumente care ajută la dezvoltarea aplica țiilor.
O solu ție este un container folosit de Visual Studio care conține unul sau mai multe proiecte.
1.6.2 Limbajul C# și .NET Framework
C#[2] este un limbaj de programare orientat pe obiecte. Este similar și superior limbajelor C
și C++. Sintaxa acestuia este relativ simplă și ușor de învățat.
Componenta CLR (Common Language Runtime) este distribuit ă împreună cu limbajul C#,
ea fiind o parte a platformei .NET Framework. Datorită acestei componente , programele devin
portabile, ele putând rula pe diferite dispozitive sau sisteme de operare fără modificări sau cu
modificări minore.
În mod normal, sistemele de operare cele mai utilizate de către programele în C# sunt cele de
tip MS Windo ws. CLR și .NET Framework pot funcționa și pe dispozit ive portabile cum ar fi
tabletele și telefoanele care au sistem de operare Windows(cum ar fi Windows Phone).
1.6.3 iText.Sharp
iText [4] este o librarie care este utiliza ta pentru a genera documente PDF bazate pe data din
fișiere XML sau baze de date. Cu ajutoru l acestei librării se pot edita și documente existente.
iTextSharp este o versiune por tată a iText 5 facută pentru Plaftorma .NET și limbajul C#.
1.6.4 Microsoft Access
Microsoft Access [5] este un SGBD(Sistem de gestiune a bazelor de date). Cu ajutorul
acestora utilizatorul poa te creea și accesa baze de date.
Programul îi permite unei persoane să adauge elemente noi într-un tabel(de exemplu un
produs), să editeze datele care deja sunt în baza de date(cum ar fi prețul unui produs) , sau să ște argă
informații.
El are și posibilitatea de a vizualiza și de a vedea datele în diverse moduri. O bază d e date
Access are 6 componente: tabele, formulare, rapoarte, queries(interogări),macrocomenzi și
module.
6
2 PROIECTARE ȘI IMPLEMENTARE
2.1 Cazuri de utilizare
2.1.1 Caz de utilizare : Adăugare produs
Nume : Adăugare produs
Actor software: Administrator Sistem
Precondiții: Aplicația trebuie să fie funcțională
Postcondiții: Produsul trebuie să fie inserat cu succes în baza de date .
Administrator Sistem Sistem
1. Selectează opțiunea pentru produse 2.Afișare f ormular produse
3. Selectează opțiunea de adăugare produse 4.Afișează componenta pentru introducere date
5.Introduce datele
6. Apasă butonul de confirmare 7. Verifică datele [A1]
8.Afișează modificările în formular
9.Adaugă produsul în baza de date
Flux alternativ:
[A1] : Datele necesare au fost introduse într -un mod eronat (nu respectă constrângerile de integritate)
sau nu au fost introduse deloc.
Este afișat un mesaj care îi descrie utilizatorulu i eroarea, fluxul continu de la pasul 4.
7
2.1.2 Caz de utilizare : Modificare produs
Nume : Modificare produs
Actor software: Administrator Sistem
Precondiții: Aplicația trebuie să fie funcțională și trebuie să fie minim un produs în baza de date .
Postcondiții: Datele produsului sunt modificate cu succes în baza de date.
Administrator Sistem Sistem
1. Selectează opțiunea pentru produse 2.Afișare formular produse
3. Selectează opțiunea de modificare produse 4.Afișează componenta pentru introducere date
5.Introduce datele
6. Apasă butonul de confirmare 7. Verifică datele [A1]
8. Afișează modificările în formular
9.Modifică datele produsului în baza de date
Flux alternativ:
[A1] : Datele necesare au fost introduse într -un mod eronat (nu respectă constrângerile de integritate)
sau nu au fost introduse deloc.
Este afișat un mesaj care îi descrie utilizatorului eroarea, fluxul continu ă de la pasul 4.
2.1.3 Caz de utilizare : Ștergere produs
Nume : Modificare produs
Actor software: Administrator Sistem
Precondiții: Aplicația trebuie să fie funcțională și trebuie să existe minim un produs în baza de date .
Postcondiții: Datele produsului trebuies modificate cu succes în baza de date.
Administrator Sistem Sistem
1. Selectează opțiunea pentru produse 2.Afișare formular produse
3. Selectează un produs
4. Selectează opțiunea de ștergere a produsului 6. Verifică datele[A1]
7. Afișează modificările în formular
8. Șterge produsul din baza de date
Flux alternativ:
8
[A1] : Produsul nu poate fi șters deoarece există date în alte tabele care ar fi afectate de dispariția
acestuia(integritatea referințelor).
Este afișat un mesaj care îi descrie utilizatorului eroarea, fluxul continu ă de la pasul 3.
2.1.4 Caz de utilizare : Adăugare comandă (bon)
Nume : Modificare produs
Actor software: Administrator Sistem
Precondiții: Aplicația trebuie să fie funcțională și trebuie să existe măcar un produs în stoc
Postcondiții: Comanda și bonul trebuie să fie adăugate cu succes
Administrator Sistem Sistem
1. Apasă butonul pentru formularul de comenzi 2.Afișare formular comenzi
3. Selectează opțiunea pentru adăugarea de
comenzi 4.Afișează componenta pentru introducere de
produse
5. Selectează produsele și cantitatea 6.Compară cantitatea cu stocul [A1]
7.Apas ă butonul de checkout 8. Afișeaza butoanele pentru selectarea tipului de
facturare
9. Selectează tipul de facturare 10.Afișează datele clientului
11. Selectează client 12.Adaugă comanda
Flux alternativ:
[A1] : Cantitatea introdusă este mai mare decât stocul produsului
Este afișat un mesaj care îi descrie utilizatorului eroarea, fluxul continu ă de la pasul 4.
9
2.1.5 Caz de utilizare: Adăugare comandă( Client nou )
Nume : Modificare produs
Actor software: Administrator Sistem
Precondiții: Aplicația trebuie să fie funcțională și trebuie să existe măcar un produs în stoc
Postcondiții: Comanda ,clientul și factura trebuie să fie adăugate cu succes
Administrator Sistem Sistem
1. Apasă butonul pentru formularul de comenzi 2.Afișare formular comenzi
3. Selectează opțiunea pentru adăugarea de
comenzi 4.Afișează componenta pentru introducere de
produse
5. Selectează produsele și cantitatea 6.Compară cantitatea cu stocul [A1]
7.Apas ă butonul de checkout 8. Afișeaza butoanele pentru selectarea tipului de
facturare
9. Selectează tip ul de facturare 10.Afișează componenta pentru introducerea
datelor clientului
11. Introduce datele clientului
12.Apasă pe butonul de finalizare 13.Verifică datele clientului [A2]
14.Adaugă comanda
15.Adaugă clientul
16.Adaugă factura
Flux alternativ:
[A1] : Cantitatea introdusă este mai mare decât stocul produsului
Este afișat un mesaj care îi descrie utilizatorului eroarea, fluxul continuă de la pasul 5.
[A2] : Datele clientului au fost introduse într -un mod eronat(nu respectă constrâng erile de
integritate) sau nu au fost introduse deloc.
Este afișat un mesaj care îi descrie utilizatorului eroarea, fluxul continuă de la pasul 11.
10
2.1.6 Caz de utilizare: Adăugare comandă( Client
existent )
Nume : Modificare produs
Actor software: Administrator Sistem
Precondiții: Aplicația trebuie să fie funcțională și trebuie să existe minim un produs în stoc și un
client.
Postcondiții: Comanda și factura trebuie să fie adăugate cu succes
Administrator Sistem Sistem
1. Apasă butonul pentru formularul de comenzi 2.Afișare formular comenzi
3. Selectează opțiunea pentru adăugarea de
comenzi 4.Afișează componenta pentru introducere de
produse
5. Selectează produsele și cantitatea 6.Compară cantitatea cu stocul [A1]
7.Apas ă butonul de checkout 8. Afișeaza butoanele pentru selectarea tipului de
facturare
9. Selectează tipul de facturare 10.Afișează datele clientului
11. Selectează client 12.Adaugă comanda
13.Adaugă factura
Flux alternativ:
[A1] : Cantitatea introdusă este mai mare decât stocul produsului
Este afișat un mesaj care îi descrie utilizatorului eroarea, fluxul continuă de la pasul 5.
11
2.1.7 Caz de utilizare : Afișare și printare statistici
Nume : Modificare produs
Actor software: Administrator Sistem
Precondiții: Aplicația trebuie să fie funcțională și trebuie să existe o statistică funcțională
Postcondiții: Fișierul PDF trebuie creat cu succes
Administrator Sistem Sistem
1. Selectează opțiunea pentru statistici 2.Afișare formular produse
3. Selectează o statistică 4.Afi șează o statistică
5. Apasă pe butonul de scriere în PDF 6. Creează un PDF nou cu statistica selectată
2.2 Proiectarea bazei de date
2.2.1 Schemele DEA
În această diagrama se află entitățile și asocierile dintre ele alături de atributele fiecărei entități.
Figura DEA
12
Atributele pentru fiecare entitate și asociație:
Figura
Figura
13
Figura
Figura
14
Figura
Figura
15
Figura
16
Figura . Atrbute Facturi și Bonuri
17
2.2.2 Schema MMED(Model matematic elementar al
datelor)
În urma aplicării algoritmului de transformares din DEA în MRD se obține următoarea
schemă MMED.
FUNCȚII (Mulțimea funcțiilor angajaților magazinului)
Id_Functie ↔NAT(4),total
Funcție ↔CHAR(32),total (denumire funcție ;unică)
ANGAJAȚI (Mulțimea angajaților)
Id_Angajat ↔ NAT(4), total
CNP ↔CHAR(13) , total (codul numeric personal, unic, format din doar din cifre)
Nume →CHAR(64), total
Salariu →NAT(5), total(evident mai mare ca 0)
Funcție: ANGAJAȚI →FUNCȚII
Algoritm de proiectare a cheilor semantice:
i=1
CNP cheie? DA
(Nu pot exista două persoane cu același CNP)
Nume cheie? NU
(Pot exista două persoane cu același nume)
Salariu cheie? NU
(Pot exista două persoane cu același salariu)
Funcție cheie? NU
(Pot exista două persoane cu aceiași funcție)
18
i=2
Nume ∙ Salariu cheie? NU
(Pot exista două persoane cu același nume și salariu)
Nume ∙ Funcție cheie? NU
(Pot exista două persoane cu același nume și aceiași funcție)
Funcție ∙ Salariu cheie? NU
(Pot exista doua persoane cu aceiași funcție și același salariu)
i=3
Nume ∙ Salariu ∙ Funcție cheie? NU
(Pot exista două persoane cu aceiași funcție si același nume și salariu)
CATEGORII( Mulțimea categoriilor de produse)
IdCategorie ↔NAT(3) ,total
NumeCategorie ↔CHAR(64) ,total(denumirea categoriei; unică)
PRODUSE (Mulțimea produselor)
Id_Produs ↔NAT(4) ,total
Denumire ↔CHAR(64),total(denumirea produsului ;unic ă)
Pret→NAT(4), total(mai mare decât 0)
Imagine →CHAR(255),total(numele fișierului și extensia)
Stoc→NAT(4),total
Categorie:PRODUSE →CATEGORII
Algoritm de proiectare a cheilor semantice:
i=1
Denumire cheie? DA
(Nu pot exista două produse cu același nume)
19
Preț cheie? NU
(Pot exista mai multe produse cu același preț)
Imagine cheie? NU
(Pot exista mai multe produse cu aceiași imagine)
Stoc cheie? NU
(Pot exista două produse cu același stoc)
Categorie cheie? NU
(Pot exista mai multe produse care sunt în aceeași categorie)
i=2
Preț ∙ Imagine cheie? NU
(Pot exista două produse cu același preț și aceiași imagine)
Preț ∙ Stoc cheie? NU
(Pot exista două produse cu acelaș i preț și stoc)
Preț ∙ Categorie cheie? NU
(Pot exista mai multe produse cu aceiași categorie și același preț )
Imagine ∙ Stoc cheie? NU
(Pot exista mai multe produse cu același stoc și aceiași poză )
Imagine ∙ Categorie cheie? NU
(Pot exista mai multe produse cu aceiași imagine și categorie )
Categorie ∙ Stoc cheie? NU
(Pot exista mai multe produse cu ac eiași categorie și același stoc )
i=3
Preț ∙ Imagine ∙ Stoc cheie? NU
(Pot exista mai multe produse cu același preț și stoc și cu aceiași imagine)
Preț ∙ Imagine ∙ Categorie cheie? NU
20
(Pot exista mai multe produse cu același preț și aceiași imagine și categorie)
Preț ∙ Stoc ∙ Categorie cheie? NU
(Pot exista mai multe produse cu același preț și stoc și cu aceiași categorie)
Stoc ∙ Imagine ∙ Categorie cheie? NU
(Pot exista mai multe produse cu același stoc și aceiași imagine și categorie)
i=4
Preț ∙ Imagine ∙ Categorie ∙ Stoc cheie? NU
(Pot exista mai multe produse cu același preț și stoc și cu aceiași imagine și categorie)
JUDEȚE (Mulțimea județelor)
Id_Judet ↔NAT(2) ,total
Județ ↔CHAR(32) ,total(Denumirea județului, unic ă)
ORAȘE (Mulțimea orașelor)
Id_Oraș ↔NAT(5),total
Oraș ↔CHAR(32),total (denumirea orașului)
Județ: ORAȘE →JUDEȚE
Algoritm de proiectare a cheilor semantice:
i=1
Oraș cheie? NU
(Pot exista două orașe cu același nume)
Județ cheie? NU
(Pot exista mai multe orașe în același județ)
i=2
Oraș ∙ Județ cheie? DA
(Nu pot exista două orașe cu același nume în același județ)
21
CLIENȚI (Mulțimea clienților)
IdClient ↔NAT(5 )
TipClient → {“Fizic ă”, “Juridic ă” } , total ( reprezint ă tipul de persoană)
Denumire →CHAR(64),total(reprezintă numele clientului)
CodIdentificare ↔CHAR(13),total( CNP -ul în cazul persoanelor fizice și CIF -ul în cazul persoanelor
juridice;unic)
Adresa →CHAR(64),total(adresa clientului : strada, bloc, scara, apartament)
Telefon ↔ CHAR(10),total(telefonul clientului,format numai din cifre)
Oraș : CLIENȚI →ORAȘE
Algoritm de proiectare al cheilor semantice:
i=1
TipClient cheie? NU
(Pot exista mai mulți clien ți de același tip)
Denumire cheie? NU
(Pot exista mai mulți clienti cu aceiași denumire – în cazul persoanelor fizice)
CodIdentificare cheie? DA
(Nu pot exista doi clienți cu același CNP sau CIF)
Adresa cheie? NU1
Oraș cheie? NU
(Mai mulți clienți pot fi în același oraș)
COMENZI (Mulțimea comenzilor)
Id_Comanda ↔NAT(5),total
DataComanda → DATE,total(format L/Z/A)
22
CONTINUTCOMENZI (Mulțimea perechilor de tip <c,p> unde c reprezintă comanda și p
reprezintă produsul)
Id_Conținut ↔NAT(5),total
Cantitate → NAT(3),total(Canitatea produsul din coamndă;mai mare ca 0)
BON (Mulțimea bonurilor)
NumărBon ↔NAT(8) ,total (reprezintă numărul bonului,este unic)
FACTURI (Mulțimea facturilor)
Serie →CHAR(4)
Numar →NAT(4)
Client: FACTURI →CLIENȚI
Algoritm de proiectare a cheilor semantice:
i=1
Serie cheie? NU
(Două facturi pot avea aceiași serie)
Număr cheie? NU
(Mai multe facturi pot avea același număr)
Client cheie? NU
(Un client poate avea mai multe facturi)
i=2
Serie ∙ Număr cheie? DA
(Două facturi nu pot avea concomitent aceiași serie și același număr)
Serie ∙ Client cheie? NU
(Un client poate avea facturi cu aceiași serie)
23
Număr ∙ Client cheie? NU
(Un client poate avea facturi cu aceiași număr)
2.2.3 MRD(Model relațional de date)
FUNCȚII (Id_Functie ,Funcție)
Φ├ Func ție
ANGAJAȚI( Id_Angajat ,CNP)
Φ├ CNP, Φ├ Nume , Φ├ Funcție , Φ├ Salariu
CATEGORII (Id_Categorie ,NumeCategorie )
Φ├ NumeCategorie
PRODUSE (Id_Produs ,Denumire )
Φ├ Denumire, Φ├ Preț, Φ├ Categorie , Φ├ Stoc
JUDEȚE (Id_Judet ,Județ)
Φ├ Județ
ORAȘE (Id_Oraș ,Județ,Oraș )
Φ├ Județ , Φ├ Oraș
COMENZI( Id_Comanda )
Φ├ Data
CONTINUTCOMENZI( Id_Continut ,Comanda,Produs )
Φ├ Comanda, Φ├ Produs, Φ├ Cantitate
BONURI( Id_Comanda ,NumarBon )
24
Φ├ Id_Comanda , Φ├ NumarBon
CLIENȚI(IdClient ,CodIdentificare)
Φ├ TipClient, Φ├ Denumire, Φ├ CodIdentificare, Φ├ Adresa, Φ├ Oraș , Φ├ Telefon
FACTURI( Id_Comanda ,Serie ,Numă r)
Φ├ Id_Comanda, Φ├ Serie, Φ├ Număr, Φ├ Client
2.3 Aplicația C#
Pentru a cr ea aplicația am folosit IDE -ul Microsoft Visual Studio, iar ca limbaj de programare
am utilizat C#.
2.3.1 Design -ul interfeței
Pentru interfața apli cației am folosit Windows Forms, fiind 4 în total.
Prima dintre ele este cea care apare la rularea programului.
Figura
25
Prin intermediul celor 3 butoane se poate accesa formularul corespunzător.
Figura
TEXT
2.3.2 Clasele de obiecte
Pentru a afișa modificările suferite de baza de date am foloșit clase.
26
Obs: Deși clasele corespund tabelelor din Access, ele nu au exact aceleași atribute sau tip de
date(în mare parte id -ul dis pare, iar în cazul cheilor străine ele sunt transformate în tip de
date string).
public class Produs
{
public string Denumire { get; set; }
public int Pret { get; set; }
public string Categorie { get; set; }
public string Imagine { get; set; }
public int Stoc { get; set; }
}
Clasa Produs are aceleași atribute ca și tabelul produse din baza de date, cu excepția id -ului. Al
doilea lucru diferit este că atributul Categorie nu mai este număr natural, ci arată direct categoria
produsului.
class Oras
{
public string Denumire { get; set; }
public string Judet { get; set; }
}
Clasa Oraș are două șiruri de caractere ca și atribute.
class Comanda
{
public DateTime dataComanda { get; set; }
public int Cost { get; set; }
}
class ContinutComenzi
{
public int Id_Comanda { get; set; }
public int Id_Produs { get; set; }
public int Cantitate { get; set; }
}
Clasa ContinutComenzi și -a păstrat atributele pentru Comandă și Produs.
class Bon : Comanda
{
public int IdComanda { get; set; }
public string NumarBon{ get;set;}
}
27
class Factura:Comanda
{
public int IdComanda { get; set; }
public string Serie { get; set; }
public int Numar { get; set; }
public string Client { get; set; }
public string Adresa { get; set; }
public string Oras { get; set; }
public string Judet { get; set; }
}
Clasele Bon și Factură sunt ,,copii” clasei Comandă(asta înseamnă că moștenesc atributele
dataComanda și Cost)
class Client
{
public string TipClient { get; set; }
public string Denumire { get; set; }
public string CodIdentifi care { get; set; }
public string Adresa { get; set; }
public string Oras { get; set; }
public string Judet { get; set; }
public string Telefon { get; set; }
}
2.3.3 Încărcarea datelor în aplicație
Datele au fost încărcate prin intermediul unui obiect de tip OleDbDataReader . Ele sunt
introduse într -o listă de tip BindingList, folosind un DataTable ca și intermediar. Avantajul acestui
tip de listă este că dacă un dataGridView o folosește ca sursă de d ate, el nu trebuie actualizat când se
produc modificări în listă.
text
private OleDbConnection con = new OleDbConnection ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Airsoft.accdb" );
BindingList <Produs> Produse = new BindingList <Produs>();
BindingList <Comanda> comenzi = new BindingList <Comanda>();
BindingList <ContinutComenzi > ProduseAdd = new BindingList <ContinutComenzi >();
BindingList <Client> clienti = new BindingList <Client>();
BindingList <Bon> bonuri = new BindingList <Bon>();
BindingList <Factura> facturi = new BindingList <Factura>();
BindingList <Oras> orase = new BindingList <Oras>();
28
În cazul produselor, ele se încarcă doar o singură dată la rularea programului, pentru a
eficientiza procesul și a reduce consumul de timp, lucru care este vizibil la bazel e de date cu multe
înregistrări.
Ulterior această listă este “pasa tă” către celelalte formulare, atunci când se apasă unul din
butoanele pentru formulare.
private void Form1_Load( object sender, EventArgs e)
{
con.Open();
OleDbCommand cmd = new OleDbCommand ();
cmd.Connection = con;
cmd.CommandText = "SELECT p.Denumire,p.Pret,c.NumeCategorie as
Categorie,Imagine,Stoc" +
" FROM Produse as p INNER JOIN Categorii as c " +
"ON p.Categorie = c.IdCategorie" ;
adt = new OleDbDataAdapter (cmd);
adt.Fill(dt);
for (int i = 0; i < dt.Rows.Count; i++)
{
Produs prod = new Produs();
prod.Denumire = dt.Rows[i][ "Denumire" ].ToString();
prod.Pret = Convert.ToInt32(dt.Rows[i][ "Pret"]);
prod.Categorie = dt.Rows[i][ "Categorie" ].ToString();
prod.Imagine = dt.Rows[i][ "Imagine" ].ToString();
prod.Stoc = Convert.ToInt32(dt.Rows[i][ "Stoc"]);
Produse.Add(prod);
}
con.Close();
}
29
Obs: Metoda passlist se găsește atât în formularu de comenzi cât și ce în cel de produse. Față
de majoritatea atributelor și metodelor aceasta și lista de produse sunt setate ca și publice pentru a
putea fi accesate din formularul principal.
private void btnAdaugaComanda_Click( object sender,
EventArgs e)
{
Comenzi comenzi = new Comenzi();
comenzi.passList(Produse);
comenzi.Show();
}
public void passList( BindingList <Produs> Produse)
{
this.Produse = Produse;
}
30
2.3.4 Modificarea datelor
Pe lângă posibilitatea de vizualizare a datelor, un utilizator poate și să adauge,modifice,șterge
produse și să adauge comenzi noi. Acest lucru a fost implementat folosind listele de clase și
obiectele de tip OleDbCommand.
Este necesar ca aplicația să verifice dacă datele introduse de utilizator respectă constrângerile
de integr itate(de exemplu, în câmpul pentru prețul unui produs trebuie să fie un număr natural
pozitiv) sau dac ă au fost introduse(de exemplu câmpul pentru denumirea unui produs nu trebuie să
fie gol).
OleDbCommand cmd = new OleDbCommand ();
con.Open();
cmd.Connection = con;
int ind; //index categorie
ind = comboBox1.SelectedIndex;
Produs prod1 = new Produs();
prod1.Denumire = txtDenumire.Text;
prod1.Pret = Convert.ToInt32(txtPret.Text);
prod1.Imagine = imgloc.ToString();
prod1.Categorie = comboBox1.SelectedItem.ToString();
prod1.Stoc = Convert.ToInt32(txtStoc.Text);
ind++;
cmd.CommandText = "INSERT INTO
Produse(Denumire,Pret,Imagine,Categorie,Stoc) VALUES('" +
txtDenumire.Text + "'" + ",'" + txtPret.Text.ToString() + "'" +
",'" + imgloc + "'" + ",'" + ind.ToString() + "','" +
txtStoc.Text.ToString() + "')";
MessageBox .Show(Convert.ToString(cmd.CommandText));
Produse.Add(prod1);
cmd.ExecuteReader();
con.Close();
dataGridView1.Refresh();
31
Exemplu verificare
În cazul operațiilor de ștergere, este important ca elementul șters să nu aibă referințe în alte tabele
dacă integritatea referențială este setată.
check = true;
if (txtDenumire.Text == "")
{
MessageBox .Show("Nu ati introdus denumirea produsului!" );
check = false;
}
if (txtDenumire.Text.Length>64)
{
MessageBox .Show("Denumire peste 64 de caractere!" );
check = false;
}
try {
if (txtPret.Text == "")
{
MessageBox .Show("Nu ati introdus pretul" );
check = false;
}
if (Convert.ToInt32(txtPret.Text) <= 0)
{
MessageBox .Show("Pretul trebuie sa fie mai mare ca 0!" );
check = false;
}
Convert.ToInt32(txtPret.Text);
}
catch (FormatException e)
{
check = false;
MessageBox .Show("Format eronat Pret!" );
MessageBox .Show(e.Message);
}
32
2.3.5 Vizualizarea statisticilor
Utilizatorul poate să vizualizeze diferite statistici cum ar fi cele mai vândute produse, lista
angajaților , câte produse au fost vândute. Mai jos este o secvență de cod pentru afișarea celor mai
vândute produse .
private void deleteProduct()
{
try
{
OleDbCommand cmd = new OleDbCommand ();
con.Open();
cmd.Connection = con;
int ind = dataGridView1.CurrentCell.RowIndex;
pictureBox1.ImageLocation = "";
cmd.CommandText = "DELETE FROM Produse where Denumire='" + Produse[ind].Denumire + "';";
MessageBox .Show(Convert.ToString(cmd.CommandText));
cmd.ExecuteNonQuery();
con.Close();
Produse.RemoveAt(ind);
}
catch (OleDbException ex)
{
con.Close();
MessageBox .Show(ex.Message);
}
}
33
De asemenea, el are posibilitatea de a salva o statistică într -un fișier PDF. Acest lucru a fost
implementat folosind librăria iTextSharp.
Numele fișierului va fi compus din denumirea statisticii selectate și data la care a fost
creată (format Z/L/A) . Titlu constă în denumirea statisticii. Ulterior este adăugat un tabel. Data
raportului este inserată la final. În final se deschide fișierul PDF(cu aplicația implicitiă).
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
con.Open();
cmd.CommandText = "SELECT p.Denumire, Sum(cc.Cantitate) AS Cantitate,
SUM(p.Pret*cc.Cantitate) as PretTotal " +
"FROM Produse AS p INNER JOIN ContinutComenzi AS cc ON p.Id_Produs =
cc.Produs " +
"GROUP BY p.Denumire ORDER BY Sum(cc.Cantitate) DESC" ;
DataTable dt = new DataTable();
OleDbDataAdapter adt = new OleDbDataAdapter(cmd);
con.Close();
adt.Fill(dt);
dataGridView1.DataSource = dt;
lblOperatie.Text = "Cele mai vandute produse" ;
34
string numefisier;
numefisier = lblOperatie.Text.TrimStart();
numefisier = numefisier + DateTime.Today.Day + DateTime.Today.Month +
DateTime.Today.Year;
Document doc = new Document(iTextSharp.text.PageSize .LETTER, 10, 10, 42, 35);
PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(numefisier + ".pdf",
FileMode.Create));
doc.Open();
iTextSharp.text.Font parfront = FontFactory.GetFont( "Times New Roman" , 30,
BaseColor.BLACK);
Paragraph paragraph = new Paragraph(lblOperatie.Text, parfront);
paragraph.Alignment = Element.ALIGN_CENTER;
doc.Add(paragraph);
doc.Add(Chunk.NEWLINE);
PdfPTable table = new PdfPTable(dataGridView1.Columns.Count);
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
table.AddCell( new Phrase(dataGridView1.Columns[j].HeaderText));
}
table.HeaderRows = 1;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
for (int k = 0; k < dataGridView1.Columns.Count; k++)
{
if (dataGridView1[k, i].Value != null)
{
table.AddCell( new Phrase(dataGridView1[k, i].Value.ToString()));
}
}
}
doc.Add(table);
doc.Add(Chunk.NEWLINE);
doc.Add(Chunk.NEWLINE);
Paragraph dataRaport = new Paragraph( "Data raport:" + DateTime.Today.Day.ToString() +
" " + DateTime.Today.Month.ToString() + " " + DateTime.Today.Year.ToString());
doc.Add(dataRaport);
doc.Close();
System.Diagnostics.Process.Start(@numefisier + ".pdf");
35
3 TESTAREA APLICAȚIEI
În dezvoltarea sistemelor software este foarte impo rtant ca produsul să fie testat, pentru a
depista erorile care ar putea apărea și pentru a verifica dacă fiecare componentă funționează într -un
mod corespunzător.
Pentru testarea aplicației am folosit Visual Studio, însă aplicația poate rula chiar și daca o
persoană nu are IDE-ul instalat pe calculatorul folosit. Ea se află în subdirectoarele ”/bin/Debug”
implicit. Am creat o arhivă cu aplicația,baza d e date și librăria iTextSharp 5(necesară pentru
generarea de fișiere PDF).
4 CONCLUZII
În această lucrare a fost prezentat procesul de proiectare și implementare a unui sistem
software care are ca scop gestionarea unui magazin de echipament Airsoft.
Fiecare funcționalitate a fost implementată cu succes. Aplicația permite vizualizarea și
interacționarea cu lista de produse. De asemen ea permite adăugarea de comenzi, cu diverse tipuri de
36
facturare. Însă, un lucru aparte este componenta statiscticilor și posibilitatea salvării unui raport într –
un fiș ier de tip PDF, care este mai avansat decât un raport în format text.
Prin int ermediul acesui proiect mi-am aprofundat nivelul de cuno ștințe despre procesul de
dezvoltare a unei aplicații C# care are diverse funcționalități. A fost necesară creerea unei baze de
date în Microsoft Access care a funcționat ca și sursa de date pen tru so ft, precum și folosirea librăriei
iTextSharp 5 . În creerea bazei de date și a aplicației propriu zise am căpătat cunoștințe noi despre
sintaxa SQL și C#.
Momentan, aplicația are ca context piața Airsoft din România, deci o dezvoltare ulterioară
va fi adă ugarea suportului pentru alte țări. Pe viitor s -ar mai putea adăuga diverse informații în baza
de date, cum ar fi achizițiile firmei sau mai multe date despre produse,clienți sau angajați.
Îmbunătățirea componentei de statistică și rapoarte ar putea fi o adăugare posibilă. Acest
lucru s -ar realiza prin adăugarea unor statistici noi și prin dezvoltarea codului pentru salvare în PDF.
Deși modul de funcționare a progamului este cel mai important lucrul, extinderea interfeței ar
putea fi un pas ulterior în d ezvoltare. Felul în care arată un produs software poate afecta părerea
utilizatorilor.
5 BIBLIOGRAFIE
[1] https://docs.microsoft.com/en -us/visualstudio/ide/vi sual-studio -ide?view=vs -2017
[2] https://docs.microsoft.com/en -us/dotnet/csharp/getting -started/introduction -to-the-csharp-
language -and-the-net-framework
[3] https://docs.microsoft.com/en -us/dotnet/csharp/getting -started/media/netarchitecture.png
[4] https://www.nuget.org/packages/iTextSharp/
[5] https://support.office.com/ro -ro/article/no%C8%9Biuni -elementare -despre -bazele -de-date-
a849ac16 -07c7 -4a31 -9948 -3c8c94a7c204
[6] Lector dr. Alexandrescu Adrian , Curs Medii de proiectare și programare
[7] Conf. dr. Christian Manca ș¸. Curs sisteme de gestiune a bazelor de date.
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: Gestionaremagazinairsoft [610788] (ID: 610788)
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.
