Șef lucrări dr. ing. Irina Ioni ță [609250]
MINISTERUL EDUCAȚIEI NAȚIONALE ȘI CERCETĂRII ȘTIINȚIFICE
UNIVERSITATEA PETROL – GAZE DIN PLOIEȘTI
FACULTATEA LITERE ȘI ȘTIINȚE
DEPARTAMENTUL INFORMATICĂ, TEHNOLOGIA INFORMAȚIEI,
MATEMATICĂ ȘI FIZICĂ
PROGRAMUL DE STUDII: INFORMATICĂ
FORMA DE ÎNVĂȚĂMÂNT: IF
LUCRARE DE LICENȚĂ
Conducător științific:
Șef lucrări dr. ing. Irina Ioni ță
Absolvent: [anonimizat]
2017
F 271 .13/Ed.2 F ișier SMQ/Formulare
Anexa 8
MINISTERUL EDUCAȚIEI NAȚIONALE ȘI CERCETĂRII ȘTIINȚIFICE
UNIVERSITATEA PETROL – GAZE DIN PLOIEȘTI
FACULTATEA: LITERE Ș I ȘTIINȚE
DEPARTAMENTUL: INFORMATICĂ, TEHNOLOGIA INFORMAȚIEI,
MATEMATICĂ ȘI FIZICĂ
PROGRAMUL DE STUDII: INFORMATICĂ
FORMA DE ÎNVĂȚĂMÂNT: IF
Vizat
Facultatea Litere și Științe
Aprobat,
Director de departament,
Conf. dr. inf. Gabriela Moise
LUCRARE DE LICENȚĂ
TEMA: Proiectarea și implementarea unei aplicații orientate obiect pentr u
gestionarea unui magazin de că rți
Conducător științific:
Șef lucrări dr. ing. Irina Ioni ță
Absolvent: [anonimizat]
2017
F 272.13/Ed.2 Fișier SMQ/Formulare
UNIVERSITATEA PETROL – GAZE DIN PLOIESTI Anexa 9
FACULTATEA: LITERE ȘI ȘTIINȚE
DOMENIUL: INFORMATICĂ
PROGRAMUL DE STUDII: INFORMATICĂ
FORMA DE ÎNVĂȚĂMÂNT: IF
Aprobat,
Director de departament,
Conf. dr. inf. Gabriela Moise Declar pe propria răspundere că voi elabora personal lucrarea
de licență și nu voi folosi alte materiale documentare în afara
celor prezentate la capitolul „Bibliografie”.
Semnătură student(ă):
DATELE INIȚALE PENTRU LUCRARE LICENȚĂ
Proiectul a fost dat student: [anonimizat]/student: [anonimizat]:
1) Tema proiectului / lucrării
2) Data eliberării temei:
3) Tema a fost primită pentru îndeplinire la data:
4) Termenul pentru predarea proiectului/ lucrării:
5) Elementele inițiale pentru proiect / lucrare:
6) Enumerarea problemelor care vor fi dezvoltate:
7) Enumerarea materialului grafic (acolo unde este cazul):
8) Consultații pentru lucrare, cu indicarea părților din proiect care necesită consultarea:
Conducător științific: Student(ă)
Semnătura: Semnătura:
F 273.13/Ed.2 Fișier SMQ/Formulare
UNIVERSITATEA PETROL – GAZE DIN PLOIESTI Anexa 10
FACULTATEA: LITERE ȘI ȘTIINȚE
DOMENIUL: INFORMATICĂ
PROGRAMUL DE STUDII: INFORMATICĂ
FORMA DE ÎNVĂȚĂMÂNT: IF
APRECIERE
privind activitatea absolvent: [anonimizat]:
în elaborarea lucrării de licență cu tema:
Nr. crt. CRITERIUL DE APRECIERE CALIFICATIV
1. Documentare, prelucrarea informațiilor din bibliografie
2. Colaborarea ritmică și eficientă cu conducătorul temei lucrării de licență
3. Corectitudinea calculelor, programelor, schemelor, desenelor, diagramelor și
graficelor
4. Cercetare teoretică, experimentală și realizare practică
5. Elemente de originalitate (dezvoltări teoretice sau aplicații noi ale unor teorii
existente, produse informatice noi sau adaptate, utile în aplicațiile inginerești)
6. Capacitate de sinteză ș i abilități de studiu individual
CALIFICATIV FINAL
Calificativele pot fi: nesatisfăcător/satisfăcător/bine /foarte bine /excelent .
Comentarii privind calitatea lucrării:
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________ ________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________ ________________________________________________
________________________________________________________________________________
________________________________
Data:
Conducător științific:
Șef lucrări dr. ing. Irina Ioniță
1
CUPRINS
Cuprins ………………………….. ………………………….. ………………………….. ……………………….. 1
CapitoluL 1. Introducere ………………………….. ………………………….. ………………………….. .. 2
Capitolul 2. Stadiul actual al aplicațiilor create cu ajutorul unui limbaj de programare
orientat pe obiecte ………………………….. ………………………….. ………………………….. ………. 7
2.1 Actualitatea aplicațiilor orientate obiect ………………………….. ………………………….. .. 7
2.2 Exemple de aplicații orientate obiect ………………………….. ………………………….. …… 10
Capitolul 3. Instrumente software utilizate ………………………….. ………………………….. .. 15
3.1 Abordarea program ării orientate obiect ………………………….. ………………………….. . 15
3.2 Stocarea informațiilor în baza de date ………………………….. ………………………….. …. 17
3.3 Programarea în Visual S tudio cu ajutorul limbajului de programare C# ……………. 19
3.4 Structurarea aplicației sub forma unui MVC ………………………….. ……………………… 21
Capitolul 4. Analiza, proiectarea, implementarea și testarea aplicației …………………. 24
4.1 Analiza aplicației ………………………….. ………………………….. ………………………….. …… 24
4.2 Proiectarea aplicației ………………………….. ………………………….. …………………………. 27
4.3 Implementarea aplicației ………………………….. ………………………….. ……………………. 37
4.4 Testarea aplicației ………………………….. ………………………….. ………………………….. …. 44
Capitolul 5. Concluzii ………………………….. ………………………….. ………………………….. ….. 57
Biblio grafie ………………………….. ………………………….. ………………………….. ………………… 60
Anexe ………………………….. ………………………….. ………………………….. …………………………. 1
2
CAPITOLUL 1 . INTRODUCERE
Această lucrare de licenț ă face parte din domeniul utilizarea aplicațiilor
software pentru gestiunea tranzacțiilor dintr -un centru comercial , în cazul de față
fiind vorba despre managementul activităților din cadrul unui magazin de că rți.
Când spun magazin de că rți mă refer la cazul în care un potențial client poate
vizita în mod real sediul firmei ș i poate interacți ona în mod direct cu personalul
magazinului.
Prezenta lucrare de licență a fost creată din perspectiva unui tână r antreprenor
care încearcă să lanseze o primă afacere prin îmbinarea avan tajelor oferite de
domeniul IT ș i plăcerea de a furniza publicului produse de calitate cu un potențial
uriaș. Folosindu -mă de cunoștințele acu mulate pe parcursul anil or de studiu, dar și a
celor dobâ ndite î n urma unei cercetă ri amănunțite în domeniul programă rii orientate
obiect , am ales să realizez o apli cație software eficientă care să controleze tranzacțiile
și serviciile oferite în incinta u nui magazin de că rți.
Consider că într -o socie tate bazată pe informație, cunoș tințele despre
calculatoare și limbajele de programare a u devenit o necesitate absolută deoarece
aproape orice instituție, afacere sau corporație se folosește de lucrul cu calcu latorul
pentru a -și îmbunătă ți eficiența ș i eficacitatea operațiilor.
În această categorie este inclus ș i magazinul de că rți despre care vorbeam
anterior. Evidența tranzacțiilor ef ectuate de un distribuitor de că rți este un proces
complex ce necesită un s istem computerizat care să mențină controlul acestor
operații într -un mod facil ș i fără erori.
Observăm cum în ultima vreme, natura competitivă a oamenilor își face simțită
prezența în mai toate domeniilo r de activitate iar serviciile ș i produ sele oferite de un
magazin de că rți nu fac nici ele excepție. Datorită cer erii din ce în ce mai mari a
produselor din acest domeniu există o creștere direct proporțio nală a datelor ș i
informațiilor.
3
Un magazin de că rți necesită informații actualizate despre produsele din
incinta acestuia, despre clienții care au cumpă rat sau doresc să cumpere o carte,
despre furnizorii de la care sunt achizițion ate că rțile sau despre angajați.
Toată această canti tate de date trebuie introdusă și pă strată într -un sistem de
management al magazinului, lucru ce nu s -ar putea realiza fără ajutorul unui sistem
computerizat . Acest sistem de management este folosit în principal pentru a ține
evidența produ selor preluate de la furnizori și date spre vâ nzare , dar și a tut uror
tranzacțiilor fin anciare executate în incinta magazinului.
Utilizarea unui astfel de sistem de gestiune va re duce considerabil sau aproape
că va elimina lucrul cu documente ce se pot pier de sau deteriora, va ușura și
eficientiza munca depusă de angajații magazinului.
Principalul scop al utilizării unui sistem computerizat de gestiune este de a
oferi clienților tranzacții rapide și fă ră erori iar aplicația dezvoltată ș i prezentată în
această lucrare respectă întocmai aceste cerințe.
Datorită caracterului de adaptabili tate și flexibilitate al acestei aplicații, t rebuie
menționat și faptul că acest sistem de management poate fi utilizat pentru orice
magazin de că rți iar prin mici modifică ri se poate folosi și pentru magazine ce
comercializ ează alte tipuri de produse decâ t cele propuse de mine.
Fiind atras de antreprenoriat, am decis să vizi tez fiecare din magazinele de că rți
existente în orașul în care locuiesc , unde am avut ocaz ia să observ anumite aspecte
referitoare la activitatea acestor firme și modul în care se lucre ază cu publicul. Prin
această decizi e, am observat câteva nereguli ș i aspecte ce pot fi îmbunătă țite, un
exemplu fiind clienții nevoiți să aștepte la coadă pentru a achiziț iona produse sau a
adresa într ebări angajaților cu privire la existența anumitor că rți.
Toate aceste nereguli m -au motivat să creez un sist em de gestiune ce oferă
accesul la informație într -un mod facil.
4
Eficiența aplicației mele se datorează existenței a trei conturi de utilizator,
după cum urmează : contul Client, contul Agent -vânzări și contul Manager.
Prin accesarea contului Client, utilizatorul aplicației are acc es la informații
despre produsele existente în magazin, precum și posibilitatea de a adăuga produsele
dorite într -un coș de cumpărături și trimiterea unei precomenzi c ătre agentul de
vânzări.
Contul Agent -vânzări oferă utilizatorului acces la o listă ce conține informații
ale clienților dar și a precomenzilor plasate de către aceștia. Tot odată acest cont
oferă și opțiunea prin care se încheie o tranzacție financiară p rin eliberarea unei
facturi electronice.
În cazul în care utilizatorul aplicației propuse de mine dorește accesarea
contului Manager, va avea posibilitatea de a gestiona produsele, angajații și furnizorii
magazinului de cărți după bunul plac.
Datorită pre zenței acestor opțiuni consider că aplicația mea aduce îmbunătățiri
semnificative prin rezolvarea problemelor mai sus menționate.
Mai multe informații despre accesarea celor trei conturi de utilizator se
regăsesc în capitolul 4 al acestei lucrări.
Respec tând obiectivele mai jos menționate, am reușit să creez un sistem de
gestiune al unui magazin de cărți. Aceste obiective sunt:
1. Dezvoltarea unei aplicații orientate obiect pentru gestiunea unui magazin de
cărți;
2. Dezvoltarea cunoștințelor despre limbajele orientate obiect și lucrul cu bazele
de date;
3. Reținerea informațiilor privind datele clienților, furnizorilor, angajaților,
produselor magazinului;
4. Gestiunea eficientă a tranzacțiilor financiare ale magazinului precum și lucrul
angajaților cu publicul;
5
5. Accesarea bazei de date a aplicației cu posibilitatea actualizării datelor dar și
efectuarea unor modificări precum ștergerea unor înregistră ri, inserarea unui
client/ angajat/ furnizor nou;
6. Crearea unor conturi speciale (cont Client, cont Agent, cont Manager ) pentru
separarea acțiunilor permise asupra sistemului;
7. Realizarea unei interfețe prietenoase ce permite utilizatorului o navigare
ușoară în aplicație.
Prin respectarea obiectivelor stabilite anterior, acest proiect de licență are
următoarea structură :
Capitolul 1. Introducere – conține o scurtă prezentare a proiectului,
actualitatea temei, motivarea alegerii temei, obiectivele trasate și structura
lucrării.
Capitolul 2. Stadiul actual al aplica țiilor create cu ajuto rul unui limbaj de
programare orientat pe obiecte – capitolul conține câteva exemple de astfel de
aplicații precum și descrierea avantajelor oferite de limbajele orientate obiect.
Capitolul 3. Instrumente software utilizate – acest capitol conține o scurtă
descriere a bazelor de date dar și a limbajului C# utilizat în crearea acestei aplicații.
Capitolul 4. Analiza, p roiectarea, implementarea ș i testarea aplicației – acest
capitol descrie exact pașii urmăriți în realizarea acestei aplicații pornind de la
proiectarea ei până la testarea module lor acesteia pentru toți actorii implicați în
funcționarea acestui sistem de gestiune.
Capitolul 5. Concluzii – în acest capitol se analizează dacă toate obiectivele
stabilite inițial au fost atinse cu succes și se descriu pe s curt câteva idei pentru
îmbun ătățirea aplicației.
6
Acest sistem d e gestiune al unui magazin de că rți a fost creat într -un mediu de
dezvoltare dinamic și anume Visual Studio versiunea Community 2015. Cu ajutorul
limbajului de programare C# și a programării orientate obiect, am reușit să construiesc
un MVC (Model View Controller) ce s-a dovedit a fi folositor în se pararea elementelor
de interfață a aplicației de restul sistemului.
Folosind acest model arhitectural, am oferit un plus de dinamism sistemului meu
de gestiune deoarece acum există posibilitatea modificări i părții vizuale a aplicației
fără ca eventualele modi ficări să afecteze alte nivele de date.
7
CAPITOLUL 2 . STADIUL ACTUAL AL AP LICAȚIILOR CREATE CU
AJUTORUL UNUI LIMBAJ DE PROGRAMARE ORIENT AT PE OBIECTE
2.1 ACTUALITATEA APL ICAȚIILOR ORIENTATE OBIECT
Pentru ca un utilizator să poată aprecia o aplicație orientată obiect, consider că
acesta trebuie să cunoască câteva aspecte de bază despre limbajele de programare
orientate pe obiecte.
Programarea orientată pe obiecte (POO) este o tehnică de programare
inventată în urma descoperirii unor limită ri ale tehnicilor de programare utilizate
anterior. Pentru a putea în țelege avantajele utilizării POO suntem nevoiț i să
cunoaștem aceste limitări ș i modul în care ele pot fi evitate.
Tehnicile de programare folosite de -a lungul timpului până la utilizarea POO
sunt: programarea nestructurată, programarea procedurală și pro gramarea modulară.
Programarea nestructurată este o tehnică utiliz ată de programatorii începători,
în care un program folosește doar variabile globale. În cazul în care programatorul
folosește această tehnică pentru a scrie un program de mari dimensiuni, acestuia îi va
fi foarte greu să modifice codul sau să -l refolosească.
Limbajele precum C, Pascal sau Fortran sunt limbaje de programare
procedurale în care fiecare instrucțiune a programului spune calculatorului să facă
ceva anume, practic un program pr ocedural este o listă de inst rucțiuni pe care
calculatorul o respectă întocmai. Această tehnică de programare poate fi utilizată
pentru programe de mici dimensiuni î n care nu este necesară prezența unui principiu
organizatoric.
Programarea modulară este o tehnică ce conține programe asemănătoare din
punct de vedere al funcționalității. Aceste programe pot fi grupate în module
implementate separat.
8
Pentru programe le de dimensiuni mari nu este indicat să folosim tehnicile de
programare prezentate anterior d eoarece utilizarea lor poate conduce către un număr
mare de conexiuni între variabile și funcții așa cum se poate observa în figura 1.
Figura 1. Paradigma procedurală [14]
O altă problemă în utilizarea paradigmei procedurale este reprezentată de
faptul că datele și funcțiile nu pot modela lucruri din lumea reală.
În lumea reală observăm că obiectele din jurul nostru dețin anumite atribute ș i
comportamente . Dacă ne gâ ndim la exemplul în care discutăm despre o persoană
putem spune că aceasta are drept atribut culoarea ochilor iar drept comportament
putem conside ra ac țiunea de a mânca atunci câ nd persoanei în cauză i se face foame.
Putem observa că atributele din lumea reală sunt echivalente cu datele dintr –
un program deoarece ambele au valori specifice iar comportamentele se aseamănă cu
funcțiile u nui program d eoarec e răspund la anumiți stimuli.
Idea fundamentală din spatele POO este de a combina într -o singură entitate
datele ș i funcțiile dintr -un program. Acea entitate se numeș te obiect.
Funcțiile unui obiect se numesc funcții membru și reprezintă singura cale prin
care un programator poate accesa datele. Se spune că datele sunt încapsulate .
9
Punctând elementele cheie ce definesc paradigma POO, în continuare sunt
prezentate câteva avantaje ale utilizării ei:
Codul sursă al unui program este structurat într -un mod eficient cu ajutorul
claselor ș i obiectelor;
Reduce costurile dezvoltă rii unor aplicații deoarece codul sursă se poate
modifica cu ușurință și se poate extinde în funcție de nevoile pr ogramatorului
Această tehnică de programare este utilizată în industria software pentru
dezvoltarea aplicațiilor complexe;
Programele dezvoltate pot rezolva probleme într -un mod simil ar cu gâ ndirea
umană, fapt ce permite programatorilor să gă sească soluții pentru pro bleme
din ce în ce mai complexe.
În con formitate cu un articol publicat pe site -ul www.link -academy.com , există trei
limbaje de programare pe care angajatorii preferă să le vadă în CV -urile candidațilo r la
joburile din domeniul IT. Aceste limbaje de programare sunt: PHP, C# și Java.
Observăm că două dintre aceste limbaje preferate de angajatori sunt limbaje de
programare orien tate obiect. Acest articol dezvă luie și faptul că o bună cunoaștere a
limbajul ui C# oferă în prezent condiții excelente de lucru în domeniul dezv oltărilor de
aplicații software. De asem enea se specifică ș i faptul că l ocurile de muncă pentru
programatorii Java nu sunt la fel de accesibile ca cele pentru programatorii PHP și C#,
dar e xistă oferte și sunt plătite excelent.
Compania Tiobe Software a publicat pe site -ul lor www.tiobe.com , ratingul celor
mai populare limbaje de programare (figura 2) unde putem observa următorul aspect:
limbajele orienta te obiect (Java, C#) s -au menținut în topul celor mai că utate limbaje
timp de 15 ani încoace.
10
Figura 2. Popularitatea limbajelor de programare din ultimii 15 ani. [15]
2.2 EXEMPLE DE APLICAȚII ORIENTATE OBIECT
În acest subcapitol sunt prezentate câteva aplicații orientate obiect din
domeniul sistemelor de gestiune a magazinelor de cărți, cu scopul de a evidenția
resursele și informațiile pe care un programator trebuie să le dețină în vederea
realizării unei aplicații de succes.
Un prim exemplu al unei astfel de aplicații este Smart Library 1.0 (figura 3) .
Acest sistem de gestiune a fost creat pentru a monitoriza ș i con trola tranzacțiile dintr –
o libră rie. Codul sursă a fost creat cu ajutorul mediului de lucru Netbeans 7.3.1 iar
baza de date asoci ată a fost realizată cu ajutorul unui SGBD și anume Mysql 5.0.
Aplicația prezintă 4 module principale după c um urmează:
o Inserarea informațiilor în baza de date;
o Extragerea informațiilor din baza de date;
o Afișarea unei liste cu că rțile împrumutate;
o Căutarea unei că rți.
11
De asemenea, această aplicație pune la dispoziția utilizatorului și o interfață
prietenoasă ce facilitează adăugarea sau m odificarea informațiilor unei că rți.
În imaginea de mai jos se pot observa prezența unor date cu caracter
informativ despre aplicație dar și despre autorul acesteia.
Figura 3. Informații despr e apl icația Smart Library 1.0 [ 1]
Avantajele utilizării acestei aplicații sunt:
Acces rapid la baza de date ;
Capacitate mare de stocare a informațiilor ;
Mod eficient de că utare;
Tranzacții efectuate rapid și fără erori.
Fereastra prin intermediul căreia utilizatorul acestei aplicații se poate loga în
sistem (figura 4) permite accesul la opțiuni precum adăugarea unei noi cărți în
librărie. Aceasta se face completând for mularul Book Register ilustrat mai jos
(figura 5).
12
Figura 4. Logarea în sistemul aplicației Smart Library 1.0 [1]
Figura 5. Adăugarea unei că rți în sistem [1]
13
Un alt exemplu de aplicație orientată obiect este Book Shop Management
System versiunea 1.0.0 a căre i principală caracteristică este de a ajuta utilizatorul să
economisească timp atunci câ nd dorește să acceseze anumite informații (figura 6) .
Avantajele utilizării acestui sistem de gestiune sunt:
o Prezen ța unei interfețe cu ajutorul că reia utilizat orul poate accesa toate
facilită țile acestui sistem;
o Datele că rților și ale cliențil or se pot î nregistra cu ușurință ;
o Previne lucrul cu documente care se pot pierde sau deteriora;
o Asigură securitatea datelor introdu se în baza de date a sistemului;
o Furnizează mai multă încredere pentru păstrarea informațiilor .
Acest sistem a fost realizat cu ajutorul limbajului de programare Visual Basic
care pune la dispo ziția utilizatorului o interfață a programului ușor de folosit ,
datorită prezenței unor componente v izuale precum ferestre, butoane , liste fără a
fi nevoie de scrierea de cod pentru acestea.
Figu ra 6. Ecranul principal al aplica ției Book Shop Management Syste m[12]
14
Componenta hardwa re care să asigure funcționarea eficientă a acestui sistem
este compusă din:
o Procesor de 166 MHz sau mai bun;
o 32 MB memorie Ram ;
o 50 MB memorie disponibilă pe hard disk;
o Monit or SVGA și imprimantă(opțional).
În urma prezentării pe scurt a acestor exemple am realizat o sinteză a
caracteristicilor aplicațiilor orientate obiect cu scopul de a extrage caract eristicile de
bază, ce trebuie să se regăsea scă într -o astfel de aplicație (tabelul 1).
Aplicații
Criterii Smart
Library 1.0 Book Shop
Management
System
Limbaj de programare orientat obiect
Conectarea la o baza de date
Prezența unei interfețe grafice ce
permite navigarea ușoară prin
aplicație
Este online
Folosește tehnologii web
Oferă instrumente pentru
optimizarea proce selor de gestiune
Tabel 1. Studiu comparativ al aplicaț iilor exemplificate anterior
15
CAPITOLUL 3. INSTRU MENTE SOFTWARE UTILI ZATE
3.1 ABORDAREA PROGRA MĂRII ORIENTATE OBIEC T
În acest subcapitol voi descrie pe scurt criteriile ce m -au determinat să folosesc
POO în realizarea aplicației mele.
Așa cum am menționat în subcapitolul 2.1 “ Actualitatea aplicațiilor orientate
obiect ” al acestei lucrări de licență, POO a fost creată pentru a rezolva problemele
întâmpinate în realizarea programelor de mari dimensiuni. Desigur că atunci câ nd un
programator folosește POO, acesta are posibilitatea de a construi un program bine
structurat datorită obiectelor din program care corespund cu obiectele din lumea
reală a utilizatorului.
În acest fel s -a observat fap tul că utilizarea POO conduce la creșterea
productivității și a clarității programelor.
Un program orientat pe obiecte combină datele și funcțiile create de
programator într -o clasă. Datele unei clase sunt reprezentate de variabile ș i membri
clasei iar fu ncțiile desemnează operațiile pe care membrii clasei le pot efectua.
O clasă poate primi următorii specificatori de format: public, private și
protected astfel încât membri publici ai unei clase pot fi accesați atât din interiorul
clasei dar și din afara ei, membrii privați sunt accesibili doar din interiorul clasei iar cei
protejați sunt publici pentru clasele derivate dintr -o clasă principală.
Un exemplu de clasă utilizată în aplicația realizată de mine, ai cărei membrii
sunt publici, poate fi observat în imaginea de mai jos (figura 7).
16
Figura 7. Exemplu de clasă cu specificatorul de format public
Alte câteva concepte de bază regăsite în utilizarea POO sunt:
Abstractizarea – tehnică utilizată în abordarea orientată o biect pentru a delimita
într-un mod clar comportamentul unui obiect de implement area acestui
comportament. Cu alte cuvinte abstractizarea este utilizată pentru a exprima
caracteristicile esențiale ale unui obiect c are fac ca acesta să se distingă de alte
obiecte;
Încapsularea – este procesul de compartimentare a elementelor care forme ază
structura și comportamentul unei abstracțiuni. Un avantaj al încapsulării este de a
permite modificarea programelor într -o manieră eficientă cu un efort limitat ș i
bine localizat;
Polimorfismul – reprezintă abilitatea unui program orientat obiect de a redefini i
metode pentru clasele derivate dintr -o clasă principală;
Moștenirea – reprezintă mecanismul prin care o clasă poate prelua structura și
compo rtamentul unei alte clas e, la care se adaugă elemente noi. Utilizarea
moștenirii facilitează polimorfism ul și încapsularea datorită faptului că aceasta
permite reutilizarea codului sursă.
namespace Licenta_v2.controllerDatabase {
public class AuthorC {
public AuthorC(){}
public author findByPk( int idAuthor) {
sqlcore. sqlcore command = new sqlcore. sqlcore();
MySqlDataReader returnDetails = command.querySelectSimple( "select
* from author where id=" + idAuthor);
returnDetails.Read();
author modelAuthor = new
author(Convert.ToInt32(returnDetails[ "id"]),
Convert.ToInt32(returnDetails[ "id_user" ]),
returnDetails[ "name"].ToString(),
Convert.ToDateTime(returnDetails[ "date_create" ]),
Convert.ToDateTime(returnDetails[ "date_change" ]));
return modelAuthor;
}
}
17
Un alt criteriu ce m -a motivat să utilizez POO a fost opțiunea de a construi un
model arhitectural folositor în structurarea aplicație i pe trei componente principale și
anume: componenta Model, componenta Views ș i un controler ce funcționează ca un
intermediar între cele lalte două componente.
Acest model arhitectural (MVC) este prezentat în subca pitolul 3.4 al acestei
lucră ri.
3.2 STOCAREA INFORMA ȚIILOR ÎN BAZA DE DAT E
În acest subcapitol sunt prezentate avantajele utilizării unei baze de date în
dezvoltarea produselor software folosite la gestiunea unui magazin de cărți.
Observăm cum activitatea de zi cu zi a oamenilor este influențată de o
cantitate uriașă de informații ce trebuie stocată și gestionată în funcție de necesi tățile
noastre. Pentru a stoca ș i gestiona acest volum de date într -un mod eficient suntem
nevo iți să apelăm la diverse metode, însă cea mai recomandată este utilizarea unui
sistem computerizat care să n e ușureze munca.
Spre exemplu, dacă unui angajat al unei anumite firme i se atribuie sarcina de a
sorta anumite informații din mai multe domenii, munca i s e îngreunează, iar căutarea
și sortarea informațiilor în funcție de necesități devine dificilă.
Astfel, prin inter mediul unui sistem computerizat, administrarea informațiilor
se simplifică și datele indispensabile se obțin mult mai repede. Nucleul unui astfel de
sistem informatic presupune existența a cel puțin o bază de date care stochează și
manipul ează informațiile.
“ Prin Bază de Date (BD) se înțelege un ansamblu de date structurate,
operațional înrudite, care descriu un anumit sistem – din punctul de vedere al
funcționalității și evoluției sale și care sunt memorate pentru un interval de timp, pe
un suport permanent de informație. ” (Vlădoiu, 2014). [9]
18
În proiectarea bazei de date, prima etapă și una dintre cele mai importante o
reprezintă alegerea unui S GBD (Dușmănescu, 2005). [2] “ Prin Sistem de Gestiune a
Bazelor de Date ( SGBD ) se înțelege un sistem software complex, care are rolul de a
permite administrarea unei baze de date. El controlează stocarea, managementul și
regăsirea datelor dintr -o bază de date. ”
Iată care sunt câteva dintre avantajele unui SGBD de care am ținut seamă în
dezvoltarea acestei aplicații:
o Acces eficient la date și pă strarea independenț ei lor;
o Integritatea ș i securitatea datelor;
o Administrarea datelor astfel încât timpul destinat dezvoltării aplicațiilor
să fie redus.
Pentru administrarea informațiilor din aplicația mea am folosit cel mai popular
SGBD la ora actuală și anume MySql însă u tilizarea acestuia împreună cu limbajul de
programare C# nu s -a putut face fă ră in stalarea u nei resurse speciale, care să
conecteze baza de date la aplicație. Este vorba despre resursa numită MySql.Data.dll
ce se poate instala cu ușurința direct de pe int ernet.
Instrumentul utilizat în construirea bazei de date asociată acestei aplicații este
Xamp pServer (figura 8) . Acest instrument permite dezvoltarea aplicațiilor cu baze de
date prin utilizarea serverului Apache, limbajului PHP și SGBD -ul MySql.
Figura 8 Fereastra de control XamppServer
19
3.3 PROGRAMAREA Î N VISUAL STUDIO CU A JUTORUL LIMBAJULUI
DE PROGRAMARE C#
Așa cum indică și titlul acestui subcapitol, în continuare voi prezenta câteva
informații de bază despre limbajul C# și modul în care acesta poate fi folosit cu
instrumentul Visual Studio.
C# este un limbaj de programare orientat obiect ce conține circa 80 de cuvinte
cheie si 12 tipuri de date predefinite și face parte din arhitectura .NET (.NET
Framework) . Acestea pot fi observate în figura 9 împreună cu o serie de cuvinte cheie
contextuale (figura 10), utilizate pentru a da semnificații specifice codului sursă .
Figura 9. Cuvinte cheie în C# [13]
Figura 10. Cuvinte cheie contextuale în C# [13]
Limbajul C# cuprinde drept elemente fundamentale și principiile de bază ale
POO (încapsulare, moștenire, polimorfism) împreună cu sintaxa și principiile de
programare existente în limbajul C++.
20
Pe parcursul dezvoltării limbajului C#, au fost adăugate unele funcții (interfețe
si delegări), altele au fost diversificate (tipul de date struct ), altele au fost modificate
(tipul string ) și alte funcții au fost eliminate (moștenirea multiplă și pointerii către
funcții).
Caracteristicile de bază ale acestui limbaj sunt:
Simplitate si productivitate în programare;
Este un limbaj orientat obiect;
Permite dezvoltarea aplicațiilor desktop d ar și a aplicațiilor Web prin
conectarea lor la câte o bază de date;
Oferă suport pentru dezvoltarea componentelor software cu posibilitatea
adaptării lor cu ușurință în diferite regiuni ale lumi unde se vorbesc limbi
diferite;
Gestionează în mod automat memoria utilizată, eliberarea memoriei fiind o
caracteristică importantă a limbajului;
Aplicațiile scrise în C# funcționează sub o mare varietate de sisteme de operare
cat și p entru sisteme dedicate (embeded systems). Acestea din urmă se înt ind
de la dispo zitive portabile (telefoane mobile, tablete, ceasuri digitale
inteligente) până la dispozitive staționare (controlere pentru automatizarea
unor linii de producție).
Mediul de dezvoltare cu ajutorul căruia am scris codul sursă al acestei aplicații
este Visu al Studio versiunea Comunnity 2015.
Acesta cuprinde un set complet de instrumente folosite pentru a dezvolta
aplicații ASP.N ET, aplicații desktop și mobile și are o comunitate mare de utilizatori
și dezvoltatori peste tot în lume, fiind un produs open -source.
21
Un alt avantaj deosebit al utilizării acestui mediu de dezvoltare îl reprezintă
existența opțiunii de autocompletare a codului sursă. Această opțiune a fost de folos
la scrierea rapidă a programului prin sele ctarea metodei dorite (figura 11 ). Navi garea
printre metodele oferite de VS (Visual Studio) se poate face prin apăsarea tastelor
“↓” sau “↑” și apoi tasta “ENTER”.
Figura 11.Accesarea autocompletării codului sursă în Visual Studio
3.4 STRUCTURAREA APL ICAȚIEI SUB FOR MA UNUI MVC
În urma studiului realizat, am considerat necesar structurarea aplicației sub
forma unui MVC așa cum am menționat și în capitolul Introducere al acestei lucrări.
În continuare voi prezenta avantajele utilizării unui astfel de model
arhitectu ral și modul în care acesta ajută la îmbunătățirea eficienț ei aplicației.
Un model arhitectural de tip MVC (Model -View -Controller) reprezintă o
tehnică utilizată în domeniul dezvoltării aplicațiilor software. Acest m odel are ca
principal obiectiv î mpărțirea aplicației în trei componente interconectate cu scopul de
a separa interfața aplicației de restul sistemului.
22
Această tehnică prezintă un avantaj deosebit în cazul în care utilizatorul
aplicație i dorește să modifice anumite pă rți ale interfeței grafice, deoarece
eventualele modificări nu vor afecta alte nivele de date din sistem.
Prin separa rea acestor componente majore ale sistemului, acest model
arhitectural permite reutilizarea eficientă a codului sursă dar și posibilitatea de a
dezvolta o a plicație în paralel.
Componentele principale ale modelului de tip MVC sunt ilustrate in f igura 12
după cum urmează:
Figura 12. Componentele unui MVC [8]
Componenta Model – reprezintă componenta centrală a acestui model.
Aceasta exprimă comportamentul aplicației într -un mod independent față de
interfața utilizatorului și gestionează datele, parte a logică și regulile aplicației;
Componenta View – reprezintă totalitatea parților de interfață grafică a
aplicației ;
Componenta Controller – reprezintă un intermediar între cele lalte două
componente deoarece primește date pe care ulterior le convertește în comenzi și le
trimite m ai departe componentelor Model ș i View.
23
Printre avantajele utilizării unui model MVC se pot enumera:
o Dezvoltarea în mod simultan a aplicației – mai mulți dezvo ltatori pot lucra și
realiza în același timp componente le Model, View sau Controller fă ră a depinde
unul de celălalt;
o Gruparea acțiunilor asemănătoare pe toate cele trei componente;
o Modificarea cu ușurința a codului sursă precum și posibilitatea unor dezvo ltări
viitoare ale aplicației;
o Componenta model poate deține mai multe componente View.
Un dezavantaj al uti lizării unui astfel de model tip MVC poate fi considerat faptul
că navigarea în codul sursă este complexă d eoarece modelul adaugă aplicației noi
straturi de abstractizare.
24
CAPITOLUL 4. ANALIZA, P ROIECTAREA, IMPLEMENTAREA ȘI
TESTAREA APLICAȚIEI
Pentru a realiza o aplica ție software în con formitate cu nevoile viitorului
utilizator, programatorul trebuie să se concentreze asupra unor acțiuni, care dacă sunt
realizate în mod succesiv vor forma etapele dezvoltă rii unui produs software .
Aceste etape de dezvoltare sunt utilizate cel mai des în domeniul ingineriei
programă rii dar pot fi utilizate cu ușurința și în alte domenii datorită caracterului lor
general.
În realizarea aplicației prezentată în această lucrare de licență am respectat
următoarele etape de dezvoltare:
Analiza problemei ;
Proiectarea aplicației ;
Implementarea aplicației ;
Testarea programului și asigurarea calității produsului software .
4.1 ANALIZA APLICAȚIEI
Pe parcu rsul acestui subcapitol sunt prezentate informații cu privire la
problemele ce pot fi evitate datorită utilizări i acestui sistem de gestiune a magazinului
de cărți, dar și o listă care să cuprindă obiectivele clare pe care a plicația trebuie să le
îndeplinească.
În această fază de dezvoltare a aplicației mele, am realizat o listă formată din
perspectiva unui potențial utilizator , ce cuprinde cerințele exacte pe care sistemul de
gestiune trebuie să le îndeplinească. Aceste cerințe vor fi descrise după cum urmează:
Eliminarea lucrului cu documente ce se pot pierde sau deteri ora;
Ușurarea muncii depusă de angajații magazinului de cărți;
Efectuarea unor tranzacții rapide și fără erori;
25
Aplicația trebuie să dețină un caracter de adaptabilitate si flexibilitate astfel
încât să poate fi utilizată ș i pentru magazine ce comercialize ază altă gamă de
produse;
Accesul clientului la informații într-un timp foarte scurt ;
Reținerea informațiilor privind datele clienților, furnizorilor, angajaților sau
produselor magazinului;
Gestiunea eficientă a tranzacțiilor financiare ale magazinului pr ecum și lucrul
angajaților cu publicul;
Realizarea unei interfețe prietenoase ce permite utilizatorului o navigare
ușoară în aplicație.
Utilizarea unui sistem de gestiune a magazinelor de cărți, care îndeplinește
obiectivele mai sus menționate va oferii cl ientului plăcerea de a -și achiziționa
cărțile preferate prin eliminarea apariției unor posibile situații neplăcute.
Tot în această etapă a realizării sistemului de gestiune, am descoperit faptul că
în cadrul funcționării acestuia participă trei actori (ter men preluat din UML) și
anume clientul, agentul de vânzări și managerul magazinului de cărți,.
Prezența acestor actori m-a determinat să cr eez trei conturi de utilizator care
să ofere utilizatorului opțiuni diferite .
Conturile de utilizator evidențiază rolul fiecărui actor participant la sistem după
cum urmează:
1. Contul Client oferă utilizatorului următoarele opțiuni:
o Logarea în sist em;
o Căutarea unei cărți și vizualizarea detaliilor acesteia;
o Adăugarea cărților dorite într -un coș de cumpărături;
o Plasarea unei precomenzi către agentul de vânzări.
26
2. Contul Agent prezintă următoarele opțiuni:
o Logarea în sistem;
o Căutarea unei cărți în baza de date asoci ată sistemului de gestiune;
o Vizualizarea unei liste ce conți ne toate precomenzile efectuate de clienții
magazi nului;
o Căutarea în lista de precomenzi în funcție de numele clientului și vizualizarea
conținutului precomenzii;
o Facturarea unei precomenzi și vizualizarea acesteia în format electronic;
o Vizualizarea listei de clienți și modificarea la cerere a datelor ace stora.
3. Contul Manager prin care utilizatorul poate gestiona magazinul de cărți
având la dispoziție următoarele opțiuni:
o Logarea la sistem;
o Vizualizarea listei de cărți și căutarea unei cărți după titlul acesteia;
o Adăugarea, ștergerea sau editarea datelor unei cărți din baza de date a
magazinului;
o Vizualizarea listei de clienți și că utarea în listă după numele clientului;
o Adăugarea, ștergerea sau editarea datelor unui client.
o Vizualizarea listei de angajați și că utarea în listă după numele angajatului;
o Adăugarea, ștergerea sau editarea datelor unui angajat;
o Vizualizarea listei de furnizori și că utarea în listă con form denumirii firmei ce
furnizează produsele magazinului;
o Adăugarea, ștergerea sau editarea datelor unui furnizor;
27
4.2 PROIECTAREA APLI CAȚIEI
În acest subcapitol va fi prezentată arhitectura acestei aplicații, aceasta fiind
stabilită pe baza obiectivelor prezentate în subcapitolul precedent.
Arhitectura acestei aplicații este formată din totalitatea componentelor
sistemului împreuna cu modul a cestora de a se comporta, interfața grafică a aplicației
cu care utilizatorul va interacționa precum și baza de date asociată sistemului.
Pentru a prezenta proiectarea bazei de date asoci ată acestei aplicații trebuie
menționat faptul că aceast a cuprinde înregistrări fictive, create în scopul testării
aplicației. Am realizat această bază de date cu scopul de a eficientiza procesul de
căutar e a datelor despre cărți, clienț i, angajați sau furnizori. Un alt motiv ce m -a
determinat să folosesc o baz ă de date a fost posibilitatea de stocare a datelor într -un
mediu securizat, acest lucru fiind posibil datorită opțiunilor furnizate de SGBD -ul
MySql.
În figura 13 a acestei lucrări este prezentată diagrama entitate legă tură a bazei
de date asociată siste mului de gestiune al magazinului de cărți.
28
Figura 13. Diagrama entitate -legătură a bazei de date asociată acestei aplicații
29
Între mulțimil e entitate afișate în figura 13 există următoarele relații de
legătură:
O firmă are mai mu lți angajați, mai mulț i angajați fac parte dintr -o firmă
(legătură 1 -m);
O firmă are mai mulți furnizori, mai mulți furnizori sunt parteneri ai unei firme
(legătură 1 -m);
O firmă are mai mulți clienți, mai mulți clienți folosesc serviciile unei firme
(legă tură 1 -m);
O firmă are mai multe cărți, mai multe cărți aparțin unei firme (legătură 1 -m);
O carte este scrisă de un autor, un autor poate scrie o carte (legătură 1 -1);
O carte se încadrează într -o categorie, o categorie poate încadra o carte
(legătură 1 -1);
Un client poate plasa mai multe comenzi, mai multe comenzi pot fi plasate de
către un client (legătură 1 -m);
Un client se poate încadra într -un profil, un profil poate definii un client
(legătură 1 -1);
Un utilizator al sistemului poate fi un client, un client poate fi un utilizator al
sistemului (legătură 1 -1);
Un utilizator de sistem se poate încadra într -un tip de utilizator, un tip poate
încadra un utilizator al sistemului (legătură 1 -1);
În continuare voi descrie cele 11 tabele ce alcătuiesc structura bazei de date
asociată acestei aplicații:
1. Tabela company afișată în figura 14 a acestei lucrări, prezintă următoarele
câmpuri și tipul acestora (figura 15 ):
Id, int (5); name , varchar (30); reg_com, varchar (50); cui, varchar (50); address, text;
iban, varchar (255); bank, text; capital, varchar (255).
30
Figura 14. Tabela company
Figura 15. Câmpurile tabelei company și tipul acestora
2. Tabela books afișată în figura 16 prezintă următoarele câmpuri:
Id, int (11); id_company, int (15); id_category, int (11); id_author, int (11); title,
varchar (255); price, double (10,2); quantity, int (11); date_create, datetime ;
date_change, datetime.
Figura 16. Tabela books
31
3. Tabela category (figura 17 ) prezintă următoarele câmpuri:
Id, int (11); id_user, int (11); name, varchar (255); date_create, datetime;
date_change, datetime.
Figura 17. Tabela category
4. Tabela author (figurile 18 și 19 ), prezintă următoarele câmpuri:
Id, int (11); id_user, int (11); name, varchar, text ; date_create, datetime;
date_change, datetime.
Figura 18. Prima parte a tabelei author
32
Figura 19. Ultima parte a tabelei author
5. Tabela client_system (figura 20 ), prezintă următoarele câmpuri:
Id, int (11); id_company, int (15); id_profile, int (256) ; id_type, int (255); username,
varchar (32); password, varchar (32).
Figura 20. Tabela client_system
33
6. Tabela employes (figura 21 ), prezintă următoarele câmpuri:
Id, int (11); id_company, int (11); funcția, varchar (50); nume, varchar (50);
prenume, varchar (50); adresa, varchar (50); nr_telefon, text.
Figura 21. Tabela employes
7. Tabela orders (figura 22 ), prezintă următoarele câmpuri:
Id, int (11); id_client, int (11); id_products, varchar (255); quantity, varchar (255);
status, int (11); total_pay, double (10,2); date_create, datetime .
Figura 22. Tabela orders
8. Tabela profile_clients (figura 23 ), prezintă următoarele câmpuri:
Id, int (11); name, varchar (255); adress, text; phone, text; email, varchar (255);
cnp, varchar (255); cnp_series, varchar (255); date_create, datetime; date_change,
datetime.
34
Figura 23. Tabela profile_clients
9. Tabela providers (figura 24 ), prezintă următoarele câmpuri:
Id, int (5); id_company, int (11); name, varchar (255); adresa, varchar (255);
nr_te lefon, int (11).
Figura 24. Tabela providers
35
10. Tabela type_user (figura 25 ), prezintă câmpul id, int (11) și câmpul nume de
tipul varchar (255).
Figura 25. Tabela type_user
11. Tabela user_system (figura 26 ), este formată din câmpurile id, int (11);
id_profile, int (11); id_type, int (11); username, varchar (32); password, varchar
(32).
Figura 26. Tabela user_system
Componentele și interfața grafică ce formează arhitec tura sistemului de
gestiune al magazinului de cărți sunt prezentate în următoarele paragrafe .
Cu privire la interfața aplicației trebuie menționat faptul că aceasta a fost
realizată astfel încât să nu prezinte o complexitate ridicată pentru ca utilizatorul să nu
întâmpine probleme în momentul accesării acesteia.
Compone ntele interfeței grafice se regăsesc în folderul views (figura 27 ) al
proiectului Licența_v2 . Acestea sunt formate la rândul lor din diferite componente
precum butoanele, grid -urile , combobo x-urile, grupbox -urile, toate acestea fiind
disponibile din meniul ToolBox prezent în mediul de dezvoltare Visual Studio (VS).
Pentru fiecare dintre componentele mai sus menționate, VS poate genera
corpul funcțiilor corespunzătoare fiecărei componente.
36
Figura 27. Conținutul folderului Views din proiectul Licența_v2
Un exemplu de componentă a interfeței grafice îl reprezintă fereastra de
logare (figura 28 , Form1.cs din folderul views ) ce-i va permite utilizatorului conectarea
la sistem prin accesarea unui cont, în funcție de nevoile acestuia.
Mai multe informații asupr a modului de funcționare al aplicației sunt
disponibile în subcapitolul 4.4 intitulat “Testarea aplicației”.
37
Figura 28. Fereastra de loga re
4.3 IMPLEMENTAREA AP LICAȚIEI
În acest subcapitol vor fi prezentate cele mai importante s ecvențe de cod sursă
astfel încâ t, citi torul acestei lucrări de licență să dobâ ndească cunoștințe asupra
modului de funcționare al aplicației prezentate.
Primul pas al implementării acestui sistem de gestiune îl reprezintă adăugarea
conectorului MySql.Data.dll la referințele acestui proiect astfel: din meniul Solution
Explorer al mediul de dezvoltare VS alegem References, la evenimentul c lick-dreapta
vom s electa opț iunea Add Reference ce va deschide fereastra Reference Manager –
Licenta_v2 (figura 29 ).
Figura 29. Referance Manager – Licența_v2
38
Folosindu -ne de bara de că utare existentă în colțul din dreapta -sus al ferestrei
Referenc e Manager putem căuta și adăuga conectorul MySql așa cum este ilustrat în
figura 30 .
Figura 30. Adăugarea conectorului Mysql
După ce conectorul MySql a fost adăugat la referințele proiectului, am
implementat clasa sqlcore.cs al cărei cod sur să (figura 31 ) reali zează conectarea la
baza de date asociată aplicației.
Clasa sqlcore.cs a fost adăugată în folderul sqlcore din proiectului Licența_v2
prin accesarea ferestrei Add New Item (figura 32 ), unde se selectează opțiunea Class
și se efectuează click pe butonul Add.
În mod a semănător s -au adăugat toate celelalte clase ale ale acestui proiect.
namespace Licenta_v2.sqlcore {
class sqlcore {
MySql.Data.MySqlClient. MySqlConnection connexion = new
MySql.Data.MySqlClient. MySqlConnection (@"Data
Source=localhost;Database=catalin;UserID=root;password='
'");
public sqlcore() {
if (connexion.State != ConnectionState .Open) {
try {
connexion.Open();
} catch (ArgumentException a_ex) {
Console.WriteLine( "Check the Connection String." );
Console.WriteLine(a_ex.Message);
Console.WriteLine(a_ex.ToString());
}
Figura 31. Fragment de cod sursă din clasa sqlcore.cs
39
Figura 32. Adăugarea unei noi clase
După cum am menționat și în subcapitolul 3.4 al prezentei lucrări, arhitectura
acestei aplicații a fost realizată sub forma unui MVC (Model -View -Controller).
În continuare este prezentat modul de funcționare al acestui model
arhitectural.
După conectarea aplicației la baza de date, următo rul pas este reprezentat de
împă rțirea proiectului Licența_v2 în foldere cu nume sugestiv ce redă scopul claselor
stocate în acestea. Aceste foldere sunt: controllerDatabase , modelDatabase și Views .
Folderul controllerDatabase conți ne următoarele clase: AgentC.cs; AuthorC.cs;
BooksC.cs; CategoryC.cs; CompanyC.cs; EmployesC.cs; ManagerC.cs; OrdersC.cs;
ProvidersC.cs; UserC.cs.
Folderul modelDatabase conține următoarele clase: : agent.cs; author.cs;
books.cs; category.cs; client_systems.cs; company.cs; employes.cs; orders.cs;
profile_clients.cs; providers.cs;
Foderul Views con ține toate componentele interfeț ei grafice cu ajutorul căreia
utilizatorul va naviga în sistem după cum urmează: addBook.cs; addClient.cs;
addEmploy ee.cs; addProvider.cs; Agent_vanzări.cs; Client.cs;
40
detalii_precomandă.cs; Form1.cs; Înregistrar.cs; Manager.cs; modificare_client.cs;
shcart.cs.
Pentru a expl ica modul în care clasele acestei aplicații interacționează între ele,
în continuare voi prezenta câte o clasă din fiecare folder menționat anterior, și
anume: clasa books.cs din folderul modelDatabase ( figura 33 ), clasa BooksC.cs din
folder ul controllerDatabase (figura 34 ) și clasa Clien t.cs din folderul Views (f igura 37 ).
După cum putem observa în figura de mai sus, în clasa books.cs din folderul
modelDatabase al aplicației noastre, se implementează un constructor cu param etrii
ce poarta numele clasei iar fiecărui câ mp al tabelei books din baza de date îi este
asociat câte un parametru al constructorului.
public class books {
public books(int id_model = 0, int id_category_model = 0,
int id_author_model = 0, int id_employee_model = 0, string
title_model = "", double price_model = 0.00, int quantity_model =
0, DateTime date_create_model = new DateTime (), DateTime
date_change_model = new DateTime ()) {
this.id = id_model;
this.id_category = id_category_model;
this.id_author = id_author_model;
this.id_employee = id_employee_model;
this.title = title_model;
this.price = price_model;
this.quantity = quantity_model;
this.date_create = date_create_model;
this.date_change = date_change_model;
}
public int id { get; set; }
public int id_category { get; set; }
public int id_author { get; set; }
public int id_employee { get; set; }
public string title { get; set; }
public double price { get; set; }
public int quantity { get; set; }
public DateTime date_create { get; set; }
public DateTime date_change { get; set; }
}
}
Figura 33. Codul sursă al clasei books.cs din folderul modelDatabase
41
În ultima parte a codului sursă din clasa afișată în imaginea de mai sus
obse rvăm faptul că pentru fiecare câ mp al tabelei books din baza de date se definesc
proprietăți prin inte rmediul accesorilor set si get.
În clasa BooksC.cs din folderul controllerD atabase, se cre ează o l istă de cărți ce
include toate î nregistră rile din tabel a books, acestea fiind afișate într -o componentă
de tip dataGridView atunci când utilizatorul va apela funcția butonului GetBooks din
fereastra Client.cs ( figura 36 ).
În conținutul acest ei clase se regăsește o nouă instanța a obiectului command
ce aparține clasei sqlcore.cs despre care am discutat în s ubcapitolul anterior. Prin
intermediul acestui obiect se apelează funcția querySelectMultiple ( figura 35 ) care
execută o cerere de informații din baza de date ș i anume selectarea î nregistrărilor din
tabela books și afișarea lor într -un tabel.
class BooksC {
public List<books> findAll() {
DataTable returnQuery = new DataTable ();
sqlcore. sqlcore command = new sqlcore. sqlcore();
List<books> listBooks = new List<books>();
returnQuery = command.querySelectMultiple( "select * from
books");
foreach (DataRow row in returnQuery.Rows) { // get columns
books listBooksArr = new books();
listBooksArr.id = Convert.ToInt32(row.ItemArray[0]);
listBooksArr.id_category =
Convert.ToInt32(row.ItemArray[1]);
listBooksArr.id_author =
Convert.ToInt32(row.ItemArray[2]);
listBooksArr.title = row.ItemArray[3].ToStrin g();
listBooksArr.price =
Convert.ToDouble(row.ItemArray[4].ToString());
listBooksArr.quantity =
Convert.ToInt32(row.ItemArray[5]);
listBooksArr.date_create =
Convert.ToDateTime(row.ItemArray[6]);
listBooksArr.date_change =
Convert.ToDateTime(row.ItemArray[7]);
listBooks.Add(listBooksArr);
}
return listBooks;
}
}
Figura 34. Fragment de cod sursă din clasa BooksC.cs a folderului controllerDatabase
42
După cum se poate observa din figura de mai sus, în ace astă funcție se cre ează
cate o nouă instanță a claselor BooksC, CategoryC și AuthorC , apoi se formează o listă
de cărți în care se apelează funcția findAll din clasa BooksC.cs
public DataTable querySelectMultiple( string command) {
MySqlCommand comandSql =
connexion.CreateCommand();
comandSql.CommandType = CommandType .Text;
comandSql.CommandText = command;
comandSql.ExecuteNonQuery();
DataTable dataReturn = new DataTable ();
MySqlDataAdapter dataAdapt = new
MySqlDataAdapter (comandSql);
dataAdapt.Fill(dataReturn);
return dataReturn;
}
Figura 35. Funcția querySelectMultiple din clasa sqlcore.cs
private void button1_Click( object sender, EventArgs e) {
dataGridView1.DataSource = null;
dataGridView1.Rows.Clear();
BooksC listBooksController = new BooksC();
CategoryC catId = new CategoryC ();
AuthorC authId = new AuthorC();
List<books> listBooks = listBooksController.findAll();
int row = 0;
dataGridView1.DataSource = null; // bug f ix for search
something and click list book again
if (listBooks.Count != 0)
{
foreach (books item in listBooks)
{
dataGridView1.Rows.Add();
dataGridView1.Rows[row].Cells[1].Value = item.id;
dataGridView1.Rows[row].Cells[2].Value = item.title;
dataGridView1.Rows[row].Cells[3].Value =
catId.findByPk(item.id_category).name;
dataGridView1.Rows[row].Cells[4].Value =
authId.findByPk(item.id_author).name;
dataGridView1.Rows[row].Cells[5].Value = item.price;
dataGridView1.Rows[row].Cells[6].Value = item.quantity;
row++;
}
}
else
{
MessageBox .Show(errorName.getError( "emptyList" ));
}
}
Figura 36. Funcția butonului GetBooks din clasa Client.cs
43
Odată cu apelul funcției findAll , pentru fiecare carte din listă se va insera în
componenta dataGridView1 câte un râ nd ce conține înregistrările fiecărui câmp din
tabela books a bazei de date.
Trebuie menționat faptul că pentru fiecare dintre rândurile co mponentei
dataGridView1 , în celulele trei respectiv patru, se apelează funcția findByPK ce se
regăseș te în clasa AuthorC.cs (figura 37 ) respectiv CategoryC.cs (figura 38 ).
namespace Licenta_v2.controllerDatabase {
public class AuthorC {
public AuthorC(){}
public author findByPk( int idAuthor) {
sqlcore. sqlcore command = new sqlcore. sqlcore();
MySqlDataReader returnDetails =
command.querySelectSimple( "select * from author where id=" +
idAuthor);
returnDetails.Read();
author modelAuthor = new
author(Convert.ToInt32(returnDetails[ "id"]),
Convert.ToInt32(returnDetails[ "id_user" ]),
returnDetails[ "name"].ToString(),
Convert.ToDateTime(retu rnDetails[ "date_create" ]),
Convert.ToDateTime(returnDetails[ "date_change" ]));
return modelAuthor;
}
Figura 37. Funcția findByPk din clasa AuthorC.cs
namespace Licenta_v2.controllerDatabase {
class CategoryC {
public CategoryC() { }
public category findByPk( int idCategory) {
sqlcore. sqlcore command = new sqlcore. sqlcore();
MySqlDataReader returnDetails = command.querySelectSimple( "select *
from category where id=" + idCategory);
category modelCategory = new category ();
if (returnDetails.Read()) {
modelCategory = new
category (Convert.ToInt32(returnDetails[ "id"]),
Convert.ToInt32(returnDetails[ "id_user" ]),
returnDetails[ "name"].ToString(),
Convert.ToDateTime(returnDetails[ "date_create" ]),
Convert.ToDateTime(returnDetails[ "date_change" ]));
}
return modelCategory;
}
Figura 38. Funcția findByPk din clasa CategoryC.cs
44
În concluzie, pentru a afișa lista cărț ilor din tabela books a bazei de date, se vor
executa următoarele operații:
1. Accesarea butonului GetBooks din clasa Client.cs;
2. Formarea unei liste de cărți prin respectarea modelului din clasa books.cs
3. Apelul funcției findAll din clasa BooksC.cs;
4. Apelul funcției querySelectMultiple din clasa sqlcore.cs;
5. Apelul funcției findByPk din clasele CategoryC.cs și AuthorC.cs.
Toate cel elalte opțiuni pe care utilizatorul acestei aplicații le poate accesa se
vor executa în mod similar cu cele prezentate pe parcursul acestui subcapitol.
4.4 T ESTAREA APLICAȚIEI
În acest subcapitol vor fi prezentați pași i ce trebuiesc urmați de către
utilizatorul acestei aplicații în vederea unei funcționări corecte și eficie nte a sistemului
de gestiune pentru magazinul de cărți.
În mom entul rulării acestei aplicații, utilizatorul va accesa fereast ra de logare în
sistem (figura 39 ) de unde se poate conecta la sistem prin intermediul conturilor
Client, Agent vânzări sau Manage r.
Figura 39. Fereastra de logare
45
Dacă utilizatorul aplicației dorește să joace rolul de client al sistemu lui, acesta
va accesa butonul Înregistrare date care va d eschide fereastra Înregistrare (figura 40 )
unde este necesară c ompletare a unui formular. Odată completat f ormularul,
utilizatorul va apă sa click pe butonul Înregistrare iar datele completate se vor reține în
baza de date a aplicației.
Figura 40. Fereastra Înregistrare
1. Contul Client
Pentru logarea în sistem, se vor alege numele de utilizator și parola introduse în
formularul de înregistrare, acestea se vor tasta în fereastra de logare, se va alege
contul Client și se va executa click pe butonu l “Conectare”.
În caz de insucces, aplicația va trimite un mesaj de eroare ce va atrage atenția
utilizatorului cu privire la corectitudinea datelor introduse, iar în cazul în care logarea
s-a realizat cu succes, se va deschide fereastra “Client” prezentată în figura 41 .
46
Din această fereastră, clientul poate accesa o listă ce cuprinde toate cărțile
disponibile în magazin, poate căuta o carte după titlul acesteia, are posibilitatea să -și
formeze un coș de cumpărături și să plaseze o precomandă către agentul de vânzări al
magazinului.
Figura 41. Fereastra Client. Logarea clientului 1 în sistem
Prin apăsarea butonului Cărți se va afișa lista cărților disponibile împreună cu
toate da tele aferente acestora (figura 42 ).
47
Figura 42. Lista cărți lor disponibile
Prin bifarea căsuțelor din dreptul fiecărei cărți, clientul poa te selecta produsele
dorite și î și poate forma propri ul coș de cumpărături iar prin apăsar ea butonului Coș
de cumpărături se va deschide fereastra cu același nume (figura 43 ), unde clientul va
avea acces la lista produselor selectate anterior.
Figura 43. Fereastra coș de cumpărături
48
În tabelul afișat, câmpul Unitate este editabil astfel încât clientul poate
comanda una sau mai multe unități ale produsului dorit.
Prin apăsarea butonului Finalizează precomanda , clientul plasează către
agentul de vânzări o precomandă a produselor dorite.
Acestea fiind opțiunile accesibile din contul Client, vom presupune faptul că
utilizatorul acestei aplicații dorește să se logheze la sistem prin contul Agent Vânzări.
2. Contul Agent Vânzări
Pentru logarea în contul Agent Vânzări, utilizatorul trebuie să introducă în
fereastra de logare următoarele date: username -ul agent și parola password ; trebuie
să bif eze opțiunea Agent Vânzări și să apese click pe butonul Conectare .
În cazul în care conectarea la sistem s -a realizat cu su cces, se va deschide
fereastra Agent _Vânzări prezenta tă în figura 44 .
Figura 44. Fereastra Age nt Vânzări
49
Opțiunile pe care utilizatorul le poate accesa din contul Agent Vânzări sunt
următoarele:
Afișarea unei liste ce cuprinde toate cărțile disponibile în magazin și
posibilitatea de a căut a o carte din această listă după titlul acesteia;
Afișarea unei liste a tuturor precomenzilor făcute de clienții magazinului
împreună cu opțiunea de a căuta o precomandă în funcție de nu mele clientului
care a plasat -o (figura 45 );
Vizualizarea c onținutu lui unei precomenzi (figura 46);
Emiterea facturii în format .pdf pentru o precomandă (figura 47);
Afișarea listei ce cu prinde toate informațiile perso nale ale clienților din baza de
date împreună cu posibilita tea modificării acestora da r și ș terge rii lor
(figura 48 );
Căutarea anumitor informații despre un client pe baza numelui acestuia.
Accesarea listei precomenz ilor se face prin apăsarea de că tre uti lizator a
butonului Precomenzi .
Figura 45. Lista de precomenzi.
50
Pentru a căuta o precomandă anume, agentul de vânzări va tasta în bara de
căutare a acestei ferestre numele clientului ce a plasat -o, iar apoi pri n apăsarea
butonului de căutare, lista precomenzilor va fi filtrată și se va afișa rezultatul căutării.
În cazul în care agentul tastează un nume de client care nu a plasat nici -o
precomandă, acesta va primi din partea aplicației un mesaj de eroare.
Conținutul unei precomenzi se poate accesa prin selectarea unui rând din listă
și apăsarea unui dublu -click în d reptul coloanei Nume din tabel.
Figura 46. Conținutul precomenzii clientului 1
Primind acordul clientului, agentul de vânz ări poate factura o precomandă prin
selectarea ei și apăsarea butonului click -dreapta al mouse -ului de unde va alege
opțiunea Facturează .
51
Figura 47. Factura emisă a clientului Petre Cristina.
După cum se poate observa din i maginea de mai sus, această fac tură conține
informații ale magazinului de cărț i “SC. O carte pe săp tămână . SA”, dar și informații ale
clintului împreună cu conținutul comenzii efectuate.
Eliberarea acestei facturi reprezintă pasul în care se finalizează toate
tranzacțiile financiare ale magazinului.
Trebuie menționat și faptul că în momentul efectuării unei precomenzi, stocul
produselor comandate se actualize ază iar în momentul în care un produs are stocul
epuizat, utilizatorul aplicației va primii un mesaj de avertisment.
În cea ce priv ește inform ațiile despre clienți (figura 48 ), acestea se pot accesa
prin apăsarea butonului etichetat Listă Clienți .
52
Figura 48. Lista clienților din baza de date a sistemului de gestiune
Datele din această listă se pot modifica cu ușurința prin deschiderea ferestrei
de modificare a datelor (figura 49 ). Aceasta se acces ează prin selectarea unui client
din listă și apăsarea butonului Modifică din partea de jos a ferestrei.
Figura 49. Fereastra de editare a datelor clienților
53
După efectuarea m odificărilor dorite, utilizatorul va apăsa butonul Modificare
prezent în figura de mai sus.
Pentru ștergerea unui client din sistem, agentul de vânzări va selecta clientul
pe care dorește să -l steargă și va apasa butonul Șterge , moment în care se va deschi de
o fereastră de confirmare (figura 50 ).
Figura 50. Mesaj de confirmare pentru ștergerea unui client din sistem
În cazul în care utilizatorul va dori să caute informații ale unui anumit client din
siste m, acesta va tasta în bara de că utare numele clientului iar prin apăsarea
butonului de căutare lista va afișa rezultatul acestei operații.
3. Contul Manager
În continuare voi prezenta cazul în c are utilizatorul aplicației se v a loga la
sistem prin intermediul contului Manager pentru care va trebui să introducă
usernam e-ul și parola. Acestea sunt : manager și password . Dacă aceste date vor fi
introduse greșit aplicația va afișa un mesaj de eroare.
Odata ce concectarea la sistem s -a realizat cu su cces, se va deschide fereastra
Manager de unde utilizatorul poate accesa următoarele opțiuni:
Afișarea listei de cărți cu posibilitatea gestionării acestora;
Deschiderea ferestrei Adaugă Carte (figura 51 ) ce pune la dispozitia
managerului de sistem posibilitatea de a adăuga noi cărți în sistem și de a
modifica proprietățile acestora;
54
Afișarea listei de clienți ai sistemului împreună cu opțiunea de a modifica
datele acestora;
Gestiunea angajaților/ furnizorilor magazinului cu posibilitatea de a adăuga,
modifica sau șterge informațiile acestora. (figurile 52, 53, 54, 55 ).
Figura 51. Fereastra Adaugă Carte
Pentru a adăuga o carte în baza de date a acestei aplicații, managerul
magazinului trebuie să completeze formularul prezentat în figura de mai sus.
Mai exa ct, este necesară completarea câmpuri lor titlu, preț și stoc în timp ce
autorul și categoria din care face parte cartea respe ctivă se pot alege fiecare din câte
o listă. Dacă informațiile despre categorie și autor nu sunt prezente în aceste lis te, ele
vor fi introduse manual prin completarea formularului Itemuri auxiliare .
Afișarea listei clienților din contul Manager se face într -un mod asemănător cu
accesarea aceleiași liste din contul Agent cu mențiunea următoare: ștergerea
informațiilor despre clienți i magazinului de cărți se face prin apăsarea butonului click –
dreapta al mous e-ului și selectarea opțiunii Șterge . Aplicația va afișa un mesaj de
confirmare după care se va executa comanda de ștergere.
Afișar ea listei de angajați (figura 52 ), se accesează împreună cu opțiunile de
modificare și ștergere a datelor acestora.
55
Figura 52. Lista angajaților accesată din contul Manager
Fereastra de modificare a datelor angajaților (figura 53 ) se poate accesa prin
apăsarea butonului dublu -click pe numele angajatului ce ne intersează.
Figura 53. Adăugarea/ Editarea datelor unui angajat
56
Furnizorii magazinului de cărți pot fi administrați prin intermediu l listei de
furnizori (figura 54 ) accesib ilă din contul Manag er, în urma apăsării butonului Furnizori
aflat în meniul din partea de sus a ferestrei.
Figura 54 . Lista furnizorilor din contul Manager
Adăugarea și modificarea datelor furnizorilor se face prin apăsarea butonului
dublu -click al mouse -ului pe un rând din listă, această acțiune având drept co nsecință
deschiderea ferestrei Adăuga re/Editare furnizori (figura 55 ).
Figura 55. Fereastra de gestiune a furnizorilor sistem ului
57
CAPITOLUL 5. CONCLUZI I
Această aplic ație se adresează în special managerilor de magazine, angajaților
din incinta acestora dar și clienților ce doresc să achiziționeze anumite produse într -un
mod simplu si eficient.
În prezent majoritatea magazinelor de cărți dețin sisteme de gestiune
asemănătoare acestei apli cații, însă nu toate sistemele de gestiune oferă managerilor
ocazia de a -și îmbunătă ții serviciile oferite clienților.
Aplicația mea își propune să aducă contribuții în această direcție, oferind
utilizatorilor ei o gamă largă de avantaje printre care se pot enumera și următoarele:
Ușurarea muncii depusă de angajații magazinului de cărți;
Efectuarea unor tranzacții rapide și fără erori;
Aplicația prezintă un caracter de adaptabilitate si flexibilitate astfel încât poate
fi utilizată și pentru magazine ce comercializează altă gamă de produse;
Oferă a ccesul clientului la informații diminuând timp ul de așteptare;
Informațiile privind datele clienților, furnizorilor, angajaților sau produselor
magazinului sunt reținute folosind un mediu sigur ;
Angajații magazinului pot interacționa cu publicul într -un mod mai eficient;
Utilizarea acestei aplicații nu presupune achiziționarea unor echipamente
complexe sau costisitoare.
Pune la dispoziția utilizatorului o interfaț a atractivă și ușor de utilizat datorită
meniului orizontal prezent în fiecare cont de utilizator.
Prin opțiunea oferită clientului de a -și forma propriul coș de cumpărături și de a
plasa o precomandă către agentul de vânzări, acest sistem de gestiune al m agazinului
de cărți se dovedește a fi unul eficient pentru client prin economisirea de timp și
energie.
58
Această opțiune poate fi considerată utilă și din perspectiva agentului de vânzări
deoarece facturile emise în baza preco menzilor nu prezintă erori și nu sunt
consumatoare de timp și resurse.
De asemenea, aplicația prezintă trei conturi de utilizator create cu scopul de a
separa acțiunile permise asupra sistemului, această abordare fiind utilă în securitatea
datelor prevenind alterarea lor.
În opinia mea , aplicația prezentată în cadrul acestei lucrări de licență a atins toate
obiectivele propuse iniț ial. În plus, folosirea acestui sistem de gestiune aduce
utilizatorului mai multe avantaje decât oferă aplicaț iile prezentate în capitolul 2.
Se poate observa cu uș urință faptul că aplicația dezvoltată în acestă lucrare este
superioară celor prezentate în capitolul 2, deoarece oferă utilizatorului toate
instrumentele de care are ne voie pentru o gestiune corectă ș i eficientă a unui magazin
de cărți prin intermed iul unei interfețe grafice placute și ușor de folosit .
În cea ce privește îmbunătățirea acestei aplicații se pot menționa câteva
dezvoltări viitoare cea ce ar aduce o creștere a performanțelor sistemului de gestiune:
o În contul Agent se poate adăuga opțiune a de a valida sau șterge conținutul unei
precomenzi înainte ca aceasta să fie facturată;
o Se poate implementa un chat prin care angajați i magazinului să poată comunica;
o Se pote implementa un sistem care să trimită email -uri clienților, în care sunt
prezenta te noutățile și ofertele magazinului.
o În contul Manager se poate dezvolta o secțiune de rapoarte și statistici ale
magazinului, care să cuprindă informații despre vânzări și preferințele clie nților,
topul cărților vândute sau diferite oferte ale produselor ;
o Momentan aplicația rulează pe localhost, dar dacă baza de date este urcată pe
un server, ap licația poate fi folosită de toț i cei c are au instalat programul în
calculator; a stfel managerul își poate gestiona magazinul de cărți fără a fi
necesară prezența acestuia la sediu.
59
În cea ce privește experiența mea în realizarea acestei lucrări de licență , consider
că am reușit să acumulez noi cunoștințe despre limbajul de programare utilizat în
dezvoltarea acestei aplicații. Cel mai mult mi -a făcut plăcere să lucr ez la realizarea
interfeței grafice cu ajutorul intrumentelor oferite de către mediul de dezvoltare
Visual Studio. Pe viitor voi considera utilizarea acestuia pentru realizarea unor
aplicații mobile de gestiune, domeniu ce se îmbină perfect cu pasiunea mea pentru
antreprenoriat.
Trebuie să menționez faptul că realizarea acestei lucrări a fost o provocare ce ma
ajutat să învăț cum să -mi gestionez cât mai eficient timpul și cum să folosesc în mod
inteligent resursele disponibile.
Printre dificultățile întâmpi nate în dezvoltarea acestei aplicații se pot menționa
următoarele :
o realizarea butoanelor interfetei grafice au fost create manual, fiind
cosumatoare de timp;
o mediul de dezvoltare Visual Studio s -a actualizat automat iar odată cu această
actualizare conectorul Mysql.Data.dll cauza întreruperea conexiunii aplicației
cu baza de date;
o în primele faze de dezvoltare ale acestei aplicații, am folost instrumentul
WampServer pentru crearea bazei de date. Acesta prezenta anumite
probleme, spre exemplu conexiun ea la baza de date era întreruptă după câteva
minute de inactivitate. Pentru a evita acest inconvenient am utilizat
instrumentul XampServer.
În concluzie, aplicația mea oferă utilizatorului toate opțiunile necesare unei
gestionări eficiente a unui magazin de cărți, fiind utilă atât clienților cât și angajaților
acestuia prin modul ei de funcționare ușor și eficient.
60
BIBLIOGRAFIE
1. Aaditya Shah, Library Management System 1.0,
https://www.slideshare.net/shahaditya/library -management -system –
31197877 , accesat Iunie 2017;
2. Dușmănescu D. Baze de date . Editura Universității di n Ploiești, accesat Iu nie
2017;
3. Eric Brown, Windows Forms Programming With C#,
https://imcs.dvfu.ru/lib.int/docs/Languages/CSharp/Windows%20Forms%20Progr
amming%20 With%20C%23.pdf , accesat Iunie 2017;
4. Florin Rădulescu, Curs Baze de date – Capitolul3 – Modelul relațional,
http://andrei.clubcisco.ro/cursuri/3bd/fr/BD3 -txt.pdf , accesat Iunie 2017;
5. Introduction to the Visual Studio .NET IDE ,
http://www.visualbasicbooks.com/vbhtp2_02.pdf , accesat Iunie 2017;
6. Irina Ioniță, Curs Programare orientată pe obiecte , Anul II, accesat Iunie 2017;
7. James Foxall, Sams Teach Yourself C#TM in 24 Hours ,
https://docs.google.com/file/d/0BxbayAAcS8IiZjR3UmV0dkxBLWc/edit ,
accesat Iunie 2017;
8. Jeremy Morgan, What is MVC?,
https://www.jeremymorgan.com/blog/programming/what -is-mvc/ , accesat
Iunie 2017;
9. Monica Vlădoiu, Curs Baze de Date , http://www.unde.ro/cursuri /BD , accesat
Iunie 2017;
10. Monica Vlădoiu, Curs Ingineria Programării , Anul III, accesat Iunie 2017;
61
11. Nușa Dumitriu -Lupan, Rodica Pintea, Adrian Niță, Introducere în programarea
.NET Framework , http://tminfo.ro/upload/files/410682583Manual_final.pdf ,
accesat Iunie 2017;
12. Prashant V. Dandekar , Book Management System,
https://w ww.google.ro/search?q=%E2%80%9CBook+Shop+Management+Syste
m%E2%80%9D&oq=%E2%80%9CBook+Shop+Management+System%E2%80%9
D&aqs=chrome..69i57.688j0j7&sourceid=chrome&ie=UTF –
8#q=Bookshop+Management+System+Prashanth+V.+Dandekar , accesat Iunie
2017;
13. Programarea ori entată pe obiecte și Programarea Vizuală,
http://colegiulbratianu.ro/wp –
content/themes/theme53309/documente/software/DotNet.pdf , accesat Iunie
2017;
14. Robe rt Larfore, Object -Oriented Programming in C++ Fourth Edition ,
http://fac.ksu.edu.sa/sites/default/files/ObjectOrientedProgramminginC4thEdi
tion.pdf , acces at Iunie 2017 ;
15. Ștefan Coșneanu, Java este lider în clasamentul limbajelor de programare,
http://itmoldova.com/noutati -software/java/ , accesat Iunie 2017.
1
ANEXE
Funcția AddOrderByClient din clasa CommandCenter.cs folosită pentru
plasarea unei precomenzi către agentul de vanzări:
Clasa folosită pentru a golii componenta DataGridView folosită în contul Agent:
class CommandCenter {
public bool
AddOrderByClient( List<Tuple<String, String, String,
double>> items) {
sqlcore. sqlcore command = new
sqlcore. sqlcore();
List<Tuple<String,String, String>>
listItems = new List<Tuple<String,String, String>>();
listItems.Add( new Tuple<String, String,
String>("orders" , "id_client , id_products, quantity
, status, total_pay, date_create" , items[0].Item1 +
",'" + items[0].Item2 + "','" + items[0].Item3 +
"',1,'" + items[0].Item4 + "','" +
DateTime .Now.ToString( "yyyy-MM-dd HH:mm:ss" ) + "'"));
long lastId =
command.queryAdd(listItems);
return (lastId != -1);
}
}
namespace Licenta_v2.components {
public class clearDataGrid {
public clearDataGrid() { }
public void
clearData( DataGridView element) {
element.DataSource = null;
if (element.Rows.Count > 0)
element.Rows.Clear();
}
}
2
Clasa folosită pentru denumirea posibilelor erori apărute în timpul utilizării
acestei aplicații:
Clasa valoriComune folosită pentru a prelua din baza de date câmpurile
tabelelei books.
class ErrorList {
Dictionary <string, string> errorName = new
Dictionary <string, string>();
public ErrorList(){
errorName.Add( "dbConnect" , "Eroare la conectare
bazei de date" );
errorName.Add( "noOrders" , "Clientul nu a facut
nici o comanda" );
errorName.Add( "WrongUserPassword" , "Username sau
Parola sunt introduse gresit" );
errorName.Add( "preorderSuccess" , "Precomanda d-
voastra a fost inregistrata !" );
errorName.Add( "preorderFaild" , "Precomanda d –
voastra a esuat !" );
errorName.Add( "emptyList" , "Lista este goala" );
errorName.Add( "searchCriteria" , "Alegeti un
criteriu de cautare !" );
}
public string getError( string Name){
string error = errorName[Name];
return error;
}
}
public class valoriComune
{
public string titlu { get; set; }
public string categorie { get; set; }
public string autor { get; set; }
public string pret { get; set; }
public string idcarte { get; set; }
}
3
Clasa Agent din partea ce face parte din folderul co ntrollerDatabase al
aplicației:
Funcția findByPk din clasa Author.cs , folosită pentru selectarea autorilor după
cheia primară a înregistrărilor din baza de date asociată aplicației:
class Agent {
public List<Tuple<bool, int>> Login( string
username, string password) {
sqlcore. sqlcore command = new
sqlcore. sqlcore();
List<Tuple<DataTable , int>> returnList =
new List<Tuple<DataTable , int>>();
List<Tuple<bool, int>> returnUser = new
List<Tuple<bool, int>>();
returnList =
command.querySelectLogin( "select * from users_system
where username='" + username + "' and password='" +
password + "'");
if (returnList[0].Item2 > 0) {
returnUser.Add( new Tuple<bool,
int>(true,
Convert.ToInt32(returnList[0].Item1.Rows[0].ItemArray[
1])));
return returnUser;
} else {
returnUser.Add( new Tuple<bool,
int>(false, 0));
return returnUser;
}
}
}
public class AuthorC {
public AuthorC(){}
public author findByPk( int idAuthor) {
sqlcore. sqlcore command = new sqlcore. sqlcore();
MySqlDataReader returnDetails = command.querySelectSimple( "select *
from author where id=" + idAuthor);
returnDetails.Read();
author modelAuthor = new
author(Convert.ToInt32(returnDetails[ "id"]),
Convert.ToInt32(returnDetails[ "id_user" ]),
returnDetails[ "name"].ToString(),
Convert.ToDateTime(returnDetails[ "date_create" ]),
Convert.ToDateTime(returnDetails[ "date_change" ]));
return modelAuthor;
}
4
Funcția getAllAuthor din clasa Author.cs ce selecteaza din baza de date toate
înregistrările tabelei author din baza de date:
Funcția de adăugare a unui autor în baza de date
public List<author> getAllAuthor() {
sqlcore. sqlcore command = new sqlcore. sqlcore();
List<author> userListWithProfile = new List<author>();
DataTable returnQuery = new DataTable ();
returnQuery = command.querySelectMultiple( "select * from
author " );
foreach (DataRow row in returnQuery.Rows) { // get columns
author categoryGet = new author();
categoryGet.id = Convert.ToInt32(row.ItemArray[0]);
categoryGet.name = Convert.ToString(row.ItemArray[2]);
userListWithProfile.Add(categoryGet);
}
return userListWithProfile;
}
public List<Tuple<long, string>> addAuthor( string authorModel)
{
sqlcore. sqlcore command = new sqlcore. sqlcore();
List<Tuple<long, string>> returnCategory = new
List<Tuple<long, string>>();
List<Tuple<String, String, String>>
listElementCategory = new List<Tuple<String, String,
String>>();
listElementCategory.Add( new Tuple<String, String,
String>("author" ,"name,date_create,date_change" , "'" +
authorModel + "','" +
DateTime .Now.ToString( "yyyy-MM-dd HH:mm:ss" ) + "','" +
DateTime .Now.ToString( "yyyy-MM-dd HH:mm:ss" ) + "'"));
long lastIdCategory =
command.queryAdd(listElementCategory);
5
Funcția findByPk din clasa Cathegory.cs care permite selectarea înregistrărilor
din tabela cathegory după cheia primară:
Funcția getAllCathegory din clasa Cathegory.cs:
public category findByPk( int idCategory) {
sqlcore. sqlcore command = new sqlcore. sqlcore();
MySqlDataReader returnDetails =
command.querySelectSimple( "select * from category where id=" +
idCategory);
category modelCategory = new category ();
if (returnDetails.Read())
{
modelCategory = new category
(Convert.ToInt32(returnDetails[ "id"]),
Convert.ToInt32(returnDetails[ "id_user" ]),
returnDetails[ "name"].ToString(),
Convert.ToDateTime(returnDetails[ "date_create" ]),
Convert.ToDateTime(returnDetails[ "date_change" ]));
}
return modelCategory;
}
public List<category > getAllCategory() {
sqlcore. sqlcore command = new sqlcore. sqlcore();
List<category > userListWithProfile = new
List<category >();
DataTable returnQuery = new DataTable ();
returnQuery = command.querySelectMultiple( "select *
from category " );
foreach (DataRow row in returnQuery.Rows)
{
category categoryGet = new category ();
categoryGet.id =
Convert.ToInt32(row.ItemArray[0]);
categoryG et.name =
Convert.ToString(row.ItemArray[2]);
userListWithProfile.Add(categoryGet);
}
return userListWithProfile;
}
6
Funcția de adăugare a unei categori de cărți:
Funcția folosită pentru a selecta înregistrările tabelei books din baza de date:
class BooksC {
public List<books> findAll() {
DataTable returnQuery = new DataTable ();
sqlcore. sqlcore command = new sqlcore. sqlcore();
List<books> listBooks = new List<books>();
returnQuery = command.querySelectMultiple( "select * from
books");
foreach (DataRow row in returnQuery.Rows) { // get columns
books listBooksArr = new books();
listBooksArr.id = Convert.ToInt32(row.ItemArray[0]);
listBooksArr.id_category = Convert.ToInt32(row.ItemArray[1]);
listBooksArr.id_author = Convert.ToInt32(row.ItemArray[2]);
listBooksArr.title = row.ItemArray[3].ToString();
listBooksArr.price = Convert.ToDouble(row.ItemArray[4].ToString());
listBooksArr.quantity = Convert.ToInt32(row.ItemArray[5]);
listBooksArr.date_create = Convert.ToDateTime(row.ItemArray[6]);
listBooksArr.date_change = Convert.ToDateTime(row.ItemArray[7]);
listBooks.Add(listBooksArr);
}
return listBooks;
public List<Tuple<long, string>>
addCategory( string categoryModel) {
sqlcore. sqlcore command = new
sqlcore. sqlcore();
List<Tuple<long, string>>
returnCategory = new List<Tuple<long, string>>();
List<Tuple<String, String, String>>
listElementCategory = new List<Tuple<String, String,
String>>();
listElementCategory.Add( new
Tuple<String, String, String>("category" ,
"name,date_create,date_change" , "'" + categoryModel +
"','" +
DateTime .Now.ToString( "yyyy-MM-dd
HH:mm:ss" ) + "','" +
DateTime .Now.ToString( "yyyy-MM-dd
HH:mm:ss" ) + "'"));
long lastIdCategory =
command.queryAdd(listElementCategory);
returnCategory.Add( new Tuple<long,
string>(lastIdCategory, categoryModel));
return returnCategory;
}
7
Funcția findByPk din clasa BooksC folosită pentru selectarea cărților din baza
de date după cheia primară :
Editarea informațiilor cărților din baza de date se face folosind funcția :
public bool EditBook( books bookModel, long id) {
sqlcore. sqlcore command = new
sqlcore. sqlcore();
command.queryUpdate( "UPDATE books SET
id_category='" + bookModel.id_category +
"',id_author='" + bookModel.id_author + "',title='" +
bookModel.title + "',price='" + bookModel.price +
"',quantity='" + bookModel.quantity +
"',date_change='" + DateTime .Now.ToString( "yyyy-MM-dd
HH:mm:ss" ) + "' WHERE id=" + id);
return true;
}
public books findByPk( int id) {
sqlcore. sqlcore command = new sqlcore. sqlcore();
MySqlDataReader returnDetails =
command.querySelectSimple( "select * from books where id=" + id);
books bookElement = new books();
if (returnDetails.Read()) {
bookElement. id =
Convert.ToInt32(returnDetails[ "id"].ToString());
bookElement.id_category =
Convert.ToInt32(returnDetails[ "id_category" ].ToString());
bookElement.id_author =
Convert.ToInt32(returnDetails[ "id_author" ].ToString());
bookElement.title =
returnDetails[ "title"].ToString();
bookElement.price =
Convert.ToDouble(returnDetails[ "price"].ToString());
bookElement.quantity =
Convert.ToInt32(returnDetails[ "quantity" ].ToString());
bookElement.date_create =
Convert.ToDateTime(returnDetails[ "date_create" ].ToString());
bookElement.date_change =
Convert.ToDateTime(returnDetails[ "date_change" ].ToString());
}
return bookElement;
}
8
Funcția folosită pentru actualizarea stocului unei cărți atunci când se face o
precomandă :
Funcția folosită pentru ștergerea unei cărți :
Editarea datelor unui angajat al magazinului de cărți:
public bool BookQuantityUpdate( int id, int cant) {
sqlcore. sqlcore command = new sqlcore. sqlcore();
books getbook = new books();
getbook = this.findByPk(id);
command.queryUpdate( "UPDATE books set
quantity='" + (getbook.quantity – cant) + "' WHERE id=" + id);
if(getbook.quantity – cant>0)
{
return true;
}
else
{
MessageBox .Show("Stoc epuizat" );
}
return true;
}
public bool deleteBook( int id) {
sqlcore. sqlcore
command = new sqlcore. sqlcore();
command.queryDelete( "DELETE FROM
books WHERE id=" + id);
return true;
}
public bool EditEmployee( employes model, long id) {
sqlcore. sqlcore command = new
sqlcore. sqlcore();
command.queryUpdate( "UPDATE employes SET
functia='" + model.functia + "',nume='" + model.nume
+ "',prenume='" + model.prenume + "',adresa='" +
model.adresa + "',nr_telefon='" + model.nr_telefon +
"' WHERE id=" + id);
return true;
}
9
Funcția pentru afișarea conținutului unei precomenzi :
Selectarea precomenzilor după id -ul clientului se face folosind funcția:
public List<Tuple<profile_clients , List<books>, List<int>,
double>> getOrderDetails( int id_profile) {
UserC userList = new UserC();
profile_clients profileClient =
userList.findProfileByid(id_profile);
List<Tuple<profile_clients , List<books>, List<int>,
double>> addDetails = new List<Tuple<profile_clients , List<books>,
List<int>, double>>();
List<orders> getOrdersClient = new List<orders>();
List<books> listBooksClient = new List<books>();
List<int> listQuantityClient = new List<int>();
BooksC getBook = new BooksC();
getOrdersClient = this.findAllByClient(id_profile);
foreach (orders orderItem in getOrdersClient) {
string[] splitIdProduct = orderItem.id_products.Split( ',');
string[] splitQuantity = orderItem.quantity.Split( ',');
for(int i = 0;i<splitIdProduct.Length;i++){
books getBookName =
getBook.findByPk( Convert.ToInt16(splitIdProduct[i]));
listBooksClient.Add(getBookName);
}
for (int i = 0; i < splitQuantity.Length; i++) {
listQuantityClient.Add( Convert.ToInt16(splitQuantity[i])); }
addDetails.Add( new Tuple<profile_clients , List<books>,
List<int>, double>(profileClient, listBooksClient,
listQuantityClient, Convert.ToDouble(orderItem.total_pay)));
}
return addDetails;
}
public List<orders> findAllByClient( int idClient) {
DataTable returnQuery = new DataTable ();
sqlcore. sqlcore command = new sqlcore. sqlcore();
List<orders> listOrders = new List<orders>();
returnQuery = command.querySelectMultiple( "select * from
orders WHERE id_client=" + idClient+ " AND status=1" );
foreach (DataRow row in returnQuery.Rows) { // get columns
orders OrderList = new orders();
OrderList.id_client = Convert.ToInt32(row.ItemArray[1])
OrderList.id_products = row.ItemArray[2].ToString();
OrderList.quantity = row.ItemArray[3].ToString();
OrderList.status = Convert.ToInt32(row.ItemArray[4].ToString());
OrderList.total_pay = Convert.ToDoubl e(row.ItemArray[5].ToString());
OrderList.date_create = Convert.ToDateTime(row.ItemArray[6].ToSt ring());
listOrders.Add(OrderList);
}
return listOrders; }
10
Clasa Manager din folderul controllerDatabase :
Funcția folosită pentru afisarea clientilor după numele de utilizator:
class Manager {
public List<Tuple<bool, int>> Login( string
username, string password) {
sqlcore. sqlcore command = new
sqlcore. sqlcore();
List<Tuple<DataTable , int>> returnList =
new List<Tuple<DataTable , int>>();
List<Tuple<bool, int>> returnUser = new
List<Tuple<bool, int>>();
returnList =
command.querySelectLogin( "select * from users_system
where username='" + username + "' and password='" +
password + "'");
if (returnList[0].Item2 > 0) {
returnUser.Add( new Tuple<bool, int>(true,
Convert.ToInt32(returnList[0].Item1.Rows[0].ItemArra
y[1])));
return returnUser;
} else {
returnUser.Add( new Tuple<bool, int>(false, 0));
return returnUser;
}
}
}
public bool findByName( String username) {
bool state = false;
sqlcore. sqlcore command = new
sqlcore. sqlcore();
MySqlDataReader returnDetails =
command.querySelectSimple( "select * from
clients_system where username='" +
username+ "'");
returnDetails.Read();
if (returnDetails.HasRows)
state = true;
return state;
}
11
Testarea datelor introduse în câmpurile username și parola se face cu funcția
Login din clasa UsersC.cs:
Selectarea înregistrărilor din tabela clients _system :
public List<Tuple<bool, clients_system >> Login( string username, string
password) {
sqlcore. sqlcore command = new sqlcore. sqlcore();
clients_system userModel = new clients_system ();
List<Tuple<DataTable , int>> returnList = new
List<Tuple<DataTable , int>>();
List<Tuple<bool, clients_system >> returnUser = new
List<Tuple<bool, clients_system >>();
returnList = command.querySelectLogin( "select * from
clients_system where username='" + username + "' and password='" +
password + "'");
if (returnList[0].Item2 > 0) {
userModel = new
clients_system (Convert.ToInt32(returnList[0].Item1.Rows[0].ItemArray[0]
),
Convert.ToInt32(returnList[0].Item1.Rows[0].ItemArray[1]),
Convert.ToInt32(returnList[0].Item1.Rows[0].ItemArray[2]),
returnList[0].Item1.Rows[0].ItemArray[3].ToString(),
returnList[0].Item1.Rows[0].ItemArray[4].ToString());
returnUser.Add( new Tuple<bool, clients_system >(true, userModel));
return returnUser;
} else {
returnUser.Add( new Tuple<bool, clients_system >(false,
userModel));
return returnUser;
}
}
public List<clients_system > findAll() {
sqlcore. sqlcore command = new sqlcore. sqlcore();
DataTable returnQuery = new DataTable ();
List<clients_system > listUsers = new
List<clients_system >();
returnQuery = command.querySelectMultiple( "select *
from clie nts_system" );
foreach (DataRow row in returnQuery.Rows) {
clients_system Users = new clients_system ();
Users.id = Convert.ToInt32(row.ItemArray[0]);
Users.id_profile = Convert.ToInt32(row.ItemArray[1]);
Users.id_type = Convert.ToInt32(row.ItemArray[2]);
Users.username = row.ItemArray[3].ToString();
Users.password = row.ItemArray[4].ToString();
listUsers.Add(Users);
} return listUsers;
12
Clasa author din folderul modelDatabase:
Clasa cathegory din folderul modelDatabase:
public class author {
public author(int id_model = 0, int
id_user_model = 0, string name_model = "",
DateTime date_create_model = new DateTime (),
DateTime date_change_model = new DateTime ()) {
this.id = id_model;
this.id_user = id_user_model;
this.name = name_model;
this.date_create = date_create_model;
this.date_change = date_change_model;
}
public int id { get; set; }
public int id_user { get; set; }
public string name { get; set; }
public DateTime date_create { get; set; }
public DateTime date_change { get; set; }
}
class category {
public category( int id_model=0, int
id_user_model = 0, string name_model = "",DateTime
date_create_model = new DateTime (),DateTime
date_change_model = new DateTime ()){
this.id = id_model;
this.id_user = id_user_model;
this.name = name_mod el;
this.date_create = date_create_model;
this.date_change = date_change_model;
}
public int id { get; set; }
public int id_user { get; set; }
public string name { get; set; }
public DateTime date_create { get; set; }
public DateTime date_change { get; set; }
}
13
Adăugarea de noi înregistrări în tabela books prin apăsarea butonului Adauga
din fereastra Adauga carte :
Codul pentru adăugarea unei noi categorii în lista :
private void btnAddBook_Click( object sender, EventArgs e) {
comboList getIdCategory = comboCategoryList.SelectedItem as
comboList ;
comboList getIdAuthor = comboAuthorList.SelectedItem as
comboList ;
BooksC bookAdd = new BooksC();
books bookModel = new books();
bookModel.title = titleBook.Text;
bookModel.price = Convert.ToDouble(priceBook.Text);
bookModel.quantity = Convert.ToInt32(quantityBook.Text);
bookModel.id_category = Convert.ToInt32(getIdCategory.Value);
bookModel.id_author = Convert.ToInt32(getIdAuthor.Value);
returnIdBook = bookAdd.AddBook(bookModel);
if (returnIdBook < 0) {
MessageBox .Show("Sa produs o eroare" );
}
else {
MessageBox .Show("Ai adaugat cu success" );
editBook.Enabled = true;
resetBook.Enabled = true;
btnAddBook.Enabled = false;
} }
List<comboList > listItemCategory = new List<comboList >();
List<comboList > listItemAuthor = new List<comboList >();
category = new CategoryC ();
List<category > listCategory = new List<category >();
listCategory = category.getAllCategory();
foreach(category cat in listCategory){
listItemCategory.Add( new comboList ()
{ Text = cat.name, Value = cat.id.ToString() });
}
comboCategoryList.DataSource = listItemCategory;
comboCategoryList.DisplayMember = "Text";
14
Editarea datelor unei cărți în urma apăsării butonului editBook :
Funcția pentru editarea datelor unui client ce poate fi accesată din contul
Manager :
private void editBook_Click( object sender, EventArgs e)
comboList getIdCategory =
comboCategoryList.SelectedItem as comboList ;
comboList getIdAuthor = comboAuthorList.SelectedItem
as comboList ;
BooksC bookAdd = new BooksC();
books bookModel = new books();
bookModel.title = titleBook.Text;
bookModel.price = Convert.ToDouble(priceBook.Text);
bookModel.quantity =
Convert.ToInt32(quantityBook.Text);
bookModel.id_category =
Convert.ToInt32(getIdCategory.Value);
bookModel.id_author =
Convert.ToInt32(getIdAuthor.Value);
if (bookAdd.EditBook(bookModel, (getIdBook >0) ?
getIdBook : returnIdBook)) {
MessageBox .Show("Editare a avut success" );
}
else {
MessageBox .Show("A aparut o eroare" ); }
}
private void editClientBtn_Click( object sender, EventArgs e) {
UserC editUser = new UserC();
profile_clients clientProfile = new profile_clients ();
clients_system userSystem = new clients_system ();
clientProfile.id_profile_model = Convert.ToInt32(id_profile);
clientProfile.name = nameRegister.Text;
clientProfile.phone = phoneRegister.Text;
clientProfile.email = emailRegister.Text;
clientProfile.address = addressRegister.Text;
clientProfile.cnp = Convert.ToInt64(cnpRegister.Text);
clientProfile.cnp_series = seriesCnp.Text;
//set parameter user for login
userSystem.id = Convert.ToInt32(id_client);
userSystem.username = usernameRegister.Text;
userSystem.password = passwordRegister.Text;
if (editUser.EditProfile(clientProfile, userSystem))
{ MessageBox .Show("Profilul a fost actualizat cu success" );}
}
15
În contul Agent Vânzări, conectarea la baza de date și afișarea listei de cărți din
tabela books se face prin intermediul codului sursă din funcția button1 :
private void button1_Click( object sender, EventArgs e) {
MySqlConnection conexion = new MySqlConnection (@"Data
Source=localhost;Database=catalin;UserID=root;password=''" );
try
{
conexion.Open();
commandList.SelectedIndex = 0;
listBooksGrid.DataSource = null;
listBooksGrid.Rows.C lear();
MySqlCommand comand = new MySqlCommand ();
MySqlDataAdapter adapter = new MySqlDataAdapter ("select
books.id , books.title , category.name , author.name , books.price ,
books.quantity from books inner join author on books.id_author =
author.id join category on books.id_category=category.id" , conexion);
DataTable returnQuery = new DataTable ();
adapter.Fill(returnQuery);
foreach (DataRow item in returnQuery.Rows)
{
int n = listBooksGrid.Rows.Add();
listBooksGrid.Rows[n].Cells[0].Value = item[0].ToString();
listBooksGrid.Rows[n].Cells[1].Value = item[1].ToString();
listBooksGrid.Rows[n].Cells[2].Value = item[2].ToString();
listBooksGrid.Rows[n].Cells[3].Value = item[3].ToString();
listBooksGrid.Rows[n].Cells[4].Value = item[4].ToString();
listBooksGrid.Rows[n].Cells[5].Value = item[5].ToString();
}
conexion.Close();
}
catch (Exception ex)
{
MessageBox .Show("Eroare conectare bd :" + ex);
}
}
16
Afișarea listei tuturor precomenzilor se face în contul Agent prin apasarea
butonului 2 din meniu. Funcția acestui buton :
Funcția care afișează data și ora în fiecare dintre ferestrele principale:
private void button2_Click( object sender, EventArgs e) {
commandList.SelectedIndex = 1;
listOrdersGrid.DataSource = null;
listOrdersGrid.Rows.Clear();
OrdersC orderList = new OrdersC();
List<orders> listOrders = orderList. findAll();
int row = 0;
listOrdersGrid.DataSource = null;
if (listOrders.Count != 0) {
foreach (orders item in listOrders) {
UserC userList = new UserC();
profile_clients profileClient =
userList.findProfileByid(item.id_client);
listOrdersGrid.Rows.Add();
listOrdersGrid.Rows[row].Cells[0].Value =
profileClient.id_profile_model;
listOrdersGrid.Rows[row].Cells[1].Value = profileClient.name;
listOrdersGrid.Rows[row].Cells[2].Value = profileClient.address;
listOrdersGrid.Rows[row].Cells[3].Value = profileClient .phone;
listOrdersGrid.Rows[row].Cells[4].Value = profileClient.email;
listOrdersGrid.Rows[row].Cells[5].Value = profileClient.cnp;
listOrdersGrid.Rows[row].Cells[6].Value = profileClient.cnp_series;
listOrdersGrid.Rows[row].Cells[7].Value = profileClient. date_create;
listOrdersGrid.Rows[row].Cells[8].Value = profileClient.date_change;
listOrdersGrid.Rows[row].Cells[9].Value = item.total_pay;
listOrdersGrid.Rows[row].Cells[10].Value = item.id;
row++;
}
} else {
MessageBox .Show(errorName.getError( "emptyList" ));
}
}
private void timer1_Tick( object sender, EventArgs e) {
label5.Text = DateTime .Now.ToLongTimeString();
label6.Text = DateTime .Now.ToLongDateString();
timer1.Start();
17
Căutarea înregistrărilor în listele afișate în contul Manager sunt facute pe baza
următorului cod:
private void commandList_SelectedIndexChanged( object
sender, EventArgs e) {
searchBooksCombo.Items.Clear();
if (commandList.SelectedIndex == 0)
{ // book search
pictureBox1.Visible = true;
pictureBox2.Visible = false;
pictureBox3.Visible = false;
pictureBox4.Visible = false;
searchBooksCombo.Text = "titlu";
searchBooksCombo.Items.Add( "titlu");
}
else if (commandList.SelectedIndex == 1)
{ // employee search
pictureBox1.Visible = false;
pictureBox3.Visible = false;
pictureBox4.Visible = false;
pictureBox2.Visible = true;
searchBooksCombo.Text = "nume";
searchBooksCo mbo.Items.Add( "nume");
searchBooksCombo.SelectedItem = 0;
}
else if (commandList.SelectedIndex == 2)
{ // employee search
pictureBox1.Visible = false;
pictureBox3.Visible = true;
pictureBox2.Visible = false;
pictureBox4.Visible = false;
searchBooksCombo.Text = "nume";
searchBooksCombo.Items.Add( "nume");
searchBooksCombo.SelectedItem = 0;
}
else if (commandList.SelectedIndex == 3)
{
pictureBox1.Visible = false;
pictureBox2.Visible = false;
pictureBox4.Visibl e = true;
pictureBox3.Visible = false;
searchBooksCombo.Text = "nume";
searchBooksCombo.Items.Add( "nume");
searchBooksCombo.SelectedItem = 0;
}
}
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: Șef lucrări dr. ing. Irina Ioni ță [609250] (ID: 609250)
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.
