Gestiunea Componentelor Si Echipamentelor Dintr O Companie Folosind C# Si Mysql
LUCRARE DE LICENȚĂ
GESTIUNEA COMPONENTELOR ȘI ECHIPAMENTELOR DINTR-O COMPANIE FOLOSIND C# ȘI MySQL
TEMA _________________
Lucrare de Finalizare a studiilor a studentului________________________
1). Tema lucrării de finalizare a studiilor:____________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
2). Termenul pentru predarea lucrării ______________________________________________
3). Elemente inițiale pentru elaborarea lucrării de finalizare a studiilor __________________
________________________________________________________________________________
________________________________________________________________________________
4). Conținutul lucrării de finalizare a studiilor :_______________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
5). Material grafic:________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
6). Locul de documentare pentru elaborarea lucrării:
________________________________________________________________________________
________________________________________________________________________________
7). Data emiterii temei_____________________________________________________________
REFERAT
PRIVIND LUCRAREA DE LICENȚĂ
A
ABSOLVENTULUI / ABSOLVENTEI : ……………………………………….
Titlul lucrării ………………………………………………………………………..
…..…………………………………………………………………………………………………
Structura lucrării …………………………………………………………………….
…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………………………………………………
Aprecieri asupra conținutului lucrării de LICENȚĂ (finalizare a studiilor), mod de abordare, complexitate, actualitate, deficiențe
………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
Aprecieri asupra lucrării (se va menționa: numărul titlurilor bibliografice consultate, frecvența notelor de subsol, calitatea și diversitatea surselor consultate; modul în care absolventul a prelucrat informațiile din surse teoretice)
…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
(se va menționa: opțional locul de documentare și modul în care absolventul a realizat cercetarea menționându-se contribuția autorului)
……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
Concluzii (coordonatorul lucrării trebuie să aprecieze valoarea lucrării întocmite, relevanța studiului întreprins, competențele absolventului, rigurozitatea pe parcursul elaborării lucrării, consecvența și seriozitatea de care a dat dovadă absolventul pe parcurs)
……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
Redactarea lucrării respectă ………………………………………………….cerințele academice de redactare (părți, capitole, subcapitole, note de subsol și bibliografie).
Consider că lucrarea îndeplinește/ nu îndeplinește condițiile pentru susținere în sesiunea de Examen de LICENȚĂ (finalizare a studiilor) din IULIE 2014 și propun acordarea notei ………………
Oradea,
Data Conducător științific
CUPRINS
Introducere
Capitolul I. Prezentarea temei proiectului
Capitolul II. Fundamentare teroretică
II.1. Microsoft Visual Studio.NET și Visual C#
II.2. MySQL
II.3. Wamp Server
II.4. Navicat
Capitolul III. Prezentarea aplicației
III.1. Prezentarea modulelor aplicației
III.2. Modul Logare
III.3. Modul Fișier
III.4. Modul Adăugare
III.4. Modul Căutare
III.1.4.1. Căutare după A2C
III.1.4.2. Căutare după detalii
III.1.6. Baza de date
Capitolul IV. Manual de utilizare
IV.1. Autentificarea utilizatorului
IV.2. Deschiderea ferestrei principale
IV.3. Descrierea utilizare secțiune Fișier
IV.4. Descrierea utilizare secțiune Adăugare
IV.4.2. Echipamente
IV.5. Descrierea utilizare secțiune Căutare
IV.6. Descrierea utilizare secțiune Ajutor
IV.7. Ieșirea din aplicație
Capitolul V. Concluzii și Direcții de dezvoltare
BIBLIOGRAFIE
Cuprins de figuri
Figură 1. Client/Server
Figură 2. Mediul de dezvoltare Microsoft Visual Studio
Figură 3. Interfața Wamp Server
Figură 4. Fereastra principală Navicat
Figură 5. Structura aplicației
Figură 6. Logare Administrator
Figură 7. Logare Utilizator
Figură 8. Text predictiv
Figură 9. Constrângeri
Figură 10. Tabel
Figură 11. Baza de date
Figură 12. Autentificare
Figură 13. Avertizare date incorecte
Figură 14. Fereastra principală
Figură 15. Adăugare
Figură 16. Text predictiv
Figură 17. Constrângeri
Figură 18. Tabel
Figură 19. Actualizare
Figură 20. Echipament
Figură 21. Căutare după A2C
Figură 22. Căutare după detalii
Figură 23. Ajutor
Introducere
Sistemul informatic “ Gestiunea componentelor și echipamentelor dintr-o companie folosind C# și MySQL “ se încadrează în categoria software-urilor de gestiune stocuri care va fi utilizat pentru o gestiune eficienta a stocului de componente electronice, echipamente de măsurare si echipamente de testare.
Capitolul I. Prezentarea temei proiectului
În departamentul din care fac parte se dezvoltă o gamă variată de exemplare: circuite imprimate (PCB – Printed Circuit Board) pentru instrumente de bord auto, pentru display-uri, placi de dezvoltare, dar și alte tipuri de circuite de test(așa numitele testbox-uri). Așadar sunt foarte multe tipuri de componente electronice, echipamente de testare și măsurare. Pentru o funcționare eficientă într-o echipă care dezvoltă multe proiecte, managementul stocurilor este foarte important.
Pe măsură ce aria de activitatea echipei a crescut, fiind tot mai multe și mai variate proiecte, controlul fluxului de componente a devenit ineficient. Astfel s-a dorit implementarea unui proces în acestă direcție.
Procesul constă pe de o parte în introducerea componentelor într-o bază de date, iar pe de altă parte, în scoaterea acestora din baza de date pe măsura ce sunt utilizate la proiectele în desfașurare. Acest proces se reia de fiecare dată când se face un proiect. Operațiunea constă în așezarea componentelor în cutii cu celule sau dulapuri special construite pentru acest mod de depozitare. Fiecare celulă din cutie sau din dulap are un număr de indentificare. Locația primită de componentă are următorul format:
Pentru locațiile din depozit: S02/număr raft/număr cutie/număr celulă;
Pentru locațiile din sala de lucru: număr s gestiune stocuri care va fi utilizat pentru o gestiune eficienta a stocului de componente electronice, echipamente de măsurare si echipamente de testare.
Capitolul I. Prezentarea temei proiectului
În departamentul din care fac parte se dezvoltă o gamă variată de exemplare: circuite imprimate (PCB – Printed Circuit Board) pentru instrumente de bord auto, pentru display-uri, placi de dezvoltare, dar și alte tipuri de circuite de test(așa numitele testbox-uri). Așadar sunt foarte multe tipuri de componente electronice, echipamente de testare și măsurare. Pentru o funcționare eficientă într-o echipă care dezvoltă multe proiecte, managementul stocurilor este foarte important.
Pe măsură ce aria de activitatea echipei a crescut, fiind tot mai multe și mai variate proiecte, controlul fluxului de componente a devenit ineficient. Astfel s-a dorit implementarea unui proces în acestă direcție.
Procesul constă pe de o parte în introducerea componentelor într-o bază de date, iar pe de altă parte, în scoaterea acestora din baza de date pe măsura ce sunt utilizate la proiectele în desfașurare. Acest proces se reia de fiecare dată când se face un proiect. Operațiunea constă în așezarea componentelor în cutii cu celule sau dulapuri special construite pentru acest mod de depozitare. Fiecare celulă din cutie sau din dulap are un număr de indentificare. Locația primită de componentă are următorul format:
Pentru locațiile din depozit: S02/număr raft/număr cutie/număr celulă;
Pentru locațiile din sala de lucru: număr sală/număr dulap/număr celulă
Conținutul lucrării este structurat pe parcursul a 5 capitole.
Primul capitol prezintă tema lucrării și modul în care este dezvoltată.
Capitolul doi prezintă fundamentele teoretice care stau la baza dezoltării acestei aplicații.
Capitolul trei prezintă aplicația în sine. Prezintă modulele componente acestei aplicații și structura bazei de date.
Capitolul patru redă manualul de utilizare. Se prezintă modul de utilizare al acestei aplicații.
Capitolul cinci prezintă pe scurt concluziile și eventualele direcții de dezvoltare a acestei lucrări.
Capitolul II. Fundamentare teroretică
Pentru realizarea acestei aplicații a fost nevoie de următoarele tehnologii:
Microsoft Visual Studio. și Visual C#
Microsoft Visual Studio.NET este un mediu de dezvoltare utilizat pentru a crea diferite aplicații cu ajutorul unor limbaje de programare integrate: C#, Visual Basic, C++ sau F#. Dispune de un ansamblu de funcționalități, cum ar fi: crearea, depanarea și modificarea codului aplicației. Se pot realiza aplicații de tip forme Windows, aplicații WEB si servicii WEB.[Gri03]
Pentru a crea orice aplicație este nevoie să folosești o soluție, și această soluție trebuie să conțină cel puțin un proiect. Soluțiile sunt containere pentru toată aplicația în VS.NET. O soluție conține un proiect pentru fiecare fișier compilat. [Gri03]
Microsoft Visual Studio.NET este un set de tehnologii multiplatform, ce include testare, utilizabilitatea și protocoale acceptate, cum ar fi HTTP și standarde de platforme independente ca și XML.
Microsoft Visual Studio.NET oferă acces usor la funcționalitățile care stau la baza serverelor prin acordarea accesului dezvoltatorilor la funcțiile serverului ca mesaje de așteptare, evenimente de autentificare precum o gama largă de modele a mediului VS.NET. Modele sunt componenta cheie a mediului VS.NET; permițând dezvoltatorilor să fie ghidați prin dezvoltarea complexă a componentelor specifice. Aceste modele cuprind XML Data Designer, Web Services Designer, Windows Forms Designer și Web Forms Designer , oferă acces ușor la codul generat pe baza cadrelor de clase.[Dun02]
Modelul de dezvoltare „Two Tier” este adesea asociat cu modelul Client/Sever. Într-un astfel de model, un client al aplicației solicită informații sau servicii de la un singur server. (vezi Figură 1. Client/Server). [Dun02]
Clientul aplicației afișează interfața cu utilizatorul și recepționează intrările de la client.
Serverul aplicației oferă servicii, de obicei date sau servicii de comunicații.
Există două aspecte pentru gestionarea codului într-un mediu client/server. Serverul este parte dintr-un grup, codul server trebuie să fie gestionat lansat într-o singură locație. Dacă serverul este parte dintr-un grup , codul trebuie trimis la fiecare server (manual sau automat) folosind un soft de gestiune a grupurilor, cum ar fi Microsoft Application Center 2000. [Dun02]
Pe de altă parte clientului aplicației îi este mult mai complicat să gestioneze decât serverului. Modificările efectuate asupra componentelor aplicației client trebuie să fie distribuite la fiecare client, în multe cazuri simultam. [Dun02]
Figură 1. Client/Server
Visual Studio.NET oferă acces la baze de date în MySQL, SQL, Microsoft Access.
Visual C# este un limbaj de programare care face parte din familia de limbaje .NET . Este un limbaj complet orientat pe obiecte, oferind un set de obiecte și instrumente ce permite dezvoltarea de aplicații Windows și aplicații WEB. Interfața grafică folosită este ”user friendly” și este concepută în așa fel încât să ușureze munca celui care o folosește (vezi Figură 2. Mediul de dezvoltare Microsoft Visual Studio).
Figură 2. Mediul de dezvoltare Microsoft Visual Studio
C# este unul din limbajele pentru noua platformă de dezvoltare a Microsoft: .NET Framework.[Ste10]
.NET Framework (Cadru de lucru .NET) are două elemente principale:
Mașină virtuală numită Common Language Runtime (CLR);
Biblioteca de clase de bază numită Base Class Libraries (BCL).
Când programul este compilat, nu se generează cod mașină, așa cum este obișnuit. Se generează Intermediate Language (IL), care este un limbaj mașină pentru un procesor virtual. CLR preia codul din IL și îl convertește în cod mașină, care este executat de procesorul fizic. Codul care este generat este numit cod gestionat fiindcă controlează toate aspectele alocarii de memorie. [Moj03]
BCL este un set de clase și funcționalități care permite să comunici cu sistemul de operare și alte tehnologii cum ar fi XML, ASP.NET și ADO.NET. [Moj03]
.NET Framework oferă funcționalități specifice sistemului de operare Windows, furnizând și biblioteci care extind aceste funcționalități.
Avantajul folsirii ASP.NET este că poți folosi toate caracteristicile limbajului; C# pentru ASP.NET nu este diferit față de C# pentru aplicațiile desktop. Alt avantaj este că paginile ASP.NET sunt compilate pentru prima dată când sunt solicitate. [Moj03]
În final ASP.NET îți permite să folosești două stiluri de programare.
MySQL
MySQL este un sistem de gestiune de baze de date(SGBD) în regim OpenSource. Are următoarele caracteristici:
Este un SGBD : asigură gestiunea unei colecții structurate de date;
Este un SGBD relațional: datele sunt organizate în tabele, fiind stabilite relații și constrângeri de integritate.
Este un sistem client-server: serverul de baze de date este separat logic și deseori fizic de programele client care asigură interfața operațiilor cu baza de date. Serverul MySQL suportă o gamă largă de programe client, scrise în diverse limbaje de programe.
Este distribuit în formula Open Source Software: permite oricărei persoane să utilizeze și să modifice programul, care poate fi luat gratiut de pe Internet. [Pes10]
În concepția relațională o bază de date este formată dintr-o colecție de relații (tabele, fișiere de date) asupra cărora se aplică o colecție de operatori pentru a gestiona datele conținute de relații.
Un operator relațional se aplică asupra unor tabele și va avea ca rezultat tot o tabelă.
Cheia primară(Primary Key) este o cheie aleasă de administratorul bazei de a date pentru a identifica înregistrările. De obicei se alege o cheie cu un număr minim de atribute.
Cheie externă(Foreign Key) este un grup de atribute care constituie o cheie primară într-o altă relație. Ajută la legarea datelor din cele două relații.[Pes10]
MySQL este portabil și rulează pe sisteme de operare comerciale(cum ar fi Mac OS X, HP-UX și Windows) și toate tipurile de hardware.
Distribuțiile MySQL includ următoarele instrumente:
Un server SQL. Acesta este motorul care oferă acces la baza de date;
Client și programe utilitare. Acestea includ programe client interactive prin care poți să introduci interogări și vizualizarea rezultatelor.
O librărie client pentru programele scrise. Poți scrie programe client în C# pentru că librările sunt în C#, dar librăriile pot fi legate în alte procesoare de limabaj cum ar fi Perl, PHP.[Du09]
Limbajul de interogare structurată (SQL – Structured Query Language) este un limbaj pe care MySQL îl înțelege și prin intermediul căruia serverul primește instrucțiuni cu privire la modul de operare și gestionare a datelor. Conform ANSI(American National Standards Institute), el este limbajul standard pentru gestionarea bazelor de date relaționale.
Instrucțiunile SQL sunt folosite pentru a executa sarcini cum ar fi actualizări în baza de date sau pentru a obține informații. Cateva sisteme uzuale pentru gestionarea bazelor de date relaționale care folosesc SQL sunt: Oracle, Sybase, Microsoft SQL Server, Access, Ingres, etc. Deși majoritatea sistemelor de baze de date folosesc SQL, cele mai multe au de asemenea și extensii proprietare suplimentare specifice, folosite exclusiv în sistemele respective. Cu toate acestea, comenzile standard din SQL cum ar fi "select", "insert", "update", "delete", "create", și "drop" pot fi folosite pentru a realiza aproape toate operațiile necesare într-o bază de date.
O bază de date relațională conține unul sau mai multe tabele. Datele sau informațiile folosite de baza de date sunt stocate în aceste tabele. Tabele sunt identificate în mod unic prin numele lor și sunt alcătuite din coloane și rânduri. Coloanele conține numele coloanei, tipul de date, precum și orice alte atribute pentru coloană. Rândurile conțin inregistrări ale datelor în coloane.
Comanda "select"(comandă de selecție) este folosită pentru interoga baza de date și pentru a obține datele care corespund criteriilor de selecție specificate. Toate declarațiile în SQL trebuie să se termine cu punct și virgule ";".
select "nume coloană 1" [, "nume coloană 2",etc] from "nume tabelă" [where "condiție"];
([ ]= opțional)
Numele coloanelor care urmează după cuvântul cheie "select" determină care coloane vor fi returnate în rezultate. Astfel se pot selecta oricâte coloane dorim sau se pot selecta toate coloanele utilizând "*".
Numele tabelei care urmează după cuvântul cheie "from" specifică tabela care va fi interogată pentru a prelua rezultatele dorite.
Cuvântul cheie "all" este folosit pentru a selecta toate înregistrările(implicit) dintr-o tabelă. Iar cuvântul cheie "distinct" este folosit pentru eliminarea duplicatelor din rezultatul selecției.
Clauza "where" este opțională și specifică ce valori de date sau rânduri vor fi returnate sau afișate, pe baza criteriilor descrise după cuvântul cheie "where".
Operatori folosiți în clauza "where":
"=" – Egal
"˃" – Mai mare decât
"˂" – Mai mic decât
"˃=" – Mai mare sau egal
"˂=" – Mai mic sau egal
"˂˃" – Diferit de
"like" – Operator de potrivire care permite selecția doar a rândurilor care sunt la fel ca și cuvântul sau caracterele specificate. Simbolul "%" poate fi folosit ca și "wild card" pentru a înlocui orice caracter posibil care s-ar putea să apară, înainte sau după caracterele specificate.
Operatorul boolean AND poate fi folosit pentru a uni(join) două sau mai multe condiții din clauza "where". Și condiția anterioară și cea de după operatorul AND trebuie sa fie adevărate pentru a fi îndeplinită clauza "where" pentru rândurile ce urmează a fi afișate.
Operatorul boolean OR se folosește pentru a uni două sau mai multe condiții ale clauzei "where". Pentru a fi îndeplinită clauza "where" e destul ca una dintre condițiile legate prin operatorul OR să fie adevărată.
select "nume coloană 1" , SUM (nume coloană 2)
from "listă de tabele" where "condiție 1" AND/OR "condiție 2";
Operatorul condițional IN este folosit pentru a testa dacă o valoare(specificată inaintea operatorului IN) este sau nu în lista cu valori de după cuvântul cheie IN. Acest operator este ușor de folosit atunci când testăm mai mult de două sau trei valori. Deasemenea se poate folosi și varianta NOT IN pentru a exclude rândurile care sunt în lista de valori de după operator.
select "nume coloană 1" , SUM (nume coloană 2)
from "listă de tabele" where "nume coloană 3" IN (listă de valori);
Operatorul condițional BETWEEN este folosit pentru a verifica dacă o valoare este sau nu situată între valorile date după cuvântul cheie BETWEEN. Deasemenea se poate folosi și varianta NOT BETWEEN pentru a exclude valorile care nu sunt cuprinse între cele două valori specificate după cuvântul cheie NOT BETWEEN.
select "nume coloană 1" , SUM (nume coloană 2)
from "listă de tabele" where "nume coloană 3"
BETWEEN "valoare 1" AND "valoare 2";
Comanda "create table"este folosită pentru crearea unei noi tabele.
create table "nume tabelă"
("nume coloană1" "tipul de date",
"nume coloană2" "tipul de date",
"nume coloană N" "tipul de date");
Pentru crearea de tabele folosind constrangeri opționale, se foloseste următorul format:
create table "nume tabelă"
("nume coloană1" "tipul de date"[ constângere] ,
"nume coloană2" "tipul de date"[ constângere],
"nume coloană N" "tipul de date"[ constângere]);
Numele tabelelor si coloanelor trebuie să înceapă cu o literă care poate fi urmată de alte litere, numere sau bară jos. Toate acestea să nu depășească 30 de caractere lungime. Deasemenea este interzisă folosirea cuvintelor cheie pentru nume de tabele sau coloane.
Tipul de date specifică ce fel de tip de date poate fi folosit pentru înregistrările din acea coloană. Cele mai folosite tipuri de date sunt:
La crearea tabelelor, este uzual să existe una sau mai multe coloane care sa aibă constrângeri asociate. De fapt o constrângere este o regulă aplicată unei coloane astfel încât datele care sunt introduse în coloana respectivă sa le respecte. De exemplu constângerea "unique" interzice existeța a două înregistrări similare în acea coloană. Fiecare înregistrare trebuie să fie unică. Alte două constrângeri foarte uzuale sunt "not null" care interzice lăsarea coloanei necompletate și "primary key"(PK). Chiea primară definește identificatorul unic al fiecărei înregistrări (sau rând) dintr-o tabelă.
Comanda "insert" este folosită pentru a insera sau adăuga rânduri într-o tabelă. Pentru a insera înregistrări într-o tabelă, este necesar cuvântul cheie " insert into" urmat de numele tabelei, urmat de o paranteză deschisă, urmată de o listă cu numele coloanelor separate prin ghilimele, urmate de paranteza închisă, urmată de cuvântul cheie "values", urmat de lista de valori scrise între paranteze. Valorile introduse vor fi stocate pe rânduri si apoi vor fi înscrise în celulele din coloanele ale căror nume au fost specificate. Șirurile trebuie scrise intre ghilimele simple, iar numerele nu.
insert into "nume tabelă"
(prima coloană,…,ultima coloană )
values(prima valoare,…,ultima valoare );
Comanda "update" este folosită pentru a actualiza sau schimba înregistrări care se potrivesc criteriului specificat. Acest lucru este realizat prin construirea cu atenție a unei clauze "where".
update "nume tabelă" set "nume coloană 1" = "valoare nouă 1"
[,"nume coloană 2" = "valoare nouă 2"…]
where "nume coloană" operator "valoare"
[and/or "nume coloană" operator "valoare"];
Comanda "delete from" este folosită pentru a șterge înregistrări sau rânduri din tabelă. La această comandă, daca nu se specifică nimic la clauza "where", va fi ștearsă toată tabela.
delete from "nume tabelă" where "nume coloană" operator "valoare"
[and/or "nume coloană" operator "valoare"];
Comanda "drop table"este folosită pentru a șterge o tabelă și toate rândurile din aceasta. Pentru a șterge o tabelă întreagă incluzând toate rândurile sale, se folosește comanda "drop table" urmată de numele tabelei. Comanda "drop table" este diferită de comanda "delete from" la ștergerea tuturor înregistrărilor dintr-o tabelă. Comanda "delete from" poate șterge toate înregistrările dintr-o tabelă, dar lasă intacte numele coloanelor si constrângerile impuse pentru înregistrările din coloanele respective. În schimb, prin comanda "drop table ", se șterg atât înregistrările din tabelă cât și datele care definesc tabela.
drop table "nume tabelă";
Funcțiile agregate sunt folosite pentru a opera calcule asupra datelor numerice returnate din coloana selectată. Aceste funcții de fapt restrâng rezultatele dintr-o coloană si ușurează munca.
Funcțiile aggregate sunt necesare pentru formarea clauzei de grupare "group by".
Clauza "group by" grupează la un loc toate rândurile care conțin datele specificate în coloane și acceptă ca funcțiile agregate sa execute anumite calcule asupra uneia sau mai multor coloane.
select "nume coloană 1" , SUM (nume coloană 2)
from "listă de tabele" group by "listă de coloane";
Clauza "having" permite specificarea condițiilor impuse asupra rândurilor fiecarui grup. Cu alte cuvinte, rândurile vor fi selectate în funcțiie de condiția specificată. Clauza "having" trebuie să urmeze după clauza "group by".
select "nume coloană 1" , SUM (nume coloană 2)
from "listă de tabele" group by "listă de coloane"
having "condiție" ;
Clauza "order by" este opțională și permite afișarea rezultatelor interogării într-o ordine descrescătoare(DESC) sau crescătoare(ASC), pentru coloanele specificate clauzei "order by".
select "nume coloană 1" , SUM (nume coloană 2)
from "listă de tabele" order by "listă de coloane"[ASC/ DESC];
Standardul ANSI SQL-92 acceptă următorii operatori aritmetici de bază:
Următorii operatori matematici sunt foarte folositori în sistemele de gestiune ale bazelor de date relaționale. Cu toate aceste nu sunt incluse in standardul ANSI SQL-92.
Toate interogarile explicate până acum au fost aplicate pe o singură tabelă. Cel mai util lucru din sistemele de baze de date relaționale și SQL este unirea tabelelor cu ajutorul comenzii de unire "join". Mai simplu spus, unirea tabelelor prin "join" face ca sitemele de baze de date relaționale să fie "relaționale".
Comanda "join" permite legarea datelor din două sau mai multe tabele împreună într-un singur rezultat al interogării, printr-o singură comandă de selecție("select"). O legătură de tabele poate fi ușor recunoscută într-o comandă de selecție dacă, după cuvântul cheie "from" sunt mai multe tabele.
select "listă coloane" from "nume tabel 1" , "nume tabel 2" , "nume tabel N"
where "condiții de căutare" ;
Wamp Server
Wamp(Windows/Apache/MySQL/PHP, Python, și/sau PEARL) este un software care include un mediu de dezvoltare a aplicațiilor web compatibil cu sistemul de operare Windows. Wamp Server se folosește de limbajul MySQL pentru gestionarea bazelor de date, de Apache pentru serverul web și un limbaj de programare web PHP5.
Adițional mai suportă și alte limbaje de programare ca și PERL, Pyton, ASP, JavaScript, JSP, RUBY, și multe altele.
Deasemenea Wamp Server contine și alte instrumente de gestionare a bazelor de date cum ar fi PHPmyadmin, SQLBuddy și SQLitemanager.
Pe de altă parte, conținutul Wamp Server este alcătuit din cele mai noi versiuni ale programelor mai sus menționate, dar această aplicație dă utilizatorilor posibilitatea să folosească și versiunile anterioare, dacă doresc să lucreze într-un mediu de dezvoltare aparte.
Ultima versiune a Wamp Server usurează munca programatorilor prin adăugarea unui depanator(Xdebug) pachetului, care permite depanarea codului printer alte funcționalitați.
Wamp Server permite instalarea aplicațiilor web care vor fi accesibile și în rețeaua locala. Așadar, nu este doar un pachet complet, dar se și instalează și configurează ușor, permițând personalizarea serverului fără a fi necesară modificarea fișierelor de configurare.Pe lângă aceste lucruri, interfața Wamp Server include și fișiere cu explicații ajutătoare care conferă confort și ușurință utilizatorilor.
Wamp Server foloște ca interfață cu utilizatorul un bowser de internet ales de utilizator. Pentru proiectul de față s-a ales Mozila Firefox (vezi Figură 3. Interfața Wamp Server).
Figură 3. Interfața Wamp Server
Navicat
Navicat este un software pentru administrarea bazelor de date între ele care permite conectarea la MySQL, Oracle, PostgresSOL, SQLite, SQL Server și/sau MariaDB, făcând administrarea bazei de date foarte usoară. Funcționalitățile din Navicat sunt destul de sofisticate încât să pună la dispoziție tot ce este necesar dezvoltatorilor profesioniști, dar destul de ușor de învățat de către utilizatorii începători ai bazelor de date server.
Interfața grafică cu utilizatorul(GUI) permite rapid și ușor crearea, organizarea, accesul și partajarea informațiilor într-un mod simplu și securizat (vezi Figură 4. Fereastra principală Navicat). Poate conecta utilizatorii la serverul local sau din rețea, punând la dispoziție mai multe instrumente utile cum ar fi: Modelare de Date, Trasfer de Date, Sincronizare de Date/Structuri, Import/Export, Copii de siguranță/Restaurare, Raport de Construire și Planificare pentru a facilita procesul de mentenanță a datelor.
Figură 4. Fereastra principală Navicat
Capitolul III. Prezentarea aplicației
Prezentarea modulelor aplicației
Structura aplicației este relativ simplă (Figură 5. Structura aplicației).
Figură 5. Structura aplicației
Modul Logare
Există două tipuri de utilizatori:
Administrator , este utilizatorul care acces deplin la toate funcționalitățile aplicației. Autentificarea se face printr-un utilizator „admin” și o parola „components”( vezi Figură 6. Logare Administrator).
Criptarea parolei este realizată folosind algoritmul de criptare MD5. Acest algoritm fiind utilizat în autentificarea informației.
Dacă numele si parola utilizatorului corespund cu cele existente în baza de date atunci se va afișa un mesaj de confirmare “Autentificare cu success”.
Figură 6. Logare Administrator
Utilizator normal (vezi Figură 7. Logare Utilizator), este utilizatorul care are acces doar la 3 module ale aplicției.Acestea sunt „Fișier”, „Caută”, „Ajutor”.
Figură 7. Logare Utilizator
Modul Fișier
În acest modul se pot efectua exporturi de fisiere în format Excel cu informații din baza de date.
Administratorul poate vizualiza locațiile libere.
Închiderea aplicației se face în următorul mod:
Se poate închide doar fereastra curentă;
Se poate închide total aplicația .
Modul Adăugare
Modulul conține două submodule:
Componente electronice
În acest submodul se realizează adăugarea de componente electronice.
Are în componența următoarele câmpuri:
Câmpuri de tip etichetă
Folosite pentru a indica ce informație va trebui să introducă utilizatorul în caseta destinată etichetei. Numele etichetelor este sugestiv, astfel pot fi evitate eventuale introduceri eronate ale utilizatorului.
Etichete sunt situate deasupra fiecărei casete .Această abordare conferă ferestrei un aspect placut , utilizatorul având o mai bună privire de ansamblu fată de alte abordări.
Câmpuri de tip edit text
Folosite pentru introducerea de informații în baza de date. În C # al mediului de dezvoltare Microsoft Visual Studio aceste căsuțe au o clasă definită numită ComboBox cu o mulțime de metode și proprietăți care pot fi utilizate.
Pentru a eficientiza timpul de introducere a informațiilor în baza de date s-a folosit tehnologia “ text predictiv” . Principiul de funcționare constă în faptul că la introducerea fiecărui caracter îți sunt sugerate cuvintele care încep cu respectivul caracter sau grup de caractere (vezi Figură 8. Text predictiv).
Pentru acest concept s-a apelat metoda AutoCompleteMode.SuggestAppend – pentru asigurarea predictivitații și metoda AutoCompleteSource. ListItems – importă informțiile corespunzătoare căsutei în lista acesteia.
Figură 8. Text predictiv
Functia public void load_capcitor_resistor() realizeaza importul articolelor din tabele resistor și capacitor în lista de articole corespunzătoare fiecărui câmp din fereastra aplicației.
Functia public void load_battery_buzzer_LCD() realizeaza importul articolelor din tabele battery,buzzer si lcd în lista de articole corespunzătoare fiecărui câmp din fereastra aplicației.
Functia public void load_clock_wise() realizeaza importul articolelor din tabele clock_wise în lista de articole corespunzătoare fiecărui câmp din fereastra aplicației.
Functia public void load_connector_switch() realizeaza importul articolelor din tabele connector și switch în lista de articole corespunzătoare fiecărui câmp din fereastra aplicației.
Functia public void load_diode_inductor_ic_quartz_transistor() realizeaza importul articolelor din tabele diode, inductor,integrated_circuit, quartz și transistor în lista de articole corespunzătoare fiecărui câmp din fereastra aplicației.
Functia public void load_potentiometer() realizeaza importul articolelor din tabele potentiometer în lista de articole corespunzătoare fiecărui câmp din fereastra aplicației.
Se va afișa un mesaj de eroare “ Eroare de conexiune” in cazul în care conexiunea intre baza de date si aplicație nu sa realizat.
Când se încarcă fereastra “Componente electronice” sunt active toate câmpurile, butoanele responsabile de salvarea și actualizarea datelor sunt dezactivate.În funcție de componenta selectată se vor activa doar câmpurile corespunzătoare selecției făcute împreună cu butonul de salvare “ Salveaza” (vezi Figură 9. Constrângeri).
Figură 9. Constrângeri
Pentru producerea acestor evenimente este responabila procedura
private void cmbClassElectronicComponent_TextChanged(object sender, EventArgs e)
Pentru activarea butonului de salvare se verifică mai întâi dacă s-a selectat o componentă. Dacă nu s-a selectact nici o componentă înseamnă că valoare textului este egală cu NULL.
Pentru a se importa articolele din baza de date în lista de articole a căsuțelor corespunzătoare se testează ce componentă s-a selectat și în funcție de această selecție se vor importa datele.
La selecția unei componente se mai produce încă un eveniment numit
cmbClassElectronicComponent_SelectedIndexChanged care este responsabil de importarea tuturor locațiilor libere în lista de articole a căsuței corespunzătoare.
Importul înregistrărilor din baza de date “location” în lista de articole a casuței corespunzătoare se face în următorul mod : se parcuge tabela și se extrag doar acele locații care au înregistrat în coloana „status” articolul „no”. (vezi Anexa ….).
Se va afișa un mesaj de eroare “ Eroare de conexiune” în cazul în care conexiunea între baza de date “location” și aplicație nu s-a realizat.
Selectarea unui A2C
Cea mai importantă constrângere se efectuează în dreptul căsutei pentru introducerea numărului de indentificare A2C care este compus din “A2C” plus alte 8 cifre ca exemplu : A2C0006548. Astfel acesta trebuie să aibe o lungime de 11 caractere.
Figură 10. Tabel
În procedura private void comboBoxA2C_TextChanged(object sender, EventArgs e) se produc urmatoarele evenimente:
Dacă numărul introdus în căsută corespunde cu cel din baza de date, atunci se vor afișa într-un tabel alăturat toate informațiile corespunzătoare numărului respectiv și se va permite actualizarea doar a cantității si a locației în funcție de selectarea dorită, deci celelate casuțe vor fi dezactivate (vezi Figură 10. Tabel).
Pe lângă activarea celor două căsuțe se va mai activa butonul “Actualizare” și se va dezactiva butonul “Salveaza”. Aceste constrângeri sunt efectuate prin apelarea functilor având următorul nume comboBoxEnable_numecomponenta1_numecomponenta2_…() în procedura eveniment comboBoxA2C_TextChanged . (Anexa …)
Afișarea informaților în tabel se face cu ajutorul funcților destinate acestei acțiuni. Funcția public void tabele_battery_buzzer_lcd(string component).Primește ca argument tipul componentei(buzzer,battery și lcd).
Funcția public void tabele_clock_wise(string component).Primește ca argument tipul componentei(clock_wise).
Funcția public void tabele_capacitor_resistor(string component).Primește ca argument tipul componentei(capacitor și resistor)
Funcția public void tabele_potentiometer(string component).Primeste ca argument tipul componentei (potentiometer).
Funcția public void tabele_connector(string component).Primeste ca argument tipul componentei (connector).
Funcția public void tabele_switch(string component).Primeste ca argument tipul componentei (switch).
Funcția public void tabele_diode_inductor_ic_quartz_transistor(string component).Primeste ca argument tipul componentei (diode, inductor, integrated_circuit, quartz, transistor).
Se va afișa un mesaj de eroare „Eroare de conexiune” în cazul în care conexiunea între baza de date „location” și aplicație nu s-a realizat.
Dacă numarul de identificare introdus are mai puțin de 11 caractere si nu respectă structura prezentată mai sus, se va afișa un mesaj de avertizare “A2C incorect”. Acestă constrângere este realizată la declanșarea evenimentului comboBoxDescription_Enter .
Câmpuri de tip buton
Fereastra aplicației conține două butoane responsabile pentru salvarea respectiv actualizarea datelor în baza de date a informațiilor introduse în căsuțele ferestrei.
Salvarea datelor în baza de date
Salvarea datelor în baza de date are loc în momentul acționării butonului „Salvare” situat în partea de jos a ferestrei. La acționarea butonului are loc evenimentul
private void componentSavebutton_Click(object sender, EventArgs e)
În interiorul procedurii se apelează câteva funcții special implementate pentru salvarea datelor introduse de utilizator în tabele din baza de date. Aceste funcții sunt următoarele :
Funcția public void save_battery_buzzer_lcd(string component), primește ca argument numele tabelei (battery, buzzer sau lcd) în funcție de clasa componentei selectate. Are ca sarcină salvarea datelor aflate în câmpurile din interfață în tabele selectate.
Funcția public void save_battery_buzzer_lcd(string component), primește ca argument numele tabelei (battery, buzzer sau lcd) în funcție de clasa componentei selectate. Are ca sarcină salvarea datelor aflate în câmpurile din interfață în tabele selectate.
Funcția public void save_capacitor_resistor(string component), primește ca argument numele tabelei (capacitor sau resistor) în funcție de clasa componentei selectate. Are ca sarcină salvarea datelor aflate în câmpurile din interfață în tabele selectate.
Funcția public void save_connector_switch(string component), primește ca argument numele tabelei (connector sau switch) în funcție de clasa componentei selectate. Are ca sarcină salvarea datelor aflate în câmpurile din interfață în tabele selectate.
Funcția public void save_diode_inductor_ic_quartz_transistor(string component), primește ca argument numele tabelei (diode, inductor, integrated_circuit, quartz, transistor) în funcție de clasa componentei selectate. Are ca sarcină salvarea datelor aflate în câmpurile din interfață în tabele selectate.
Funcția public void save_led(string component), primește ca argument numele tabelei (led) în funcție de clasa componentei selectate. Are ca sarcină salvarea datelor aflate în câmpurile din interfață în tabele selectate.
Funcția public void save_potentiometer(string component), primește ca argument numele tabelei (potentiometer) în funcție de clasa componentei selectate. Are ca sarcină salvarea datelor aflate în câmpurile din interfață în tabele selectate.
Actualizarea datelor în baza de date
Actualizarea este prevăzută doar pentru locație și cantitate.
Actualizarea datelor în baza de date are loc în momentul acționării butonului „Actualizare” situat în partea de jos a ferestrei. La acționarea butonului are loc evenimentul private void componentUpdatebutton_Click(object sender, EventArgs e)
{
//Se crează un obiect de tip conexiune
//Se crează trei obiecte de tip comandă
//Se declară trei șiruri de caractere care conțin interogari MySql
//Se dechide conexiunea
//Se actualizează în funcție de optiune : coloana „quantity” , coloana „location” sau ambele coloane
//Se închide conexiunea
//Se va afișa un mesaj de confirmare dacă a avut loc cu succes salvarea datelor
//Se va afișa un mesaj de eroare în cazul în care salvarea datelor nu s-a facut
}
Obiectul de tip conexiune MySqlConnection are rolul de a realiza conexiunea între baza de date numită „components” și program.
Obiectule de tip comandă MySqlCommand definește comanda UPADATE în cazul nostru.
Șirul conține interogarea MySql pentru actualizarea datelor din program în tabela corespunzătoare clasei componentei .
Comanda MySql pentru actualizare cantității pentru componenta selectată:
string comandaupdate = "UPDATE "+cmbClassElectronicComponent +" SET quantity=@quantity WHERE id_number ='" + comboBoxA2C.Text + "';";
Comanda MySql pentru actualizare locației pentru componenta selectată:
string comandaupdate2 = "UPDATE " + cmbClassElectronicComponent + " SET location=@location WHERE id_number ='" + comboBoxA2C.Text + "';";
Comanda MySql pentru actualizare cantității și a locației pentru componenta selectată:
string comandaupdate3 = "UPDATE " + cmbClassElectronicComponent + " SET quantity=@quantity,location=@location WHERE id_number ='" + comboBoxA2C.Text + "';";
Citirea comenzilor se realizează cu următoarea secvență de cod:
cmd.CommandText = comandaupdate;
cmd2.CommandText = comandaupdate2;
cmd3.CommandText = comandaupdate3;
Actualizarea coloanelor din tabelele corespunzătorea componentei selectate se realizează testând care dintre coloane se dorește să fie actualizată.Există posibilitate ca ambele coloane să fie actualizate. Pentru actualizare se folosește următoarea secvență de cod:
Actualizarea coloanei „quantity”:
if (checkBoxQuantity.Checked == true)
{
cmd.Parameters.AddWithValue("@quantity", comboBoxQuantity.Text);
cmd.ExecuteNonQuery();
}
Actualizarea coloanei „location”
if (checkBoxLocation.Checked == true)
{
cmd2.Parameters.AddWithValue("@location", comboBoxLocation.Text);
cmd2.ExecuteNonQuery();
}
Modul Căutare
Acest modul dispune de două opțiuni utilizate în procesul de căutare a componentelor.
Opțiunea „A2C” ,utilizată pentru căutarea unei componente după numărul de inventar numit „A2C”.
Opțiunea „Detalii”, utilizată pentru căutarea unei componente după unul sau mai multe caracteristici, cum ar fi: clasă, subclasă, valoare, limită, descriere etc.
Căutare după A2C
Etichete indică ce informație va trebui să introducă utilizatorul în caseta destinată etichetei. Numele etichetelor este sugestiv, astfel pot fi evitate eventuale introduceri eronate ale utilizatorului. Mai conține si o etichetă cu scopul de avertiza utilizatorul în cazul stocului minim stabilit.
Etichete sunt situate deasupra fiecărei casete .Această abordare conferă ferestrei un aspect placut , utilizatorul având o mai bună privire de ansamblu fată de alte abordări.
Pe lângă etichetele cele folosite ca și indicator ,fereastra mai conține un linklabel , în care se găsește locația componentei.Atunci când se acționează link-ul în fereastră va apărea o poză care îți indică exact locația componentei. Această funcționalitate este implemetată prin procedura eveniment
pivate void linkLabel1_LinkClicked(object sender,LinkLabelLinkClickedEventArgs e)
{
//Se testează dacă în textul link-ului apare locația fiecărui tip de dulap sau cutie
}
Un exemplu de testare pentru fiecare tip de dulap sau cutie:
if (linkLabel1.Text.Substring(6, 3) == "DR3")
{
location_DR3();
}
DR3 înseamnă „dulap rotativ numarul 3”.
Se caută în fiecare câmp al locației dacă găsește cuvântul DR3 .
Pentru fiecare tip de dulap sau cutie s-a implementat câte o funcție. Un exemplu de funcție poate fi funcția pentru dulapul rotativ numărul 3(DR3):
public void location_DR3()
{
//Se crează un obiect de tip conexiune
//Se crează câte un obiect de tip DataAdapter pentru cele 24 de locații din dulap
//Se crează câte un obiect de tip DataTable pentru cele 24 de locații din dulap
//Se încarcă poza dulapului
//Se apelează metoda Fill() pentru cele 24 obiecte de tip DataAdapter
//Se deschide conexiunea
//Se verifică fiecare locație
//Pentru fiecare locație se crează un pătrat care încadrează locația din dulap
//Se afișează un mesaj de eroare
}
Obiectul de tip conexiune MySqlConnection are rolul de a realiza conexiunea între baza de date numită „components” și program.
Obiectule de tip comandă MySqlCommand definește comanda UPADATE în cazul nostru.
Obiectul de tip DataAdapter MySqlDataAdapter are rolul de a transfera datele dintr-o conexiune și un DataSet folosind metoda Fill(). DataSet-ul este de asemenea un obiect cu rolul de a stoca datele din baza de date „components”.
MySqlDataAdapter da0 = new MySqlDataAdapter("SELECT * FROM " + cmbClassElectronicComponent.Text + " WHERE location LIKE '%DR3%1.1%' ", conn1);
Obiectul de tip MySqlDataTable contine înregistrările existente în tabelele corespunzătoare fiecărei clase din baza de date.
DataTable dt0 = new DataTable();
da0.Fill(dt0);
Pentru încărcarea pozei se folosește următoarea secvență de cod:
LoadDR3();
locationPictureBoxDR3.Image = b;
g.Clear(Color.Transparent);
Verificarea locației se face printr-o instrucțiune for().În interiorul acestei instructiuni se verifică locația și se crează un dreptunghi ce încadrează locația din dulap:
for (int i = 0; i < dt0.Rows.Count; i++)
{
if (linkLabel1.Text.Equals(dt0.Rows[i]["location"]))
{
option = 0;
}
}
switch (option)
{
case 0: { g.DrawRectangle(new Pen(Brushes.Red, 3), 30, 10, 50, 35); break; }
case 1: { g.DrawRectangle(new Pen(Brushes.Red, 3), 80, 10, 50, 35); break; }
…
case 23: { g.DrawRectangle(new Pen(Brushes.Red, 3), 130, 255, 50, 35); break; }
default: break;
}
Câmpurile de tip comboBox sunt folosite pentru introducerea de informații în baza de date.
Din nou s-a folosit aceeasi tehnică , “ text predictiv”, folosită la fereastra „Componente electronice” pentu introducerea datelor cât mai eficient (vezi Fig3.1.3 Text predictiv)
Importarea articolelor pentru fiecare căsuță se face cu ajutorul unor funcții specifice pentru fiecare componentă. Funcțiile respective sunt definite astfel:
Procedura eveniment cmbClassElectronicComponent_SelectedIndexChanged( ) responsabilă de importarea articolelor din tabela selectată în lista de articole a căsuței corespunzătoare A2C-ului
private void cmbClassElectronicComponent_SelectedIndexChanged(object sender, EventArgs e)
{
//Se crează un obiect de tip conexiune
//Se crează un obiect de tip DataAdapter
//Se crează un obiect de tip DataTable
//Se apelează metoda Fill()
//Se deschide conexiunea
//Se importă articolele din coloana „id_number” a tabelei selectate în lista de articole a căsuței corespunzătoare A2C-ului
//Se închide conexiunea
//Se afișează un mesaj de eroare
}
Obiectul de tip conexiune MySqlConnection are rolul de a realiza conexiunea între baza de date numită „components” și program.
Obiectul de tip DataAdapter MySqlDataAdapter are rolul de a transfera datele dintr-o conexiune și un DataSet folosind metoda Fill(). Comanda selectează toate coloanele din tabele selectată de utilizator.
MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM "+cmbClassElectronicComponent .Text +" ;", conn1);
Listarea A2C-urilor în lista de articole a căsuței corespunzătoare A2C-ului se realizează prin următoarea secvență de cod:
for (int i = 0; i < dt.Rows.Count; i++)
{
cmbA2C.Items.Add(dt.Rows[i]["id_number"]);
}
Procedura eveniment tbQuantity_TextChanged( ) este responsabilă de atenționarea utilizatorului că stocul A2C-ul selectat numără mai puțin de 50 de unități. Această procedură verifică stocul existent dacă este mai decât 50 și afișează în fereastră o etichetă „Stoc limitat”.
private void tbQuantity_TextChanged(object sender, EventArgs e)
{
if (Convert.ToInt32(tbQuantity.Text) < 50)
{
lblStockLimit.Visible = true;
}
else
{
lblStockLimit.Visible = false;
}
}
Fereastra dispune de unbuton pentru căutare unei compoente după A2C
La acționarea butonului apar următoarele evenimente:
se va afișa în căsuța corespunzătoare stocului cantitatea existentă pentru A2C-ul căutat;
se va afișa o etichetă cu locația corespunzătoare A2C-ului căutat;
se vor afișa într-un tabel toate informațiile despre A2C-ul căutat;
Definirea procedurii este următoarea:
private void btnSearch_Click(object sender, EventArgs e)
{
//Se apelează funcțiile create pentru fiecare tip de componentă
}
Buton pentru actualizarea stocului corespunzător A2C-ului căutat
private void button1_Click(object sender, EventArgs e)//update
{
//Se crează un obiect de tip conexiune
//Se crează un obiect de tip comandă
//Se definește un sir de caractere ce conține comanda UPDATE
//Se calculează diferența dintre cantitatea existentă în stoc și cantitatea necesară.
//Se deschide conexiunea
//Se actualizează noua cantitate în tabela corespunzătoare A2C-ului căutat
//Se închide conexiunea
//Se afișează un mesaj de confirmare că actualizarea s-a încheiat cu succes
//Se afișează un mesaj de eroare în cazul în care actualizarea nu s-a încheiat cu succes
}
Mai este și un buton pentru actualizarea stocului în cazul în care componentas-a gasit și se dorește o anumită cantitate.
Comanda MySql actualizează datele pentru A2C-ul căutat în tabela selectată .
string comanda = „UPDATE „ + cmbClassElectronicComponent.Text + „ SET quantity=@quantity WHERE id_number=’” + cmbA2C.Text + „’;”;
Noua cantitate se calculează în următorul mod:
int needQuantity = Convert.ToInt32(tbQuantityNeed.Text);
int oldQuantity = Convert.ToInt32(tbQuantity.Text);
newQuantity = oldQuantity – needQuantity;
textBox1.Text = Convert.ToString(newQuantity);
Actualizarea în baza de date se face cu următoarea secvență de cod:
cmd.CommandText = comanda;
cmd.Parameters.AddWithValue("@quantity", textBox1 .Text );
cmd.ExecuteNonQuery();
Căutare după detalii
Acest tip de căutare se bazează pe principiul căutării după A2C, doar că diferențele între aceste două căutări constă în faptul că la căutare după detalii , utilizatorul are posibilitatea să caute o componentă după mai multe câmpuri, cum ar fi:
Clasă;
Subclasă;
Descriere;
Valoare;
Limită;
Capsulă;
Pentru acest tip de căutare s-a creat o fereastră ce conține următoarele câmpuri:
Etichete;
ComboBox;
Buton;
Tabel;
Etichete indică ce informație va trebui să introducă utilizatorul în caseta destinată etichetei. Numele etichetelor este sugestiv, astfel pot fi evitate eventuale introduceri eronate ale utilizatorului. Mai conține si o etichetă cu scopul de avertiza utilizatorul în cazul stocului minim stabilit.
Etichete sunt situate deasupra fiecărei casete .Această abordare conferă ferestrei un aspect placut , utilizatorul având o mai bună privire de ansamblu fată de alte abordări.
Pe lângă etichetele cele folosite ca și indicator ,fereastra mai conține un linklabel , în care se găsește locația componentei.Atunci când se acționează link-ul în fereastră va apărea o poză care îți indică exact locația componentei. Această funcționalitate este implemetată prin procedura eveniment
pivate void linkLabel1_LinkClicked(object sender,LinkLabelLinkClickedEventArgs e)
{
//Se testează dacă în textul link-ului apare locația fiecărui tip de dulap sau cutie
}
Un exemplu de testare pentru fiecare tip de dulap sau cutie:
if (linkLabel1.Text.Substring(6, 3) == "DR2")
{
location_DR2();
}
DR2 înseamnă „dulap rotativ numarul 2”.
Se caută în fiecare câmp al locației dacă găsește cuvântul DR2.
Pentru fiecare tip de dulap sau cutie s-a implementat câte o funcție. Un exemplu de funcție poate fi funcția pentru dulapul rotativ numărul 2(DR2):
public void location_DR2()
{ //Se crează un obiect de tip conexiune
//Se crează câte un obiect de tip DataAdapter pentru cele 24 de locații din dulap
//Se crează câte un obiect de tip DataTable pentru cele 24 de locații din dulap
//Se încarcă poza dulapului
//Se apelează metoda Fill() pentru cele 24 obiecte de tip DataAdapter
//Se deschide conexiunea
//Se verifică fiecare locație
//Pentru fiecare locație se crează un pătrat care încadrează locația din dulap
//Se afișează un mesaj de eroare
}
Obiectul de tip conexiune MySqlConnection are rolul de a realiza conexiunea între baza de date numită „components” și program.
Obiectule de tip comandă MySqlCommand definește comanda UPADATE în cazul nostru.
Obiectul de tip DataAdapter MySqlDataAdapter are rolul de a transfera datele dintr-o conexiune și un DataSet folosind metoda Fill(). DataSet-ul este de asemenea un obiect cu rolul de a stoca datele din baza de date „components”.
MySqlDataAdapter da0 = new MySqlDataAdapter("SELECT * FROM " + cmbClassElectronicComponent.Text + " WHERE location LIKE '%DR2%1.1%' ", conn1);
Obiectul de tip MySqlDataTable contine înregistrările existente în tabelele corespunzătoare fiecărei clase din baza de date.
DataTable dt0 = new DataTable();
da0.Fill(dt0);
Pentru încărcarea pozei se folosește următoarea secvență de cod:
LoadDR2();
locationPictureBoxDR2.Image = b;
g.Clear(Color.Transparent);
Verificarea locației se face printr-o instrucțiune for().În interiorul acestei instructiuni se verifică locația și se crează un dreptunghi ce încadrează locația din dulap:
for (int i = 0; i < dt0.Rows.Count; i++)
{
if (linkLabel1.Text.Equals(dt0.Rows[i]["location"]))
{
option = 0;
}
}
switch (option)
{
case 0: { g.DrawRectangle(new Pen(Brushes.Red, 3), 15, 20, 45, 28); break; }
case 1: { g.DrawRectangle(new Pen(Brushes.Red, 3), 60, 20, 45, 28); break; }
…
case 23: { g.DrawRectangle(new Pen(Brushes.Red, 3), 150, 328, 45, 28); break; }
default: break;
}
Câmpurile de tip comboBox sunt folosite pentru introducerea de informații în baza de date.
Din nou s-a folosit aceeasi tehnică , “ text predictiv”, folosită la fereastra „Componente electronice” pentu introducerea datelor cât mai eficient (vezi)
Importarea articolelor pentru fiecare căsuță se face cu ajutorul unor funcții specifice pentru fiecare componentă. Funcțiile respective sunt definite astfel:
Procedura eveniment cmbClassElectronicComponent_SelectedIndexChanged( ) responsabilă de importarea articolelor din tabela selectată în lista de articole a căsuței corespunzătoare clasei selectate. Se vor afișa în tabel toate componentele din clasa selectată.
Procedura eveniment private void comboBoxDescription_SelectedIndexChanged(object sender, EventArgs e) este responsabilă de importarea articolelor din tabela selectată în lista de articole a căsuței corespunzătoare descrierii. Se vor afișa toate componentele din clasa și descrierea selectată.
Procedura eveniment private void comboBoxMain_Property_SelectedIndexChanged(object sender,EventArgs e) este responsabilă de importarea articolelor din tabela selectată în lista de articole a căsuței corespunzătoare proprietății principale (valoarea). Se va afișa toate componentele din clasa și valoarea selelctată.
Procedura eveniment private void comboBoxSecond_Property_SelectedIndexChanged(object sender, EventArgs e) este responsabilă de importarea articolelor din tabela selectată în lista de articole a căsuței corespunzătoare proprietății secundare ( limita). Se va afișa toate componentele din clasa și limita selelctată.
Procedura eveniment private void comboBoxPackage_SelectedIndexChanged(object sender, EventArgs e) este responsabilă de importarea articolelor din tabela selectată în lista de articole a căsuței corespunzătoare capsulei. Se va afișa toate componentele din clasa și capsula selelctată.
Pentru a se afișa toate datele componentelor în tabel s-au implementat următoarele funcții:
public void tabele_battery_buzzer_lcd(string component, string typeproperty, string comboBox):afișează date despre baterii, buzzer și LCD(Liquid-crystal display);
public void tabele_clock_wise(string component, string typeproperty, string comboBox): afișează date despre clockwise(motor care ajută la indicarea vitezei sau alte indicații pe un instrument de bord;
public void tabele_capacitor_resistor(string component, string typeproperty, string comboBox): afișează date despre condensatori si rezistori;
public void tabele_potentiometer(string component, string typeproperty, string comboBox): afișează date despre potențiometre;
public void tabele_connector(string component, string typeproperty, string comboBox): afișează date despre conectori;
public void tabele_switch(string component, string typeproperty, string comboBox): afișează date despre comutatoare;
public void tabele_LED(string component, string typeproperty, string comboBox): afișează date despre LED-uri;
public void tabele_diode_inductor_ic_quartz_transistor(string component, string typeproperty, string comboBox): afișează date despre diode, bobine, circuite integrate, quartz și tranzitori;
public void tabele_module(string component, string typeproperty, string comboBox): afișează date despre module de radio frecvență sau alte tipuri.
Pentru a se afișa poza cu dulapul în care este stocată componenta s-au implementat funcțiile :
public void Load_DR2(): afișează poza cu dulapul rotativ numărul 2 (DR2);
public void Load_DR3(): afișează poza cu dulapul rotativ numărul 3 (DR3);
Pentru a se afișa exact locația unei componente s-au implementat funcțiile:
public void location_DR2(): afișează exact locația componentei căutate pri încadrarea într-un dreptunghi a sertarului respectiv din dulapul numărul 2;
public void location_DR3(): afișează exact locația componentei căutate pri încadrarea într-un dreptunghi a sertarului respectiv;
Procedura eveniment tbQuantity_TextChanged( ) este responsabilă de atenționarea utilizatorului că stocul A2C-ul selectat numără mai puțin de 50 de unități. Această procedură verifică stocul existent dacă este mai decât 50 și afișează în fereastră o etichetă „Stoc limitat”.
private void tbQuantity_TextChanged(object sender, EventArgs e)
{
if (Convert.ToInt32(tbQuantity.Text) < 50)
{
lblStockLimit.Visible = true;
}
else
{
lblStockLimit.Visible = false;
}
}
Fereastra dispune de un buton pentru actualizarea cantității unei compoente în funcție de selecția făcută
Comanda MySql actualizează datele pentru componenta căutată în tabela selectată .
string comanda = „UPDATE „ + cmbClassElectronicComponent.Text + „ SET quantity=@quantity WHERE main_property=’” + comboBoxMain?property.Text + „’;”;
Noua cantitate se calculează în următorul mod:
int needQuantity = Convert.ToInt32(tbQuantityNeed.Text);
int oldQuantity = Convert.ToInt32(tbQuantity.Text);
newQuantity = oldQuantity – needQuantity;
textBox1.Text = Convert.ToString(newQuantity);
Actualizarea în baza de date se face cu următoarea secvență de cod:
cmd.CommandText = comanda;
cmd.Parameters.AddWithValue("@quantity", textBox1 .Text );
cmd.ExecuteNonQuery();Modul Ajutor
Modulul Ajutor s-a implementat pentru a veni în ajutorul utilizatorului în cazul în care acesta va întâmpina probleme în utilizarea aplicației.
Se explică exact pașii care trebuie urmați pentru o utilizare corectă a modulelor de Adăugare și Căutare .
Fereastra conține 4 controale de tip Tab . Pentru a afișa informațiile cu privire la utilizarea fiecărui modul s-a utilizat proprietatea Text a acestui control .
Un exemplu :
tabControl1.Text=„informatii pentru utilizare”.
Baza de date
Baza de date conține 3 tabele. O tabelă pentru componente și echipamente, o tabelă pentru locațiile unde pot fi stocate componentele și o tabelă destinată pentru utilizatori (vezi Figură 11. Baza de date).
Figură 11. Baza de date
Fiecare tabelă o cheie primară, coloana „id”. Tabelele pentru componente au o cheie externa – coloana „location” – în relație cu , cheia primară – coloana „location” – din tabela „location”.
Această relație este folosită pentru modulul de adăugare componente, sugerând locațiile libere care sunt gata pentru a fi ocupate.
Capitolul IV. Manual de utilizare
Termeni utilizați
Administrator : reprezintă utilizatorul care are acces la toate funcționalitățile aplicației;
Utilizator normal: reprezintă utilizatorul care are acces doar la meniurile: “Ajutor”, “Căutare” si “Fișier”;
Autentificarea utilizatorului
La lansarea în execuție a aplicației, utilizatorii vor fi intâmpinați de fereastră de autentificare care se numește „Autentificare” (vezi Figură 12. Autentificare).
Figură 12. Autentificare
Fereastră de autentificare are în componență următoarele componente:
„Utilizator normal”: buton pentru accesul utilizatorilor normali care au acces doar la anumite funcțiuni ale programului. Acesta este activat în mod implicit la lasarea în execuție a programului. La acționarea acestuia se vor activa următoarele meniuri: “Ajutor”, “Căutare” si “Fișier”
„Administrator” : buton pentru accesul administratorului care are acces deplin la toate funcțiunile programului.La acționarea butonului de către utilizator se vor activa cele doua câmpuri de tip editbox în care se vor introduce informațiile necesare pentru autentificare. De asemenea se mai activează si butonul numit “Autentificare”;
„Utilizator” câmp de tip editbox, necesar pentru introducerea numelui utilizatorului corespondent din baza de date;
„Parola”câmp de tip editbox, necesar pentru introducerea parolei corespunzătoare numelui utilizatorului din baza de date;
„Autentificare” : buton destinat pentru autentificare. La acționarea acestuia se realizează autentificarea doar dacă numele și parola utilizatorului corespund cu numele și parola utilizatorului din baza de date și se va afișa un mesaj de confirmare “Autentificare cu success”. Dacă numele si parola utilizatorului nu corespund cu cele existente în baza de date se va afișa un mesaj de erorare: “ Nume sau parolă incorectă” ( vezi Figură 13. Avertizare date incorecte).
Figură 13. Avertizare date incorecte
Există două tipuri de utilizatori:
Administrator: acest tip de utilizator are acces la toate funcțiunile programului, ca de exemplu: adaugarea de noi componente sau echipamente, editarea sau căutarea unor componente sau echipamente existente în stoc etc.
Utilizator normal : acest tip de utilizator are acces doar la unele funcțiuni ale programului cum ar fi: căutarea unor componente sau echipamente existente în stoc, precum și acces la meniul de tipărire, de scoatere la imprimantă.
Deschiderea ferestrei principale
Fereastra conține 2 zone:
Meniul principal;
Ecranul de afișare.
Meniul principal afișează o listă de comenzi corespunzătoare secțiunii aplicației:
Fișier;
Adăugare;
Căutare;
Ajutor.
Figură 14. Fereastra principală
Descrierea utilizare secțiune Fișier
Meniul Fișier este accesibil pentru ambi utilizatori, administrator și utilizatorii normali. Conține următoarele opțiuni:
Export;
Locații libere;
Închidere;
Închire totală.
Export
Această funcțiune a programului se folosește în cazul în care se dorește exportul în format excel din baza de date a unor informații dorite.
Locații libere
Această funcțiune a programului ajută administratorul în cazul în care acesta dorește să afle ce locații sunt libere. Tot în această opțiune administratorul are posibilitate de a creea noi locații.
Închidere
Această funcțiune a programului permite închiderea doar a unei ferestre.
Închidere totală
Acestă funcțiune a programului permite utilizatorului ieșirea directă din aplicație .
Descrierea utilizare secțiune Adăugare
Meniul Adăugare (vezi Figură 15. Adăugare) este accesibil doar administratorului și conține două opțiuni:
Componente electronice;
Echpamente.
Figură 15. Adăugare
Adăugare componente electronice
Această funcțiune a programului permite utilizatorului să adauge noi componente în baza de date , iar dacă componenta există în baza de date , se poate actualiaza locația și cantitate. Actualizarea se face doar în cazul în care utilizatorul introduce o noua cantitate.
Informațiile se introduc rând pe rând după cum urmează:
Clasa din care face parte componenta (baterie, resistor, circuit integrat etc.);
Subclasa din clasa componentei ( nickel, liniar, memorie etc.);
Numarul de indentificare numit “A2C” care este unic ( A2C00001258, A2C53021457 etc.);
Descrierea componentei unde este cazul(LM2901, BC847 etc.);
Proprietatea principală a componentei (3V, 22R, 100uF etc.);
Proprietatea secundară a componentei unde este cazul ( 1A, 250mW etc.);
Capsula componentei(THT, SMD, R0805, C0603, TO252, SOT23 etc.);
Toleranța componentei unde este cazul (1%, 10%, 0.1% etc.);
Numele de furnizor unde este cazul ( Farnell, Vishay etc.);
Numărul de indentificare al furnizorului unde este cazul (124-2564, GRM188R61E105KA12D ) ;
Valoarea stocului existent ;
Locația la care se află componenta (A0.89/DR2/A1.2/2, S01/A3/M1 etc.);
Eventuale observații privind componenta (echivalent ).
Informațiile ce trebuie introduse prezentate mai sus, se vor introduce în funcție de clasa componentei selectată.
Trecerea de la un câmp la altul se face prin apăsarea tastei Tab .
Dacă în momentul introducerii unei componente, numărul de identificare se află în baza de date, atunci se va actualiza cantitatea și o eventuală locație pe lângă cea existentă. În această operație se va afișa într-un tabel toate informațiile cu privire la acel număr de indentificare introdus în câmpul corespunzător.
Pentru a eficientiza timpul de introducere a informațiilor în baza de date s-a folosit tehnologia “ text predictiv” . Principiul de funcționare constă în faptul că la introducerea fiecărui caracter îți sunt sugerate cuvintele care încep cu respectivul caracter sau grup de caractere (vezi Figură 16. Text predictiv).
Figură 16. Text predictiv
Când se deschide fereastra “Componente electronice” sunt active toate câmpurile, butoanele responsabile de salvarea și actualizarea datelor sunt dezactivate. În funcție de clasa componentei selectată se vor activa doar câmpurile corespunzătoare selecției făcute împreună cu butonul de salvare “ Salveaza” (vezi Figură 17. Constrângeri).
Figură 17. Constrângeri
Cea mai importantă constrângere se efectuează în dreptul câmpului pentru introducerea numărului de indentificare A2C care este compus din “A2C” plus alte 8 cifre ca exemplu : A2C0006548. Astfel acesta trebuie să aibe o lungime de 11 caractere ( vezi Figură 18. Tabel).
Figură 18. Tabel
Dacă numărul de identificare introdus în câmp corespunde cu cel din baza de date, atunci se vor afișa într-un tabel alăturat toate informațiile corespunzătoare numărului respectiv și se va permite actualizarea doar a cantității si a locației în funcție de selectarea dorită, deci celelate câmpuri vor fi dezactivate.
Pe lângă activarea celor două căsuțe se va mai activa butonul “Actualizare” și se va dezactiva butonul “Salveaza” (vezi Figură 19. Actualizare).
Figură 19. Actualizare
Aceste operații efectuate de utilizator sunt însoțite de mesaje de confirmare, mesaje de eroare si mesaje de avertizare.
Echipamente
Această funcțiune a programului (vezi Figură 20. Echipament) permite utilizatorului adăugarea unor echipamente electronice cum ar fi:
Osciloscop;
Multimetru;
Statie de lipit;
RLC metru;
Extractor de fum;
Surse de alimentare;
Alte echipamente.
Informațiile se introduc pe rând după cum urmează:
„Clasa” , câmp de tip editbox utilizat pentru introducerea tipului de echipament ( sursă alimentare, osciloscop, multimetru etc.):
„Număr inventar”, câmp de tip editbox utilizat pentru introducerea numărului de inventar al echipamentului:
„Locatie”, câmp de ti editbox utilizat pentru introducerea locației;
„Observații”, câmp de tip editbox utilizat pentru introducerea unor observații dacă este cazul.
Figură 20. Echipament
Descrierea utilizare secțiune Căutare
Meniul Căutare este accesibil atât administratorului cât și utilizatorilor obișnuiți. Conține două opțiuni:
A2C;
Detalii.
Căutare după numărul de identificare A2C
Figură 21. Căutare după A2C
Informațiile se introduc rând pe rând după cum urmează:
Clasa din care face parte componenta (baterie, rezistor, circuit integrat etc.);
Numărul de indentificare numit “A2C” care este unic ( A2C00001258, A2C53021457 etc.);
Se acționează butonul „Cauta” ;
La acționarea butonului „Cauta” se va afișa :
valoarea stocului existent în căsuța corespunzătoare pentru A2C-ul selectat, plus un label cu „Stoc limitat”;
o poză în care este ilustrată locația componentei;
Cantitatea necesară;
Se acționează butonul „Actualizare” ;
În tabel se vor afișa informații cu privire la A2C-ul selectat.
Trecerea de la un câmp la altul se mai poate face utilizând tasta Tab.
Informațiile ce trebuie introduse prezentate mai sus, se vor introduce în funcție de clasa componentei selectată.
Dacă în momentul acționări butonului „Cauta”, numărul de identificare se află în baza de date, atunci se va afișa :
în câmpul corespunzător cantității, stocul disponibil ;
un câmp de tip text în cazul în care stocul existent se află sub valoarea sub 50;
un câmp de tip referință (link) care îti indică locația;
o poză care îți indică locația componentei ;
un tabel cu toate informațiile cu privire la acel număr de indentificare introdus în câmpul corespunzător.
Apoi după acționarea butonului „Cauta” se va introduce în câmpul corespunzător cantității necesare, cantitatea de care are nevoie utilizatorul. După ce se introduce cantitatea necesară se acționează butonul „Actualizează” pentru a actualiza stocul disponibil în baza de date. Acesată actualizare se face în următorul mod: cantitatea existentă – cantitatea necesară.
Aceste operații efectuate de utilizator sunt însoțite de mesaje de confirmare, mesaje de eroare si mesaje de avertizare.
Căutare după mai multe Detalii
Figură 22. Căutare după detalii
Informațiile se introduc rând pe rând după cum urmează (vezi Figură 22. Căutare după detalii):
Clasa din care face parte component (baterie, rezistor, circuit integrat etc.);
Se alege criteriul de căutare:
Subclasa în funcție de clasa aleasă ( ceramic, memorie, linear etc.);
Descriere pentru componenta din clasa selectată (BC817,LM7805, BAS21 etc.);
Proprietatea principală pentru componenta din clasa selectată (10R,22nF,50V,10A);
Proprietatea secundară pentru componentadin calasa selectată (250mW, 50V, 25A etc.);
Capsula coreaspunzătoare componentei (R0402,R1206,C0603, TO252, SO16 etc.);
În tabel se vor afișa informații în funcție de criteriul de căutare.
Se acționează link-ul din tabel ce conține locația componentei din coloana „locatie”. Acesta va crea alt link ce va conține locația componentei;
Se acționează link-ul. Se va afișa o poză ce va indica exact locația componentei respective;
Cantitatea necesară;
Se acționează butonul „Actualizare” ;
Informațiile ce trebuie introduse prezentate mai sus, se vor introduce în funcție de clasa componentei selectată.
După acționarea link-ului se va introduce în căsuța corespunzătoare cantității necesare, cantitatea de care are nevoie utilizatorul.După ce se introduce cantitatea necesară se acționează butonul „Actualizează” pentru a actualiza stocul disponibil în baza de date. Acesată actualizare se face în urmatorul mod: cantitatea existentă – cantitatea necesară.
Aceste operații efectuate de utilizator sunt însoțite de mesaje de confirmare, mesaje de eroare si mesaje de avertizare.
Descrierea utilizare secțiune Ajutor
Figură 23. Ajutor
Meniul „Ajutor” este accesibil pentru orice tip de utilizator. Accesarea aceastei fereastre se face prin „click” cu mouse-ul pe secțiune „Ajutor” (vezi Figură 23. Ajutor).
Fereastra conține mai multe tab-uri:
„Adăugare componente” : se găseste informații ce țin de adăugarea unei componente;
„Adăugare echipamente”: se găseste informații ce țin de adăugarea unui echipament;
„Căutare după A2C”: se găseste informații ce țin de căutarea unei componente dupa numărul de indentificare;
„Căutare după Detalii”: se găseste informații ce țin de căutarea unei componente după mai multe detalii;
Ieșirea din aplicație
Aplicția poate fi închisă de utilizator în unul din modurile:
Prin accesarea succesivă a opțiunilor Fișier, Ieșire;
Prin click cu mouse-ul a butonului aflat în partea dreaptă a barei de titlu;
Aplicația poate fi părăsită indiferent ce ferestre ar fi dechise în acel moment.
Capitolul V. Concluzii și Direcții de dezvoltare
Acest proiect m-a ajutat să-mi pun bazele teoretice și practice în ceea ce înseamnă :
un mediu de dezvoltare precum Visual Studio cu toate facilitățile oferite de acesta;
limbajul de programare Visual C#;
sistemul relational de baze de date numit MySQL.
Am învățat ceea ce înseamnă să faci un proiect început de la zero și treptat urmând fazele de dezvoltarea a unui proiect software, să realizezi partea de documentație ce cuprinde specificațiile , implementarea si manualul de utilizare,apoi implementarea acestor specificații și testarea aplicației pentru a stabli dacă ce s-a implementat este în conformitate cu cerințele specificate.
Este evident că un produs software la început nu poate să cuprinde toate soluțiile pentru anumite nevoi ale utilizatorilor. Deci intotdeauna există loc de îmbunătățiri sau de adăugarea altor funcționalități.
În această directie continuă a dezvoltării pentru această aplicație aș sugera câteva funcționalități care pot fi adăugate:
Căutare după mai multe A2C: presupune introducerea mai multor A2C-uri într-o listă și căutare acestora în toate tabelele din baza de date și apoi listarea acestora;
Crearea de noi locații, deoarece există posibilitatea ca locațiile la un moment dat să fie toate ocupate.
BIBLIOGRAFIE
[Du09] Paul DuBois (2009) MySQL
[Dun02] Robert B. Dunaway (2002) The Book of Visual Studio.Net: Aguide for Developers.
[Gri03] Ian Griffiths, Jon Flanders, Chris Sells (2003) Mastering Visual Sudio.NET
[Moj03] Jose Mojica (2003) C# Web Development with ASP.NET
[Pes10] Dan Pescaru (2010) Adminisatrare Baze de Date Web
[Ste10] Andrew Stellman, Jennifer Greene (2010) Head First C#
DECLARAȚIE DE AUTENTICITATE
A
LUCRĂRII DE FINALIZARE A STUDIILOR
Titlul lucrării ________________________________________________________
___________________________________________________________________
___________________________________________________________________
Autorul lucrării _____________________________________________
Lucrarea de finalizare a studiilor este elaborată în vederea susținerii examenului de finalizare a studiilor organizat de către Facultatea _________________________________________ din cadrul Universității din Oradea, sesiunea_______________________ a anului universitar ______________.
Prin prezenta, subsemnatul (nume, prenume, CNP)_____________________
___________________________________________________________________
___________________________________________________________________,
declar pe proprie răspundere că această lucrare a fost scrisă de către mine, fără nici un ajutor neautorizat și că nici o parte a lucrării nu conține aplicații sau studii de caz publicate de alți autori.
Declar, de asemenea, că în lucrare nu există idei, tabele, grafice, hărți sau alte surse folosite fără respectarea legii române și a convențiilor internaționale privind drepturile de autor.
Oradea,
Data Semnătura
BIBLIOGRAFIE
[Du09] Paul DuBois (2009) MySQL
[Dun02] Robert B. Dunaway (2002) The Book of Visual Studio.Net: Aguide for Developers.
[Gri03] Ian Griffiths, Jon Flanders, Chris Sells (2003) Mastering Visual Sudio.NET
[Moj03] Jose Mojica (2003) C# Web Development with ASP.NET
[Pes10] Dan Pescaru (2010) Adminisatrare Baze de Date Web
[Ste10] Andrew Stellman, Jennifer Greene (2010) Head First C#
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: Gestiunea Componentelor Si Echipamentelor Dintr O Companie Folosind C# Si Mysql (ID: 140629)
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.
