SPECIALIZAREA MATEMATICǍ-INFORMATICǍ LUCRARE DE LICENȚĂ MANAGEMENTUL UNUI MAGAZIN DE DULCIURI CU BAZA DE DATE ÎN SQL ȘI INTERFAȚĂ ÎN JAVA Conducător… [308784]
[anonimizat]-NAPOCA
FACULTATEA DE MATEMATICǍ ȘI INFORMATICǍ
SPECIALIZAREA MATEMATICǍ-INFORMATICǍ
LUCRARE DE LICENȚĂ
MANAGEMENTUL UNUI MAGAZIN DE DULCIURI CU BAZA DE DATE ÎN SQL ȘI
INTERFAȚĂ ÎN JAVA
Conducător științific
ASISTENT EMILIA POP
Absolvent: [anonimizat]
2018
Abstract
The management of a candy shop with database in SQL and JAVA interface
By Albus Raluca Georgiana
Submitted to the Department of Mathematics & Computer Science, “Babes Bolyai” [anonimizat].
July 2018.
In Partid Fulfilment of the Requirements for the Degree of Bachelor in Computer Science.
The inspiration for choosing the theme „The management of a candy shop with database in SQL and JAVA interface” [anonimizat].
In the first part of the paper I [anonimizat] I have used. For a clearer understanding of these, I gave examples of the application code or examples I created specifically for it.
The "SQL databases" [anonimizat] “Graphical user interface (GUI)” chapter are presented the two packages(AWT and SWING) provided by Java for the graphical interfaces.
The second part of the paper is dedicated to explaining all the application's functionalities and how it should be used by each actor. The functionalities are different for each type of login([anonimizat]).
This work is the result of my own activity.I have neither given nor received unauthorized assistance on this work.
Cuprins
Capitolul I. Introducere 5
Capitolul II. Bază de date în SQL 6
II.1. Bază de date și SGBD 6
II.2. Limbajul SQL 7
II.3. Tipuri de date SQL 7
II.4. Instrucțiuni SQL de definire a datelor 8
II.5. Instrucțiuni SQL de manipulare a datelor 10
II.6. Proceduri stocate și funcții 12
II.7. Structură bazei de date relaționale 14
Capitolul III. Interfată grafică cu utilizatorul(GUI) 17
III.1. Pachetul AWT 18
III.2. Pachetul Swing 20
III.2.1. Clase corespondente cu cele din AWT 22
III.2.2. Clasele introduse de pachetul Swing 27
Capitolul IV. Prezentarea aplicației 31
IV.1. Baza de date a aplicației 31
IV.2. Interfața aplicației 33
IV.2.1. Administrator 34
IV.2.1.1. Gestionarea angajaților 37
IV.2.1.2. Gestionarea produselor 45
IV.2.2. Angajat 47
IV.2.2.1. Gestionarea comenzilor 51
IV.2.2.2. Gestionarea clienților 58
IV.2.3. Client 60
Capitolul V. Concluzii 64
Capitolul I. [anonimizat] „Managementul unui magazin de dulciuri cu baza de date în SQL și interfața în Java”, am dorit facilitarea gestionării comenzilor și a stocului produselor unui magazin de dulciuri.
[anonimizat], deoarece îmi oferă oportunitatea de a [anonimizat]-[anonimizat], [anonimizat] l-am învățat de una singură cu ajutorul internetului și a cărților de specialitate.
[anonimizat]uit atât pe drumul spre magazin și înapoi, cât și cel petrecut în incinta acestuia, stând uneori la cozi interminabile, este drastic diminuat, în beneficiul ambelor părți.
Această aplicație servește atât angajaților magazinului, cât și clienților acestuia.
Capitolul II. BAZA DE DATE IN SQL
II.1. Baza de date și SGBD
O bază de date(BD), reprezintă o modalitate de stocare a unor informații și date pe un dispozitiv de stocare, cu posibilitatea extinderii ușoare și a regăsirii rapide a acestora(a se vedea, spre exemplu [9]).
O bază de date conține:
Schema bazei de date;
Colecția de date;
Componente diverse(proceduri, funcții, utilizatori, roluri,etc).
Un sistem de gestiune a bazei de date(SGBD) este o colecție de programe necesare pentru gestiunea bazei de date.
La finalul secolului al XX-lea, în special odată cu pătrunderea în masă a microcalculatoarelor, au apărut numeroase SGBDR-uri.
Aceasta a însemnat o evoluție de la SGBD-urile de generația întâi (arborescente și rețea) spre cele de generația a două (relaționale).
Această evoluție a constat în:
oferirea de limbaje de interogare neprocedurale;
îmbunătățirea integrității și securității datelor;
optimizarea și simplificarea acceselor. [14]
Microsoft SQL Server este un sistem de gestionare de baze de date relaționale de orice dimensiune.
Limbajul de interogare folosit de SQL Server este SQL iar extensia procedurală este T-SQL. [11]
Avantajele utilizării unui sistem de baze de date:
permite gestiunea unor colecții mari de date cu diverse legături între date;
independența datelor;
aplicațiile nu gestionează detalii de implementare a bazei de date.
optimizarea accesului la date;
permite accesul la date din aplicații dezvoltate în diverse limbaje sau medii de programare;
dacă datele sunt accesate întotdeauna prin sistem, acestea sunt actuale și corecte;
face posibilă recuperarea în cazul erorilor;
reduce timpul de dezvoltare al aplicațiilor.
Alte exemple de SGBD sunt:
Oracle;
MySql;
Acces.
II.2.Limbajul SQL
Fiind cel mai popular limbaj pentru gestionare a bazelor de date, SQL a devenit un standard și are o mulțime de dialecte și variante.
SQL poate :
executa interogări împotrivă unei baze de date;
prelua date dintr-o bază de date;
introduce înregistrări într-o bază de date;
actualiza înregistrările într-o bază de date;
șterge înregistrări dintr-o bază de date;
crea noi baze de date;
crea noi tabele într-o bază de date;
crea proceduri stocate într-o bază de date;
crea vizualizări într-o bază de date;
seta permisiuni pe tabele, proceduri și vizualizări. [12]
Comenzile SQL pot proveni de la o multitudine de interfețe utilizator și pot fi
incluse în aplicații scrise în diferite limbaje de programare.
II.3.Tipuri de date SQL
La fel ca la celelalte limbaje de programare , în SQL, fiecărei coloane dintr-un tabel îi este repartizat un tip de dată.
Principalele tipuri de date în SQL sunt:
VarChar
String de lungime variabilă.
Conține maxim 255 de caractere .
NVarChar
String de lungime variabilă.
Poate atinge până la 64 KB caractere lungime.
Ambele tipuri (VarChar, NvarChar) au ca avantaj faptul că utilizează doar spațiul necesar, un câmp null neocupand spațiu deloc.
Char / NChar
Câmpuri text cu lungime fixă.
Spațiul rămas neocupat este completat automat cu spații goale.
Int
Tip de date întregi.
Este stocat pe 4 octeți.
Float/Real
Fracții pozitive sau numere reale.
DateTime / SmallDateTime
Stochează valori de tip dată/oră. [8]
Denumirile tipurilor de date și limitele acestora (valoare minimă, valoare maximă), diferă în funcție de versiunea sistemului SGBD, dar sunt asemănătoare.
II.4. Instrucțiuni SQL de definire a datelor
CREATE TABLE
Instrucțiunea de creare a unui tabel definește:
atributele tabelului(coloanele);
domeniile atributelor;
constrângeri pe care înregistrările trebuie să le respecte.
Sintaxă:
CREATE TABLE nume_tabel
(
coloană1 domeniu1 [constrângeri_coloană],
coloană2 domeniu2 [constrângeri_coloană],
…
coloanăn domeniun [constrângeri_coloană]
[constrângeri tabel]
);
Exemplu:
Atât constrângerile pentru coloane cât și cele pentru tabel sunt opționale.
Constrângeri de atribut:
NOT NULL – atributul nu poate avea valori nedefinite(NULL)
PRIMARY KEY – nu permite valori duplicate sau NULL în coloana sau coloanele
definite astfel . O tabelă poate avea o singură cheie primară, care poate fi alcătuită din câmpuri unice sau multiple.
Sintaxă: PRIMARY KEY(listă_atribute)
UNIQUE – valorile coloanei sunt unice
CHECK(CONDIȚIE) – valorile coloanei trebuie să îndeplinească o condiție
simplă cu valoare TRUE sau FALSE.
FOREIGN KEY – este un câmp (sau o colecție de câmpuri) dintr-un tabel
care identifică în mod unic un rând dintr-un alt tabel sau același tabel. Tabelul care conține cheia externă se numește tabel copil, iar tabelul care conține cheia candidat este numit tabel părinte.
Sintaxă: FOREIGN KEY (cheie_straină)
REFERENCES tabel_părinte (cheie_candidat)
Exemplu:
DEFAULT – la adăugarea unei inregistrări, atributul care are constrângerea
DEFAULT și căruia nu i se atribuie o valoare, primește o valoare implicită. Atributele care nu au această constrângere și sunt numere reale, primesc valoarea 0, iar cele de tip șir de caractere sunt șiruri vide. [10]
ALTER TABLE
Permite:
adăugarea sau ștergerea unor atribute;
modificarea domeniilor unor atribute;
adăugarea, ștergerea sau modificarea constrângerilor.
Sintaxă: ALTER TABLE nume_tabel predicate
Predicate pot fi următoarele:
ADD COLUMN domeniu [NOT NULL] [CONSTRAINT constraint]
Exemplu: ALTER TABLE Adresă_A
ADD COLUMN observații varchar(100)
DROP COLUMN coloană
Exemplu: ALTER TABLE Adresă_A
DROP COLUMN observații
ALTER COLUMN coloană domeniu
Exemplu: ALTER TABLE Adresă_A
ALTER COLUMN nr_A int
ADD CONSTRAINT constraint
Exemplu: ALTER TABLE Adresă_A
ADD CONSTRAINT UQ_nr UNIQUE (nr_A)
DROP CONSTRAINT constraint
Exemplu: ALTER TABLE Adresă_A DROP CONSTRAINT UQ_nr
II.5. Instrucțiuni SQL de manipulare a datelor
SELECT
Selectează informațiile dorite din tabelele bazei de date.
Sintaxă: SELECT [DISTINCT] listă_select FROM listă_from WHERE calificare
Clauze:
Obligatorii:
SELECT – menționează coloanele care vor fi reținute în rezultat.
FROM – specifică un produs cartezian între tabele.
Opționale:
WHERE – descrie condiții de selecție pentru tuplurile din produsul
cartezian.
Strategia de evaluare conceptuala:
Calculeaza produsul cartezian al tabelelor din lista_from.
Sterge din produsul cartezian randurile care nu indeplinesc conditiile din calificare.
Sterge coloanele care nu apar in lista_select.
Daca DISTINCT este specificat, elimina randurile duplicate.
Dacă listă_select este un asterisc (*), atunci se selectează toate atributele produsului cartezian al tabelelor relaționale indicate prin clauza FROM, care îndeplinesc condiția din clauza WHERE. [10]
Exemple:
SELECT * FROM Angajat
SELECT nume_a, prenume_a FROM Angajat WHERE gen='feminin'
În clauza SELECT se pot redenumi atributele sau se pot specifica nume pentru expresii, folosind următoarea sintaxă:
SELECT nume1 [AS] noul_nume1,…, expresie [AS] nume_expresie
FROM listă _tabele [alte_clauze];
Exemplu:SELECT nume_a AS Nume, prenume_a AS Prenume
FROM Angajat WHERE gen='feminin'
Alte clauze opțiionale:
HAVING;
ORDER BY;
GROUP BY;
INSERT
Se folosește pentru adăugarea liniilor(înregistrărilor).
Sintaxa: INSERT INTO nume_tabel (col1,…,coln) VALUES (val1,…,valn)
Numărul de valori trebuie să coincidă cu cel al coloanelor, la fel și tipul acestora.
Exemplu: INSERT INTO Adresa_A(jud,loc,str,nr_A,cod_p)
VALUES('Cluj','Cluj-Napoca','Traian Vuia','102','400387')
UPDATE
Permite actualizarea valorilor coloanelor din una sau mai multe linii ale unui tabel.
Sintaxa: UPDATE nume_tabel SET col1=val1,…coln=valn [WHERE conditie]
Dacă este omisă clauza WHERE, atunci vor fi modificate valorile coloanelor din
toate liniile tabelului.
DELETE
Permite ștergerea uneia sau mai multor linii dintr-un tabel.
Sintaxa: DELETE FROM nume_tabel [WHERE conditie]
Dacă este omisă clauza WHERE, atunci vor fi șterse toate liniile din tabel.
II.6. Proceduri stocate și funcții
O procedură stocată este o mulțime ordonată de instrucțiuni SQL, stocată permanent pe server și compilată la utilizare. [16]
Procedurile stocate pot:
să returneze valori și să modifice;
să execute operații de comparare cu valorile precomparate folosite de sistem;
să primească și să returneze valori care nu provin neapărat dintr-o tabelă
ci sunt calculate prin execuția procedurii.
Etapele utilizării unei proceduri stocate:
1. Crearea procedurii cu ajutorul comenzii CREATE PROCEDURE.
2. Execuția realizată de către utilizator cu comandă EXECUTE.
3. Etapa de COMPILARE în care serverul compilează și optimizează procedura.
4. Etapa de executare de către server în care serverul rulează planul de execuție compilat al procedurii în timpul unei comenzi EXEC.
Exemplu:
Această procedură modifică date din tabelul Angajat.
Important este faptul că modificările au loc doar asupra datele transmise prin parametru care nu sunt nule.
EXEC usp_UpdateAngajat 1,'Popescu','','' – numele angajatului cu id_angajat=1
va fi modificat în „Popescu”.
EXEC usp_UpdateAngajat 1,'','2000','' – salariul angajatului cu id_angajat=1 va fi
modificat.
EXEC usp_UpdateAngajat 1,'','','0745921112' – numarul de telefon al angajatului cu
id_angajat=1 va fi modificat.
EXEC usp_UpdateAngajat 1,'','','' – datele rămân neschimbate.
O funcție este foarte asemănătoare unei proceduri. Ambele pot fi stocate în baza de date sau declarate în interiorul unui bloc (o funcție locală), însă ideal ar fi ca funcția să întoarcă o singură valoare, iar pentru celelalte situații să se folosească procedurile. [17]
Exemplu:
Această funcție verifică existența în tabelul LoginAngajat a unui username transmis prin parametru și returnează 0 în cazul în care nu găsește și un număr diferit de 0 dacă găsește.
II.7. Structura unei baze de date relaționale
Conceptele utilizate pentru definirea structurii de date sunt:
domeniul;
relația (tabela);
atributul;
tuplul;
cheia;
schema tabelei.
Domeniul
Este un ansamblu de valori caracterizat printr-un nume.
Acesta poate fi precizat explicit, prin enumerarea tuturor valorilor care aparțin domeniului, sau implicit, prin precizarea proprietaților valorilor din domeniu. [13]
Atributul
Este coloana unei tabele, caracterizata printr-un nume.
Tuplul
Este linia dintr-o tabelă și nu are nume.
Cheia
Este un atribut sau un ansamblu de atribute care au rolul de a identifica un tuplu dintr-o tabelă.
Relatia
Este un subansamblu al produsului cartezian al mai multor domenii, caracterizat
printr-un nume, prin care se definesc atributele ce aparțin aceleași clase de entități, și care conține tupluri cu semnificație(tabelă).
O reprezentare a relației este tabelul bidimensional în care liniile reprezintă
tuplurile, iar coloanele corespund domeniilor.
Liniile sunt obligatoriu distincte.
Fiecare coloană are un nume distinct(atribut).
Ordinea liniilor și coloanelor dintr-o tabelă este importantă.
Un domeniu poate apărea de mai multe ori în produsul cartezian pe baza căruia este definită tabela(a se vedea, spre exemplu [14]).
Schema tabelei
Este formată din numele tabelei, urmat între paranteze rotunde de lista
atributelor și domeniul acestora.
Exemplu:
Schema bazei de date
Poate fi reprezentată printr-o diagramă de structură în care sunt puse în evidența și legăturile dintre tabele.
Definirea legăturilor dintre tabele se face logic construind asocieri între tabele cu ajutorul unor atribute de legătură.
Atributele implicate în realizarea legăturilor se găsesc fie în tabelele asociate, fie în tabele distincte construite special pentru legături. Atributul din tabelă inițială se numește cheie externă iar cel din tabela finală este cheie primară.
Relațiile posibile sunt one-to-one, one-to-many, many-to-many. [14]
Relația one-to-one este destul de rar întâlnită. Uneori astfel de relații pot fi modelate transformând una dintre entități în atribut al celeilalte entități. [15]
Exemplu:
Atributele tabelului LoginAngajat ar putea fi trecute că atribute în tabelul Angajat și astfel nu ar mai fi necesară existența a două tabele, deci nici a legăturii one-to-one.
Relația one-to-many reprezintă cel mai întâlnit tip de relație între tabele.
Exemplu:
Un angajat are o singură adresă. La o adresă pot locui mai mulți angajați.
Relația many-to-many apare în prima fază a proiectării bazei de date, insă ulterior trebuie să fie eliminată, prin crearea unui tabel de legătură care va fi în relație one-to-many cu cele două tabele care se aflau în relație many-to-many.
Exemplu:
Capitolul III. INTERFAȚĂ GRAFICĂ CU UTILIZATORUL (GUI)
De la apariția limbajului Java și până în prezent, bibliotecile de clase care oferă servicii grafice au suferit mari schimbări odată cu trecerea de la o versiune la alta, în primul rând datorită necesității de a integra mecanismele GUI cu tehnologii apărute ulterior(a se vedea, spre exemplu [5]).
Pentru realizarea unei interfețe grafice, în momentul actual, limbajul de programare Java ne pune la dispoziție două biblioteci:
java.awt
java.swing
Atât pachetul AWT, cât și pachetul Swing, se bazează pe conceptul de componentă grafică. O componentă grafică este un obiect care are o reprezentare pe ecran și care poate interacționa cu utilizatorul. [1]
Crearea unei interfețe grafice presupune:
Crearea unei suprafețe de afișare.
Crearea și așezarea obiectelor grafice pe suprafața de afișare în pozițiile corespunzătoare.
Definirea acțiunilor care trebuie să se execute în momentul în care utilizatorul interacționează cu obiectele grafice.
Executarea acțiunilor corespunzătoare. [5]
III.1.Pachetul AWT
Conține toate clasele necesare pentru crearea unei interfețe cu utilizator și pentru a picta grafice și imagini.
Un obiect al interfeței utilizator, cum ar fi un buton , este numit în terminologia AWT, componentă. Toate componentele AWT, cu excepția meniurilor, au ca rădăcină clasa abstractă Component, din pachetul java.awt, care oferă peste 120 de metode prezente în toate subclasele ei. [2]
Cele mai folosite metode sunt:
setSize, setHeight, setWidth;
setBounds;
setForeground, setBackground;
setFont;
setVisible;
setEnabled;
Clase componente ale pachetului AWT:
Din cauza unor diferențe esențiale în implementarea meniurilor pe diferite platforme de operare, acestea nu au putut fi integrate ca obiecte de tip Component, așadar a fost introdusă clasa MenuComponent.
Clasa Container
Este o subclasă aparte a lui Component, și este la rândul ei superclasa tuturor
suprafețelor de afișare Java. [5]
Un container este o componentă în AWT care poate conține alte componente precum: butoane, câmpuri de text, etichete, și chiar și alte containere.
Clasele care extinde clasa Container, cum ar fi Frame, Dialog, Panel, sunt cunoscute sub numele de Containter. [4]
Clasa Panel
Este o suprafață fără reprezentare grafică și este folosită pentru gruparea altor
componente.
Clasa ScrollPane
Este un container folosit pentru implementarea automată a derulări pe verticală
sau pe orizontală a unei componente.
Clasa Frame
Este derivată a clasei Window.
Conține bara de titlu și poate avea bare de meniuri.
În AWT există două moduri de a crea un frame:
Prin moștenire – extinderea clasei Frame.
Prin asociere – crearea obiectului de clasă Frame. [4]
În momentul în care utilizatorul acționează asupra unei componente, aceasta trebuie să genereze un eveniment. Începând cu versiune Java 1.1, evenimentele sunt instanțe ale claselor derivate din AWTEvent. Într-un program trebuie specificat codul care se execută la apariția unui eveniment.
Tratarea evenimentelor se realizează prin intermediul unor clase de tip listener (ascultător de evenimente), clase care sunt definite în pachetul java.awt.event. [5]
Tipuri de evenimente:
De nivel jos:
ComponentEvent
ContainerEvent
FocusEvent
KeyEvent
MouseEvent
WindowEvent
– reprezintă o interacțiune de nivel jos: apăsarea unei taste, mișcarea mouse-ului sau o operație asupra unei ferestre.
Semantice:
ActionEvent
AdjustmentEvent
ItemEvent
TextEvent
– reprezintă interacțiunea cu o componentă GUI.
Interfețe de tip „listener”:
ActionListener
AdjustmentListener
ComponentListenet
ContainerListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
TextListener
WindowListener [5]
III.2.Pachetul Swing
Conține clase care permit gestionarea completă a unei interfețe grafice și a fost inclus în Java 2-JDK 1.3.1.
Swing se bazează pe modelul AWT, extinzând funcționalitatea acestuia și adăugând sau înlocuind componente pentru dezvoltarea aplicațiilor GUI.
În Swing există trei clase pentru gestionarea ferestrelor: JFrame, JWindow și JDialog.
Clasa JFrame
Clasa JFrame este un tip de container care moștenește clasa Frame a pachetului AWT.
JFrame are rolul unei ferestre principale în care, pentru a crea o interfață grafică, sunt adăugate componente precum butoane, câmpuri de text, etichete. Constructori:
JFrame() – construiește un frame care inițial este invizibil.
JFrame(String title) – construiește un frame care inițial este invizibil și care are titlul
specificat.
JFrame(GraphicsConfiguration gc)– creează un frame fără titlu, în configurația
grafică specificată a ecranului unui dispozitiv.
JFrame(String title, GraphicsConfiguration gc)) – creează un frame cu titlu, în
configurația grafică specificată a ecranului unui dispozitiv.
Exemplu:
Metode folosite:
setBounds(x,y,latime,inaltime) – utilizată pentru a specifica poziția și dimensiunea
componentei GUI, în acest caz JFrame.
Cu ajutorul primilor doi parametrii, setăm pozitia, iar cu ajutorul ultimilor doi dimensiunea.
setResizable(boolean b) -dacă b este „false”, atunci frame-ul este setat să nu poată
fi redimensionat.
-dacă b este „true”, atunci frame-ul este setat să poată
fi redimensionat.
setDefaultCloseOperation() – este folosită pentru a specifica pentru butonul de
închidere una din opțiunile:
JFrame.EXIT_ON_CLOSE – închide aplicația.
JFrame.HIDE_ON_CLOSE – ascunde frame-ul, dar menține aplicația pornită.
JFrame.DISPOSE_ON_CLOSE – închide doar frame-ul curent, menținând
aplicația pornită.
JFrame.DO_NOTHING_ON_CLOSE – ignoră click-ul.
Opțiunea implicită este JFrame.HIDE_ON_CLOSE.
setTitle(String t) – setează titlul unui frame.
III.2.1.Clase corespondente cu cele din AWT
Clasa JButton
Constructori:
JButton() – creează un buton simplu, fara text(denumire) sau icon.
JButton(String text) – creează un buton cu textul text.
JButton(Icon i) – creează un buton cu icon-ul i.
JButton(Strin text, Icon i) – creează un buton cu textul text si icon-ul i
Metode: [3]
void setText(String s) – este folosită pentru a seta textul butonului, care a fost creat
cu un constructor care nu are ca și parametru textul.
String getText() – returnează textul butonului.
void setEnabled(boolean b) – se utilizează pentru activarea sau dezactivarea
butonului.
void setIcon(Icon b) – este folosită pentru a seta icon-ul butonului, care a fost creat
cu un constructor care nu are ca parametru icon-ul.
Icon getIcon() – returnează icon-ul butonului.
void addActionListener(ActionListener a) – este folosită pentru ai adauga
butonului un set de acțiuni.
Exemplu:
Clasa JTextField
Moștenește clasa JTextComponent
Obiectul clasei JTextField este o componentă de text care permite editarea unei singure linii de text.
Clasa JPasswordField
Moștenește clasa JTextField, iar la fel ca aceasta, permite editarea unei singure linii de text.
Înlocuiește (doar vizual) caracterele introduse, cu buline.
Clasa JcomboBox [6]
Moștenește clasa JComponent.
Obiectul clasei este folosit pentru a afișa un meniu pop-up al opțiunilor.
Permite doar selectarea unui singur articol, acesta fiind și singurul care este vizibil în permanență.
JComboBox permite și editarea explicită a valorii elementului, acest lucru fiind controlat de metodă setEditable(boolean b).
Alte metode frecvent folosite sunt:
void addItem(Object obj) – este folosită pentru a adăuga un item la lista de
itemuri.
Exemplu:
void removeItem(Object obj) – este folosită pentru a șterge un item din listă.
void removeAllItems() – șterge toate itemurile din listă.
void setEditable(boolean b) – determină daca ComboBoxul este editabil sau nu.
Evenimentele generate de obiectele JComboBox sunt de tip:
ItemEvent – generate la navigarea prin listă;
ActionEvent – generate la selectarea efectivă a unui articol.
Clasa JLabel (5)
Moștenește clasa JComponent.
Este o componentă simplă pentru afișare, poate conține text și/sau o imagine.
Obiectul clasei JLabel este folosit pentru:
plasarea textului într-un container;
afișarea unei singure linii de text;
afișarea unei imagini;
afișarea unui text împreună cu o imagine.
Textul poate fi modificat de o aplicație, dar un utilizator nu poate să o editeze direct, pentru el fiind disponibilă doar pentru citire/vizualizare.
Constructori:
JLabel() – creează o instanță simplă a clasei JLabel.
JLabel(String text) – creează o instanță a clasei JLabel, cu textul specificat.
JLabel(Icon i) – creează o instanță a clasei JLabel, cu icon-ul specificat.
JLabel(String text, Icon i, int aliniament) – creează o instanță a clasei JLabel
cu textul, imaginea și alinierea orizontală specificate.
Clasa JScrollPane
JScrollPane este un container intermediar, la fel ca JPanel.
Ne ajută sa derulam, pentru a putea vizualiza de exemplu toate randurile unui
JTable.
In loc sa adaugam tabelul direct pe fereastra l-am incapsulat intr-un ScrollPane.
Pentru a avea atât un ScrollPane vertical cât și unul orizontal se folosește
următoarea comandă:
III.2.2.Clasele introduse de pachetul Swing
Diferența majoră dintre Swing și AWT este faptul că clasele Swing nu au implementat deloc cod nativ dependent de mașina pe care sunt instalate, iar clasele AWT au. [7]
Componentele Swing se indentifică prin prefixul J la numele lor.
Exemplu: clasa Button din AWT are corespondent în Swing clasa JButton.
Oricărei aplicații grafice îi corespunde o fereastră principală (de tip Frame) și una sau mai multe ferestre adiționale.
Clasa JOptionPane
Clasa JOptionPane are doua metode:
showMessageDialog – afișează o fereastră cu informații și cu un
buton „OK” pentru închiderea ei.
static void showMessageDialog
(Component parentComponent, Object message);
Parametrii:
parentComponent – determină cadrul în care este afișat dialogul;
dacă este null sau dacă parinteleComponent nu are Frame, este folosit un cadru prestabilit.
message – mesajul pe care dorim sa-l afisam.
static void showMessageDialog
(Component parentComponent, Object message, String title, int messageType);
Parametrii:
parentComponent – determină cadrul în care este afișat dialogul;
dacă este null sau dacă parinteleComponent nu are Frame, este folosit un cadru prestabilit. message – mesajul pe care dorim sa-l afisam.
title – titlul ferestrei.
messageType – tipul mesajului, determinând icon-ul afișat în
fereastră.
JOptionPane.ERROR_MESSAGE
JOptionPane.INFORMATION_MESSAGE
JOptionPane.WARNING_MESSAGE
JOptionPane.QUESTION_MESSAGE
JOptionPane.PLAIN_MESSAGE
static void showMessageDialog
(Component parentComponent, Object message, String title, int messageType, Icon icon);
Parametrii:
parentComponent – determină cadrul în care este afișat dialogul; dacă este
null sau dacă parinteleComponent nu are Frame, este folosit un cadru prestabilit. message – mesajul pe care dorim sa-l afisam.
title – titlul ferestrei.
messageType – tipul mesajului, determinând icon-ul afișat în fereastră.
icon – icon preferențial.
showInputDialog – afișează o fereastră de dialog, care afișează un mesaj primit ca
parametru și returnează șirul citit.
Clasa JTable [18]
Este una din cele mai folosite modalități de vizualizare a datelor.
Prin folosirea unui tabel înregistrările dintr-o bază de date sunt ușor de sortat și selectat.
Clasa JTable are un constructor care primește ca argument o matrice de obiecte (Object [][]) și afișează conținutul acestora în liniile și coloanele unui tabel.
Exemplu:
După cum se vede în imaginea ce urmează, tabelul a fost generat printr-un cod simplu și scurt, iar în loc să adăugăm tabelul direct pe frame, l-am încapsulat într-un ScrollPane.
Capitolul IV. PREZENTAREA APLICAȚIEI
Aplicația are scopul de a ajuta la gestionarea unui magazin de dulciuri și poate fi utilizată de :
administratorul aplicației;
angajații magazinului;
clienți.
IV.1. Baza de date a aplicației
Baza de date a fost gândită în funcție de necesitățile creării funcționalităților. Astfel a rezultat o bază de date cu 3 grupuri de tabele independente unele față de celelalte, accesibile prin intermediul aplicației.
IV.2. Interfata aplicatiei
La pornirea aplicației, utilizatorul este îndemnat să aleagă statutul personal,
pentru a putea continua cu logarea în aplicație.
IV.2.1. Administrator
În imaginea de mai sus este prezentată porțiunea din diagramă de actori, aferentă administratorului.
Se pot observa toate metodele care îi sunt accesibile acestuia.
Logare cont administrator
În baza de date există un singur administrator care are cont de acces la aplicație și nu este disponibilă funcționalitatea de creare a altui cont pentru un alt utilizator.
În cazul în care utilizatorul introduce greșit contul sau apăsa butonul de „Login” fără a scrie nimic, va fi înștiințat printr-un mesaj cu ajutorul unui JOptionPane.
Pentru a ascunde parola am folosit JPasswordField.
Pe aproape toate frame-urile există, în colțul din stânga sus, un buton de „Back”, care are icon-ul, și care oferă posibilitatea de a reveni la frame-ul anterior.
Dacă logarea a avut loc cu succes, următorul frame îi oferă administratorului posibilitatea să aleagă dacă îl interesează să facă modificări în ceea ce-i privește pe angajați sau dacă îl interesează să se ocupe de date care au legătură cu produsele.
Cele două imagini, cea cu „ANGAJATI” și cea cu „PRODUSE”, sunt de fapt două butoane, ambele având rolul de a accesa un frame.
IV.2.1.1. Gestionarea angajaților
Dacă administratorul apăsa pe butonul „ANGAJATI”, se va deschide un frame pe care îi sunt puse la dispoziție toate metodele care îi sunt accesibile în legătură cu angajații, adică:
Adăugarea;
Ștergerea;
Modificarea;
Vizualizarea.
Adaugă angajat
În prima etapă, administratorul va trebui să-i creeze noului angajat un cont cu care se va putea loga pe aplicație.
Validările sunt făcute în așa fel încât dacă nu sunt completate toate câmpurile marcate cu „ * ”, iar administratorul apăsa butonul „Creare”, pe ecran va apărea un mesaj prin care acesta este înștiințat de acest lucru. Totodată, dacă administratorul încearcă să creeze un cont cu un nume de utilizator deja folosit, va fi înștiințat din nou printr-un mesaj.
După crearea cu succes a contului, pe frame vor deveni vizibile și câmpurile care trebuie completate pentru adăugarea în bază de date a datelor personale ale angajatului.
Pentru a nu introduce date incomplete în baza de date, în momentul în care contul a fost creat cu succes, butonul de „Back” v-a deveni invizibil, astfel administratorului îi este impus să termine toate etapele de adăugare, deoarece toate frame-urile aferente acestor etape au butonul de ieșire setat DO_NOTHING_ON_CLOSE, deci nu poate închide aplicația fără a termina de completat.
Pe toate frame-urile unde apare de completat o dată, va apărea în dreptul ei un buton cu icon-ul , iar dacă este apăsat va apărea mesajul:
Dacă pe un frame trebuie completate mai multe date, butonul va apărea doar în dreptul primei date.
Tot pentru asigurarea corectitudinii datelor, pentru alegerea genului am utilizat un ComboBox, care are doar elementele „feminin” și „masculin”.
Datele personale nu vor fi adăugate în baza de date până nu este completată și adresa. Aceasta se va completă pe un alt frame care apare la apăsarea butonului „Adauga adresa”.
După ce adresa a fost adăugată cu succes, se va reîntoarce la frame-ul unde s-au completat datele personale, iar acum este vizibil și butonul „Confirm”, care dacă este apăsat, datele personale sunt adăugate în baza de date și se deschide automat un frame unde trebuie completate datele contractuale.
Postul pe care îl va avea noul angajat este ales cu ajutorul unui ComboBox care conține posturile existente în baza de date.
La apăsarea butonului Confirm, dacă datele sunt adăugate cu succes, se va reveni la frame-ul unde sunt disponibile toate metodele pentru angajați.
Sterge angajat
Pentru a șterge un angajat, mai întâi trebuie ales și confirmat numele de familie, după care va deveni vizibil un ComboBox care conține prenumele aferente numelui de familie ales.
Am ales să impun această confirmare a numelui pentru a fi mai ușor de găsit prenumele în lista, aceasta devenind automat mai scurtă. După confirmarea numelui, prenumele este ales tot dintr-un ComboBox și nu este completat automat într-un JTextField pentru a trata și cazul în care există mai mulți angajați cu același nume de familie.
Modifică angajat
Alegerea angajatului a cărui date se doresc a fi modificate, se face analog ca și în cazul ștergerii.
Pentru ca utilizatorul să nu fie obligat să modifice tot ce este posibil, sau pentru a nu se modifica în baza de date cu o valoare nulă în caz ca nu se completează toate câmpurile, am ales să folosesc următoarea procedură SQL.
Astfel, dacă administratorul dorește să modifice de exemplu doar numele, modificarea are loc doar asupra numelui. Sau dacă dorește să modifice 2 informații, cea de-a treia rămâne neschimbată.
La fel ca și în cazul adăugării, dacă se dorește modificarea adresei, se apasă pe butonul „Modifica adresa” și se deschide un nou frame.
Modificarea adresei este realizată tot prin intermediul unei proceduri, din aceleași motive că și în cazul datelor personale și contractuale.
Vizualizeaza lista angajati
Lista angajaților este dată sub forma unui tabel (JTable) și cuprinde numele și prenumelor tuturor angajaților din baza de date.
IV.2.1.2.Gestionarea produselor
Dacă administratorul alege să între în secțiunea „Produse”, pe frame-ul aferent îi sunt dispuse toate metodele care îi sunt accesibile acestuia în legătură cu produsele și cu furnizorii acestora, adică:
Adăugarea;
Ștergerea;
Modificarea.
Modifică furnizor
Procedura folosită este urmatoarea:
Modifică produs
Procedura folosită este urmatoarea:
IV.2.2. Angajat
În imaginea de mai sus este prezentată porțiunea din diagrama de actori, aferentă angajatului, așadar putem observa metodele care îi sunt accesibile acestuia.
Logare cont angajat
Fiecare angajat primește în momentul angajării un cont cu care se poate loga pe aplicație.
Logarea se face analog ca și în cazul logării administratorului.
Primul frame accesibil după logare îi oferă posibilitatea angajatului să aleagă secțiunea pe care îl interesează în continuare: secțiunea „Comenzi” sau secțiunea „Clienti”.
Modificare parolă
Din motive de securitate și confidențialitate, după prima logare cu parola
primită de la administrator, angajatul își poate modifica parola.
Pentru a face acest lucru, trebuie să apese pe butonul ,din stânga sus.
După cum se vede în imagine, pentru a schimba parola, aceasta trebuie scrisă de două ori, iar apoi confirmată.
Pentru ca parola să nu fie vizibilă, câmpurile în care trebuie introdusă sunt de tip JPasswordField.
În cazul în care angajatul va apăsa butonul „Confirm” fără a completa cele două câmpuri, va fi afișat mesajul:
Dacă parola nouă nu a fost scrisă de două ori identic, va fi afișat următorul mesaj:
IV.2.2.1.Gestionarea comenzilor
Pentru gestionarea comenzilor angajații au la dispoziție următoarele funcționalități:
Adaugă comandă;
Șterge comandă;
Modifică comandă;
Vizualizează comenzi;
Vizualizează stoc.
Modifică stare comanda
Modificări posibile:
„in asteptare” –> „acceptata”
In acest caz se modifică și stocul.
„in asteptare” –> „refuzata”
„acceptata” –> „finalizata”
In orice alt caz se va afișa un mesaj de eroare.
Sterge comanda
Angajatul poate șterge orice comandă nefinalizată.
Dacă starea comenzii șterse era „acceptata”, se reface stocul.
Dacă angajatul încearcă să șteargă o comandă finalizată se va afișa următorul mesaj:
Vizualizează comenzi
Apăsând butonul „Vizualizeaza comenzi”, se deschide un frame cu un tabel (JTable) care cuprinde toate înregistrările din tabelul „Comanda” din baza de date.
Pentru o înțelegere mai bună, în tabel am înlocuit id_client cu numele clientului care are acest id, iar id_p cu denumirea produsului aferent, iar pentru o vizualizare mai ușoară, pe lângă ScroolPane-ul vertical am adăugat și unul orizontal, cu comanda:
Frame.add(new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, HORIONTL_SCROLLBAR_AS_NEEDED));
Vizualizează stoc
Adaugă comanda
Un angajat poate să adauge o comandă pentru un client care vine în magazin. Acesta, spre deosebire de client, setează el și starea comenzii.
În primul rând, angajatul trebuie să aleagă clientul pe numele căruia va fi comanda, după același principiu că și până acum.
Mai apoi, urmează alegerea produsului și cantității dorite și confirmarea acestora.
După confirmare, este posibilă vizualizarea valorii comenzii, și totodată plasarea acesteia.
Dacă după vizualizarea valorii totale, se dorește schimbarea produsului sau cantității, se modifică datele și se reconfirmă.
Angajatul trebuie să seteze și starea comenzii astefel:
Acceptată – în cazul în care comanda poate fi onorată
Un caz particular este atunci când angajatul setează starea „acceptata”, dar cantitatea dorită nu este pe stoc momentan. Atunci starea comenzii este trecută automat în așteptare, iar acesta o poate modifica ulterior.
Setând o comandă „acceptata”, se modifică automat stocul produsului(nu și în cazul particular).
Refuzată – când timpul, stocul sau alții factori împiedică onorarea comenzii.
Dacă toate datele necesare (marcate cu „ * ”) sunt completate, comanda poate fi plasată.
Modifică comanda
Un angajat poate modifica o comandă deja plasată doar dacă nu are una dintre stările „finalizata” sau „refuzata”.
Așadar la alegerea numărului comenzii în ComboBox am pus doar numerele comenzilor care se încadrează în această categorie.
Modificările posibile asupra unei comenzi sunt:
Modificarea datei ridicării;
Modificarea cantității;
Modificarea observațiilor;
La fel ca și în cazul celorlalte modificări, și de această dată am folosit o procedură stocată.
Dacă comanda pe care o modifică angajatul are statusul „acceptata”, se aplică aceleași reguli ca și în cazul adăugării.
Dacă comanda are statusul „in asteptare”, stocul nu suferă modificări.
Cazuri în care se modifică cantitatea când comandă are statusul „acceptata”:
Nouă cantitate este mai mare decât cea veche.
În acest caz se modifică cantitatea comezii și stocul produsului.
În cazul în care cantitatea dorită nu este pe stoc, comanda va fi pusă în așteptare, iar cantitatea veche(cea reținută de pe stoc) se adaugă înapoi la stocul produsului.
Noua cantitate este mai mică decât vechea cantitate.
Se modifică cantitatea comenzii și se adaugă la stocul produsului diferența dintre vechea cantitate și cea nouă.
IV.2.2. 2. Gestionarea clienților
Vizualizare clienți
Adaugă client
Adăugarea unui client în baza de date se face în două etape.
Prima etapă constă în crearea unui cont pentru logarea pe aplicație.
Validările sunt făcute astfel încât să nu se poată folosi un username deja folosit sau dacă este apăsat butonul „Creare” fără ca cele două câmpuri să fie completate, să se afișeze un mesaj de eroare.
După crearea cu succes a contului, secțiunea de completare a datele personale devine vizibilă.
IV.2.3.Client
În porțiunea din diagrama de actori, aferentă clientului, se pot observa toate metodele care îi sunt accesibile acestuia.
Logarea în aplicație se face la fel că și în cazul angajatului, existând și în cazul acestuia de schimbare a parolei.
În plus față de ceilalți actori, clientul are posibilitatea de a-și creă contul singur. Această funcționalitate este accesată prin intermediul butonului „Sign Up”.
Creare cont
Crearea se face din nou în două etape:
– Creare cont pentru logarea în aplicație.
– Creare profil (completare date personale).
Crearea contului necesită validarea parolei, la fel că și în cazul modificării acesteia.
După logare, clientul are la dispoziție următoarele funcționalități:
Vizualizare comenzi
Spre deosebire de angajat care poate să vizualizeze toate comenzile, clientul poate să le vadă doar pe cele personale, bineînțeles din motive de confidențialitate.
Pentru o vizualizare mai bună a datelor, pe lângă ScrollPane-ul vertical am adăugat și unul orizontal.
Adaugă comandă
Adăugarea unei comezi se face analog cu adăugarea din cadrul angajatului,
singura diferență fiind faptul că starea comenzii nu este completată de către client, aceasta se setează automat că fiind „in asteptare”.
Modifică comandă
Modificarea comenzii este posibilă doar pentru cele cu statusul „in asteptare”.
Capitolul V. CONCLUZII
În concluzie această aplicația a fost creață astfel încât să fie foarte eficientă pentru toți actorii. Totodată este și ușor de folosit, fiind destul de intuitivă, datorită textului sugestiv și a plasării funcționalităților în frame-uri în funcție de categoria asupra căruia acționează.
Din punct de vedere estetic, am ales o abordare în temă cu domeniul de activitate al magazinului. Am păstrat temă fundalurilor pe categorii, editând plasarea dulciurilor pe ecran, astfel încât să nu îngreuneze înțelegerea componentelor aplicate pe acestea.
Ca o eventuală îmbunătățire a aplicației eu aș alege adăugarea unui meniu cu poze ale produselor pentru a ademenii cumpărătorii să comande o diversitate mai mare de produse, mergând pe principiul că oamenii se decid mai ușor și mai rapid la cumpărarea unui produs dacă îl vede, mai ales în cazul dulciurilor care provoacă în mod involuntar poftă.
Bibliografie:
[1] http://www.preferatele.com/docs/informatica/noi/java-at852201518.php
[2] https://courses.cs.washington.edu/courses/cse341/98au/java/jdk1.2beta4/docs/api/java/awt/package-summary.html
[3] https://www.tutorialspoint.com/swing/swing_jbutton.htm
[4] https://www.javatpoint.com/java-awt
[5] http://web.info.uvt.ro/~cristiana.dragoescu/ANUl%20II/Java/Curs_10_IGr.pdf
[6] http://andrei.clubcisco.ro/cursuri/2poo/co/Curs10.PDF
[7] http://www.scritub.com/stiinta/informatica/java/Swing-Clasa-JOptionPane-Applet18224181421.php
[8] http://www.rasfoiesc.com/educatie/informatica/sql/Tipuri-de-date-in-SQL-Server49.php
[9] https://ro.wikipedia.org/wiki/Baz%C4%83_de_date
[10] http://webbut.unitbv.ro/carti%20on-line/Ratiu/BD_Lab/Cap.2/Cap.2%20Limbajul%20SQL%20-%20Proiectarea%20bazelor%20de%20date%20rela%C5%A3ionale.pdf
[11] https://ro.wikipedia.org/wiki/Microsoft_SQL_Server
[12] https://www.w3schools.com/sql/default.asp
[13] http://civile.utcb.ro/cmat/cursrt/bd2.pdf
[14] http://www.seap.usv.ro/~valeriul/lupu/cafec/capitolul1.pdf
[15] https://www.atestateinformatica.ro/tutoriale/relatii-intre-entitati
[16] http://id.inf.ucv.ro/~popirlan/bd/laborator8.pdf
[17] http://www.eed.usv.ro/~mdanub/cursuri/Sisteme/lab7/Funct_PL-SQL.html
[18] http://www.lec-academy.ro/utilizarea-jtable-in-swing-partea-i/
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: SPECIALIZAREA MATEMATICǍ-INFORMATICǍ LUCRARE DE LICENȚĂ MANAGEMENTUL UNUI MAGAZIN DE DULCIURI CU BAZA DE DATE ÎN SQL ȘI INTERFAȚĂ ÎN JAVA Conducător… [308784] (ID: 308784)
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.
