Академический Документы
Профессиональный Документы
Культура Документы
Proiect de diplom
Coordonator tiinific:
Olteanu A. Alexandru
Bucureti
2014
Olteanu Alexandru
Cuprins
Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1. Baze de date
11
12
13
13
14
14
14
21
Olteanu Alexandru
24
24
25
25
27
2.2.3 Vectori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
29
2.3.1 Obiecte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
2.3.2 Clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
31
2.3.3 Excepii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
33
34
2.3.5.1 JPanel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
2.3.5.2 JLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
2.3.5.2 JButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
2.3.5.3 JComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
2.3.5.4 JTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
37
38
38
38
39
Olteanu Alexandru
40
41
41
42
43
48
48
50
53
3.4 Anexe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
58
63
65
70
Bibliografie
76
Olteanu Alexandru
Introducere
Bazele de date au devenit n ultimii ani o parte indispensabil din viaa noastr
de zi cu zi i asta datorit dezvoltrii uriae a tehnologiei informaionale. n urma cu
civa ani datele de orice fel erau stocate fizic, n dosare i rafturi greu de gestionat. n
prezent tehnologia ieftin i cu o putere de calcul remarcabil, a condus la
implementarea bazelor de date pentru foarte multe activiti cotidiene i nu numai.
Sigurana datelor i uurina cu care sunt manipulate ntr-un sistem de gestiune sunt
principalele atuuri ale unei baze de date.
Olteanu Alexandru
Capitolul 1
Baze de date
1.1 Scurt istoric despre bazele de date
Conform unor afirmaii de la nceputul anilor 1960 prima oar un sistem de
baze de date a fost introdus n cadrul misiunilor de aselenizare Appolo gestionate de
Agenia Spaial American (N.A.S.A).
Nevoia de organizare a datelor, precum i de actualizare sau gsire a acestora
n timp real au condus ctre crearea unui sistem de gestiune. Aproximativ 20 de ani mai
trziu Edgar Frank Codd, un informatician de origine englez, a introdus noiunea de
model relaional al bazelor de date, fapt ce a stat la baza crerii bazelor de date
relaionale.
Baza de date reprezint o colecie de informaii partajate, aflate n dependen
reciproc logic, structurate ntr-un mod clar pentru a facilita operaiuni de manipulare,
cum ar fi tergerea, inserarea, actualizarea datelor sau generarea de rapoarte cu privire la
ntreaga baz de date. Sistemul de gestiune al bazelor de date (SGBD) este un sistem
software care permite utilizatorilor, pe de o parte crearea bazei de date i ntreinerea
acesteia, i pe de alt parte rspunde la cererile utilizatorilor legate de controlul i
monitorizarea bazei de date.
Olteanu Alexandru
Olteanu Alexandru
Exemplu:
Calificativ = {1,2,3,4,5,6,7,8,9,10}
Fie domeniile D1, D2, D3, ... ,Dn. Definim produsul cartezian ca fiind
Tabela 1.2.1
Olteanu Alexandru
Id_student: este codul cu care identificm un student. Acest cod este unic i nu
poate exista ntr-o tabel de dou ori;
Anul_absolvirii;
Funcia_ocupat;
d) Tuplul: Elementele unei relaii sunt numite tupluri i sunt caracterizate ca
fiind liniile dintr-o tabel, dar fr s fie caracterizate printr-un nume. Numrul
tuplurilor i al atributelor dintr-o tabel nu are importan.
n tabela 1.1 identificm 3 tupluri, adic 3 elemente ale produsului cartezian.
Studeni = { ( 1, Mocanu Daniel, 2008, IT, manager), ( 2, Cornea Geanina, 2007,
Economie, consultant),( 3, tefnescu Drago, 2013, Inginerie Electric,
asistent) }
e) Cheia unei relaii: este o mulime minimal de atribute care ndeplinesc
rolul de indentificare a unui tuplu n mod unic. Cheile unei relaii pot fi de mai multe
tipuri:
Olteanu Alexandru
10
Cheia candidat n acest caz este Id, deoarece determin n mod unic tuplu. De
acea poart numele i de cheie minimal.
Cheie primar: este o cheie candidat definit de cel care proiecteaz tabela, cu
scopul de a identifica i accesa cu uurin tuplurile. Domeniul cheii primare este
considerat i el ca fiind un domeniu primar.
Id
1.
2.
3.
Nume Profesor
Tudorache
Dumitru
Cazac
Prenume Profesor
Cristina
Ioana
Iulia
Departament
Matematic 1
Matematic 2
Fizic
Tabela 1.2.2
Id
1
Id_formaiune
2
Id_profesor
25
Tip_or
C
Disciplin
Analiz numeric
Tabela Defalcare_ore
n tabela Defalcare_ore o cheie candidat dar nu cheie primar este format din
Id_formaiune, Tip_or i Disciplin, deoarece de exemplu anul 1 are doar 1 curs de
analiz numeric sau doar un seminar de analiz numeric pe smestru. Rezult c
aceast combinaie de coloane determin n mod unic un tuplu.
Olteanu Alexandru
11
Tabela 1.2.3
De exemplu, n tabela 1.2.1 putem indentifica cinci atribute, dar doar id-ul
determin n mod unic un tuplu, fiind cheie, pentru c:
- NumeS: mulimea de atribute n care identificm numele studentului nu poate fi cheie
ntr-o tabel, deoarece este posibil ca n tabela 1.1 s regsim n tupluri diferite acelai
nume.
- Anul_absolvirii: acest atribut nu este unic pentru c, n mod evident, ntr-o tabel de
acest tip, anul absolvirii coincide pentru toi studenii care au terminat n aceeai
promoie.
Din acest motiv nici un alt atribut nu este cheie n tabela 1.1 fiindc nu
identific n mod unic tabela.
Olteanu Alexandru
12
Olteanu Alexandru
13
Tabela. 1.2.4
n tabela 1.2.4 exemplific anomaliile care ar trebui evitate pentru a putea
ajunge la NF1.
O reprezentare corect a acestei tabele, presupunnd ca fiecare student este
nscris la o singur facultate este:
Olteanu Alexandru
14
Olteanu Alexandru
15
procesul postgres, format din unul sau mai multe servere backend.
Sintax:
Olteanu Alexandru
16
Sintax:
Olteanu Alexandru
17
Olteanu Alexandru
18
Unde numele tabelei relaiei care va fi creat este scris n ghilimele i este
Programare_ore. Scriptul scris creaz i atributele relaiei, i stabilete totodat i tipul
datelor.
Tot n acest exemplu putem identifica i constrngeri ale sistemului de
gestiune. Atributul Id este declarat ca fiind primary key, adic nu permite nregistrri cu
valorea nula sau nregistrri duplicat i este declarat de ctre utilizator cu numele
pk_loc_timp. Atributele Id_loc_timp i Id_defalcare au constrngeri de tip foreign
key. Id_loc_timp este o referin la cheia primar din relaia Loc_timp, iar atributul
Id_defalcare este referin a cheii primare din relaia Defalcare_ore.
Duplicarea id-ului este asigurat de instruciunea SERIAL.
Atributele declarate ca integer sunt numere ntregi i nu admint valoarea nul.
Olteanu Alexandru
19
Olteanu Alexandru
20
Tabela Faculti este populat cu 16 tupluri, formate din 2 coloane. Id-ul este
primary key si este de tip integer, iar Denumirea facultai este de tip character.
Desigur se poate popula tabela i fara ca id sa fie preciat, acesta fiind setat sa se
autoincrementeze, dar utilizatorul a preferat sa il defineasca pentru a putea controla
valoarea fiecrui id n parte.
Olteanu Alexandru
21
Olteanu Alexandru
22
Olteanu Alexandru
23
Alte subinterogri:
EXISTS: aceasta este o instruciune binar, care ntoarce ca rezultat true dac
interogarea are cel puin o nregistrarea ca rezultat, altfel intoarce false.
ALL: verific daca interogarea expresia satisface condiiile pentru fiecare
nregistrare
Olteanu Alexandru
24
Capitolul 2
Programare orientat obiect. Java
2.1 Java noiuni introductive
n anul 1995 compania Sun Microsystems a lansat o tehnologie remarcabil i
inovatoare denumit iniial OAK, ulterior Java, care s-a impus pe piaa dezvoltatorilor
de software datorit calitilor sale ,printre care :
J2SE Standard Edition, aceasta este platforma standard Java dedicat creri de
aplicaii independente.
J2ME Micro Edition, este platforma folosit pentru programarea dispozitivelor
mobile.
J2EE Enterprise Edition, este platforma cea mai complex propus de cei de la
Java.
Aplicaile Java au un mediu de execuie numit maina Java virtual (JVM).
Olteanu Alexandru
25
abstract
boolean
break
byte
case
catch
char
class
do
default
continue
const
else
double
extends
final
goto
for
float
finally
if
implements
import
instanceof
int
interface
long
native
protected
private
package
new
public
return
short
static
synchronized
while
void
strictfp
this
throw
throws
try
Tabelul 2.1
Intregi(integer): literali ntregi se pot scrie n trei baze: baza 8, baza 10 i baza
16 i pot fi de doua tipuri.
- normali: se reprezint pe maxim 4 octei
- lungi: se reprezint pe maxim 8 octei.
Olteanu Alexandru
26
n exemplul de mai sus constanta logic este isInserted i are valoarea false la
nceputul proceduri iar daca instruciunea merge, valoarea devine true. Spre deosebire
de limbajul C++, literali 0 i 1 nu sunt logici n Java
Olteanu Alexandru
27
Operatorul if-else: este expresia logic dac condiia este ndeplinit returneaz
de exemplu true, altfel false.
La nivel de rnd comentariile ncep cu //. Cele dou caractere transform tot
ce se afl pe acelai rnd n secven de comentariu, asta nseamn c n momentul
compilri programul nu ine cont de aceste secvene.
Olteanu Alexandru
28
string numeProfesor ;
Declararea variabilelor se poate face n mai multe locuri din cod, astfel
variabilele sunt de mai multe tipuri:
variabile declarate la nivel de clas, sunt vizibile pentru toate metodele clasei.
se pot declara variabile i doar la nivelul unui bloc cod, iar acea variabil este
cunoscut de program doar la nivelul acelui bloc.
Olteanu Alexandru
29
2.2.3 Vectori
Vectorii ca i varibilele, pentru a putea opera cu ei trebuie declarai i
iniializai. Declararea vectorilor seamana cum cea a variabilelor, doar c dupa ce
alegem tipul vectorului trebuie adugat sintaxa [] i apoi numele vectorului.
Exemplu: String[ ] numeVector;
Iniializarea vectorului se realizeaz prin alocarea memoriei prin intermediul
sitaxei new.
Exemplu: numeStudenti = new String[numrul de elemente],
unde numrul de elemente reprezint maximul de elemente ce le poate avea vectorul.
Pentru a afla numrul de elemente se poate folosi sintaxa length
Exemplu: int[ ] c = new int[20];
a.length ntoarce valoarea 20;
2.3.1 Obiecte
Programarea orientat-obiect, nseamn lucrul cu obiecte create n limbajul de
programare. Crearea obiectelor realizeaz prin declararea, instanierea i iniializarea
obiectului.
a) Declararea obiectului: se realizeaz prin specificarea clasei acestuia.
b) Instanierea: presupune alocarea de memorie pentru crearea efectiv a
obiectului cu sintaxa new.
c) Iniializarea: se realizeaz cu ajutorul constructorilor din clas.
Odat creat obiectul se pot afla informai despre el, se pot schimba strile
obiectului sau se pot executa aciuni. Accesul la valorile variabilelor unui obiect depind
de drepturile oferite de clasa din care face parte obiectul. Apelarea metodelor unui
obiect se realizeaz prin aplicarea unui punct dupa numele obiectului.
Olteanu Alexandru
30
2.3.2 Clase
Modalitatea de a introduce tipuri noi de date ntr-o aplicaie Java este fie prin
intermediul claselor, fie prin intermediul interfeelor.
Pentru a declara o clas trebuie pentru nceput sa specificm modificatori clasei
i anume:
O clas declarat final nu va putea avea subclase, iar din acest punct de
vedere o astfel de clas este considerat perfect pentru programarea orientata-obiect
deoarece unele metode ateapt un obiect ca parametru aflat ntr-o anumit clas i nu
aflat n subclasa.
Clasele definite n Java pot avea, daca nu sunt declarate ca fiind clase final, o
mulime de sublcase dar numai o singur clas pe care o motenete, cu alte cuvinte o
clas nu poate avea mai mult de o clas parinte. Singura clas din java care nu are nici
un parinte este clasa Object.
Olteanu Alexandru
31
P1.
// Corpul clasei
Olteanu Alexandru
32
Subclasele lui Object pot folosi metodele acestuia, i le pot nbunti deoarece
nu sunt declarate ca finale. De exemplu metoda toString returneaz reprezentarea ca un
ir de caractere a obiectului. Metoda este necesar n cazul n care este nevoie s se
afieze un ir de obiecte.
2.3.3 Excepii
Excepiile sunt evenimente ce produc ntreruperea unui program n timpul
execuiei. Ele pot sa apar din varii motive, fie elementele unui ir declarat sunt mai
multe decat numrul cu care a fost iniiat, fie erori sql n cazul n care lucram cu o baza
de date, fie erori de cod.
Mesajul din parantez indic numele clasei din care a aparut eroarea i pe ce linie de
cod. n acest caz eroarea provine de la declararea incompleta a unei metode.
Tratarea erorilor n Java este obligatorie i de aceea exista pisibilitatea ca
programatorul s izoleze eroarea ntr-un bloc de cod cu sintaxele try i catch care au
urmatoarea forma:
Acest try ncearca sa pregteasc inserarea unor valori ntr-o relaie dintr-o baz de
date. Daca conexiunea e realizat atunci codul nu va ntoarce eroare, altfel va genera o
eroare SQL.
Olteanu Alexandru
33
Olteanu Alexandru
34
text:
JTextPane,
JTextField,
JPasswordField,
2.3.5.1 JPanel
JPanel reprezint containerul intermediar pentru interfaa grafic. n el se pot
organiza i grupa componentele ale unui alt container.
Olteanu Alexandru
35
Constructorul unui panou are forma JPanel (). Un panou care sa aib i
gestionarul de poziionare lm se declar JPanel(LayoutManager lm).
2.3.5.2 JLabel
JLabel reprezint etichetele din Java, etichete ce nu pot fi suprascrise sau
selectate n momentul rulri programului. Acestea au rol informativ pentru utilizator,
deoarece n etichete se pot insera atat cmpuri text cu descrierea aciuni ce trebuie
urmat sau imagini.
2.3.5.2 JButton
JButton face parte din clasa AbstractButton, i funcionalitatea lui este c prin
simpla lui apasare genereaz aruncarea unui eveniment pe care programatorul trebuie s
l trateze. La apasarea lui, butonul i schimb aspectul. Pe un buton se pot insera atat
cmpuri text cu descrierea aciuni pe care o genereaz la apasare, dar i imagini, care pot
aprea n diferite momente ale butonului, cand acesta este apsat sau eliberat.
2.3.5.3 JComboBox
JFrame este containrul de nivel nalt cel mai des folosit pentru aplicaile
bazate pe tehniologia Swing. Componentele pachetului Swing se poziioneaz n
interiorul containrului.
Componenta JComboBox este o combinaie ntre un buton i o list din care
utilizatorul poate alege doar un element, fiind singurul disponibil la un moment dat.
JComboBox poate fi creat dintr-un obiect, sau iniializat dintr-un vector, sau folosind un
model dat explicit de tip ComboBoxModel.
Exemplu JComboBox:
JComboBoxSala este programat s listeze toate slile din baza de date. Componenta
JComboBox este declarat automat de programul NetBeans, utilizatorul fiind nevoit
doar s iniializeze componenta.
Olteanu Alexandru
36
2.3.5.4 JTable
JTable este componenta care este capabil s opereze cu tabele. JTable poate fi
creat cu ajutorul unor modele.
JTable folosete la listarea unor obiecte dintr-o baz de date i are posibilitatea
selectri unui astfel de obiect cu ajutorul metodei jTable1MouseClicked din clasa
motenita java.awt.event.MouseEvent
Exemplu
- DriverManager
Olteanu Alexandru
37
import java.sql.DriverManager;
Nu exist o restricie al numrului de drivere importate n maina virtual Java,
de aceea specificarea cii URL JDBC unui sistem de gestiune este necesar. Sintaxa
general de specificare a cii este jdbc.<subprotocol>:<nume>. De exemplu, pentru
folosirea unui sistem de gestiune PostgreSQL calea arat astfel:
Olteanu Alexandru
38
- n url sunt trecute calea catre serverul local i numele bazei de date la care
trebuie aplicaia sa se conecteze.
Olteanu Alexandru
39
unde, n acest exemplu instuciunea SQL ntoarce toate valorile din tabela
Formaiuni_studiu pentru care Id_parinte este egal cu 0.
execute: este o metod care ntoarce un rezultat format din mai multe obiecte.
Olteanu Alexandru
40
Id
1
Nume
Popescu Marian
Id_dep
42
Olteanu Alexandru
41
Capitolul 3
Aplicaia de asistena de ntocmire a orarului
3.1 Descrierea aplicaiei
Aplicaia este un ajutor de ntocmire al orarului i a fost dezvoltat n mediul
de programare NetBeans IDE 7.4, un soft disponibil n mod gratuit pe internet. Pentru
crearea unei baze de date am folosit softul PgAdmin III iar sistemul de gestiune ales este
PostgreSQL deasemenea disponibilie pe internet.
Pentru a putea opera secvene sql n Netbeans, a fost necesar folosirea unui
driver JDBC numit postgresql-9.1-901.jdbc4.
Baza de date a fost conceput plecnd de la ideea c publicul int al aplicaiei
sunt secretariatele facultilor, care la nceputul fiecrui an universitare trebuie s
ntocmneasc pe baza planului de nvamnt notele de comand i orarul. Pentru ca
ntocmirea orarului sa fie corect trebuie avut n vedere eventualele probleme ce pot
aprea n momentul programrii pe sli i zile att formaiunile de studiu cat i
profesori.
Setul de reguli de care o aplicaie de asistare a ntocmiri orarului trebuie sa in
cont n momentul n care utilizatorul ncearc sa programeze un cmp din orar este:
- formaiunile de studiu pot fi programate o singur dat pe un interval orar. Daca
exist formaiuni ce au sub-formaiuni de care depind, cum ar fi anul, grup, semigrupa,
atunci nu se pot programa pe acelai interval orar i formaiuni i subformaiuni.
- profesori nu pot fi programai s in doua discipline n acelai timp.
- daca o sal a fost programat pentru o formaiune la un anumit interval orar, atunci
acea sal nu este disponibil pentru nici o alt formaiune n acelai interval.
Interfaa grafic creat a fost proiectat pentru a fi n primul rnd intuitiv,
partea estetic fiind pus pe locul 2.
Olteanu Alexandru
42
Baza de date este format din 14 tabele distincte, fiecare fiind proiectat pentru
a asigura integritatea i optimizarea informaiei. Scriptul de crearea al bazei de date este
redat n totalitate n subcapitolul Anexe, la punctul 3.4.1
Tabelele au urmtoarele roluri:
- Profesori: este tabela de gestiune pentru profesori.
- Ore: gestiunea intervalelor orare
-Zile: gestiunea zilelor saptmni
- Sali: gestiunea salilor alocate pentru o anumit facultate.
-Mod: gestiunea paritii
-Formatiuni_studiu: gestiunea anilor, grupelor, subgrupelor.
-Planuri_scolarizare: Planurile de scolarizare pentru fiecare an.
-Loc_timp: tabel de legtur ntre ore, zile i sli.
- Departamente: gestionarea departamentelor.
- Facultai: gestionarea facultailor;
-Detalii_plan_scolarizare: gestionarea tuturor informaiilor dintr-un plan de
scolarizare
-Defalcare_ore: tabel de legtura ntre profesor, disciplin, tipul orei, numrul de ore.
-Asociere_an_plan: tabel de legtur ntre, tabela de formaiuni i tabela de planuri.
-Programare_ore: tabela de gestiune a programarilor orarului.
Olteanu Alexandru
43
a) Tabela Profesori:
b) Tabela Ore:
Olteanu Alexandru
44
c) Tabela Zile:
d) Tabela Formatiuni_studiu:
Olteanu Alexandru
45
e) Tabela Facultati:
e) Tabela Departamente:
Olteanu Alexandru
46
-Id_facultate: este o cheie strin (foreign key), adic, este cheia de legtur
cu cheia primar din tabela Facultai.
f) Tabela Sali:
g) Tabela Loc_timp:
Olteanu Alexandru
47
g) Tabela Defalcare_ore:
Olteanu Alexandru
48
-Nr_ore: este coloana ce stocheaz numrul de ore al unui curs, seminar sau
laborator. Variabila este declarat ca intreg.
h) Tabela Programare_ore:
Olteanu Alexandru
49
Pentru crearea unui constructor al unei tabele este necesar s definim clasa public cu
acelai nume, i s iniializm n aceasta variabile pentru fiecare coloan din tabel
n interiorul clasei se declar variabile la nivel de clas pentru fiecare coloan din
tabela Loc_timp i referirea la variabile se face cu instriciunea this. pentru a putea fi
folosite.
Constructorul gol , public Loc_timp (), se declar pentru c apelul uneori ntr-o
metod se face i catre constructorul gol, iar dac acesta nu este declarat, aplicaia va da
eraore.
Constructorul are definite n interiorul lui i niste metode de setare a valorilor n baza
de date sau de recuperare a acestora. Aceste metode sunt getA i setA, unde A este
numele coloanei din baza de date.
Exemplu
Olteanu Alexandru
50
Olteanu Alexandru
51
Olteanu Alexandru
52
Olteanu Alexandru
53
Frame-ul Meniu a fost creat pentru a facilita navigarea ctre toate ferestrele
aplicaiei. Acesta este format dintr-un JMenuBar cu dou meniuri.
Meniul UPB listeaz doi itemi, unul care conduce la un JFrameSali, iar al
doilea conduce ctre JFrameProfesori.
Al doilea meniu, Programare Orar conduce catre JFrameIntocmireOrar,
fereastra n care se programeaz efectiv orarul i catre 3 JFrameRaport care creaz
rapoarte cu privire la orar pe diferite criteri.
Olteanu Alexandru
54
b) JFrameSali.java
Olteanu Alexandru
55
c) JFrameProfesori.java
Olteanu Alexandru
56
d) JFrameIntocmireOrar.java
Olteanu Alexandru
57
d) JFrameRapoarteX.java
Ferestrere de Rapoarte sunt create pentru a genera rapoarte despre orar din prisma
diferitelor criterii, cum ar fi profesori, sali sau an studiu.
Listele ncarca datele din tabele iar n momentul n care se apas butonul de generare
raport, acesta va afia ntr-o fereastr programarea respectivei categori pentru toat
saptamana.
Sursele cod pentru toate ferestrele de tip JFrame vor fi anexate n subcapitolul 3.4.4
Olteanu Alexandru
3.4 Anexe
3.4.1 Structura scriptului bazei de date.
DROP TABLE IF EXISTS "Zile";
DROP TABLE IF EXISTS "Sali";
DROP TABLE IF EXISTS "Ore";
DROP TABLE IF EXISTS "Mod";
DROP TABLE IF EXISTS "Programare_ore";
DROP TABLE IF EXISTS "Loc_timp";
DROP TABLE IF EXISTS "Defalcare_ore";
DROP TABLE IF EXISTS "Asociere_an_plan";
DROP TABLE IF EXISTS "Detalii_plan_scolarizare";
DROP TABLE IF EXISTS "Planuri_scolarizare";
DROP TABLE IF EXISTS "Profesori";
DROP TABLE IF EXISTS "Formatiuni_studiu";
DROP TABLE IF EXISTS "Departamente";
DROP TABLE IF EXISTS "Facultati";
-- Table: "Facultati"
--DROP TABLE IF EXISTS "Facultati";
CREATE TABLE "Facultati"
(
"Id" SERIAL,
"Denumire_facultate" character varying(80),
CONSTRAINT pk_facultati PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Facultati"
OWNER TO postgres;
-- Table: "Departamente"
--DROP TABLE IF EXISTS "Departamente";
CREATE TABLE "Departamente"
(
"Id" SERIAL,
"Denumire_departament" character varying(80),
"Id_facultate" integer NOT NULL,
CONSTRAINT pk_departamente PRIMARY KEY ("Id"),
CONSTRAINT fk_departamente FOREIGN KEY ("Id_facultate")
REFERENCES "Facultati" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Departamente"
OWNER TO postgres;
CREATE TABLE "Formatiuni_studiu"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
58
Olteanu Alexandru
"Id_parinte" integer,
CONSTRAINT pk_formatiuni PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Formatiuni_studiu"
OWNER TO postgres;
-- Table: "Profesori"
-- DROP TABLE "Profesori";
CREATE TABLE "Profesori"
(
"Id" SERIAL,
"Nume" character varying(50) NOT NULL,
"Id_dep" integer NOT NULL,
CONSTRAINT pk_profesori PRIMARY KEY ("Id"),
CONSTRAINT fk_profesori FOREIGN KEY ("Id_dep")
REFERENCES "Departamente" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Profesori"
OWNER TO postgres;
-- Table: "Planuri_scolarizare"
--DROP TABLE IF EXISTS "Planuri_scolarizare";
CREATE TABLE "Planuri_scolarizare"
(
"Id" SERIAL,
"Denumire_plan" character varying(20) NOT NULL,
CONSTRAINT pk_planuri PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Planuri_scolarizare"
OWNER TO postgres;
-- Table: "Detalii_plan_scolarizare"
--DROP TABLE IF EXISTS "Detalii_plan_scolarizare";
CREATE TABLE "Detalii_plan_scolarizare"
(
"Id" SERIAL,
"Disciplina" character varying(50) NOT NULL,
"Cod_disciplina" character varying(15) NOT NULL,
"C" integer NOT NULL,
"S" integer NOT NULL,
"L" integer NOT NULL,
"P" integer NOT NULL,
"PC" integer NOT NULL,
"Forma_evaluare" character varying(1) NOT NULL,
"Id_plan" integer NOT NULL,
"Semestru" character varying(5) NOT NULL,
"Tip_O_A_L" character(1),
"Id_departament" integer NOT NULL,
CONSTRAINT pk_detalii PRIMARY KEY ("Id"),
59
Olteanu Alexandru
60
Olteanu Alexandru
-- Table: "Mod"
-- DROP TABLE IF EXISTS "Mod";
CREATE TABLE "Mod"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
CONSTRAINT pk_mod PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Mod"
OWNER TO postgres;
61
Olteanu Alexandru
-- Table: "Ore"
-- DROP TABLE IF EXISTS "Ore";
CREATE TABLE "Ore"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
CONSTRAINT pk_ore PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Ore"
OWNER TO postgres;
-- Table: "Sali"
-- DROP TABLE IF EXISTS "Sali";
CREATE TABLE "Sali"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
CONSTRAINT pk_sali PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Sali"
OWNER TO postgres;
-- Table: "Zile"
-- DROP TABLE IF EXISTS "Zile";
CREATE TABLE "Zile"
(
"Id" SERIAL,
"Denumire" character varying(10) NOT NULL,
CONSTRAINT pk_zile PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Zile"
OWNER TO postgres;
62
Olteanu Alexandru
63
Olteanu Alexandru
}
public int getId_sala() {
return id_sala;
}
public void setId_sala(int id_sala) {
this.id_sala = id_sala;
}
public int getId_zi() {
return id_zi;
}
public void setId_zi(int id_zi) {
this.id_zi = id_zi;
}
public int getId_ora() {
return id_ora;
}
public void setId_ora(int id_ora) {
this.id_ora = id_ora;
}
public int getId_mod() {
return id_mod;
}
public void setId_mod(int id_mod) {
this.id_mod = id_mod;
}
public String getDisponibilitate() {
return disponibilitate;
}
public void setDisponibilitate(String disponibilitate) {
this.disponibilitate = disponibilitate;
}
}
64
Olteanu Alexandru
Class.forName(DRIVER_CLASS_NAME).newInstance();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
databaseConnection = DriverManager.getConnection(DB_CONNECTION_URL, USER,
PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
}
//Facultati
public static boolean insertFacultate(Facultate f) {
boolean isInserted = false;
if (databaseConnection != null) {
String sql = "INSERT INTO \"Facultati\" (\"Id\", \"Denumire_facultate\") VALUES(?,?)";
try {
PreparedStatement insertStatement = databaseConnection.prepareStatement(sql);
insertStatement.setInt(1, f.getId());
insertStatement.setString(2, f.getDenumire());
insertStatement.execute();
isInserted = true;
} catch (SQLException e) {
e.printStackTrace();
}
}
return isInserted;
}
//Listeaza formatiunile
public static List<Formatiuni> selectFormatiuni() {
List<Formatiuni> formatiuni = null;
String sql = "SELECT * FROM \"Formatiuni_studiu\" "
+ "WHERE \"Id_parinte\" = 0 ORDER BY (\"Denumire\")";
try {
PreparedStatement selectStatement = databaseConnection.prepareStatement(sql);
ResultSet results = selectStatement.executeQuery();
formatiuni = new ArrayList<Formatiuni>();
while (results.next()) {
Formatiuni fo = new Formatiuni();
fo.setId(results.getInt(1));
fo.setDenumire(results.getString(2));
fo.setId_parinte(results.getInt(3));
formatiuni.add(fo);
}
65
Olteanu Alexandru
66
} catch (SQLException e) {
e.printStackTrace();
}
return formatiuni;
}
public static List<Formatiuni> selectFormatiuni(int id_zi, int id_ora) {
List<Formatiuni> formatiuni = null;
String sql = "select * from \"Formatiuni_studiu\" fo where fo.\"Id\" not in "
+ "(select def.\"Id_formatiune\" from \"Defalcare_ore\" def, \"Loc_timp\" lt, \"Programare_ore\"
po where "
+ "def.\"Id\"= po.\"Id_defalcare\" and lt.\"Id\" = po.\"Id_loc_timp\" and lt.\"Id_zi\" = ? and
lt.\"Id_ora\" = ?)AND fo.\"Id_parinte\" not in "
+ "(select def.\"Id_formatiune\" from \"Defalcare_ore\" def, \"Loc_timp\" lt, \"Programare_ore\"
po where "
+ "def.\"Id\"= po.\"Id_defalcare\" and lt.\"Id\" = po.\"Id_loc_timp\" and lt.\"Id_zi\" = ? and
lt.\"Id_ora\" = ? )";
try {
PreparedStatement selectStatement = databaseConnection.prepareStatement(sql);
selectStatement.setInt(1, id_zi);
selectStatement.setInt(2, id_ora);
selectStatement.setInt(3, id_zi);
selectStatement.setInt(4, id_ora);
formatiuni = new ArrayList<Formatiuni>();
ResultSet results = selectStatement.executeQuery();
while (results.next()) {
Formatiuni fo = new Formatiuni();
fo.setId(results.getInt(1));
fo.setDenumire(results.getString(2));
fo.setId_parinte(results.getInt(3));
formatiuni.add(fo);
}
} catch (SQLException e) {
e.printStackTrace();
}
return formatiuni;
}
public static List<Ore> selectOre(int id_sala, int id_zi) {
List<Ore> ore = null;
String sql = "select * from \"Ore\" o where o.\"Id\" in \n"
+ "(select lt.\"Id_ora\" from \"Loc_timp\" lt where \n"
+ "lt.\"Id\" not in (select \"Id_loc_timp\" from \"Programare_ore\") and lt.\"Id_sala\" = ? and
lt.\"Id_zi\" = ? order by o.\"Id\"\n"
+ ") ";
try {
PreparedStatement selectStatement = databaseConnection.prepareStatement(sql);
Olteanu Alexandru
selectStatement.setInt(1, id_sala);
selectStatement.setInt(2, id_zi);
ResultSet results = selectStatement.executeQuery();
ore = new ArrayList<Ore>();
while (results.next()) {
Ore o = new Ore();
o.setId(results.getInt(1));
o.setDenumire(results.getString(2));
ore.add(o);
}
} catch (SQLException e) {
e.printStackTrace();
}
return ore;
}
public static boolean deleteOre(int id) {
boolean isDeleted = false;
String sql = "DELETE from \"Ore\" where \"Id\" = ?";
try {
PreparedStatement statement = databaseConnection.prepareStatement(sql);
statement.setInt(1, id);
int del = statement.executeUpdate();
if (del == 1) {
isDeleted = true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return isDeleted;
}
public static List<Zile> selectZile(int id_sala) {
List<Zile> zile = null;
String sql = "select distinct \"Id\", \"Denumire\" from \"Zile\" z where z.\"Id\" in "
+ "(select lt.\"Id_zi\" from \"Loc_timp\" lt where "
+ "lt.\"Id\" not in (select \"Id_loc_timp\" from \"Programare_ore\") "
+ "and lt.\"Id_sala\" = ?) order by \"Id\" ";
try {
PreparedStatement selectStatement = databaseConnection.prepareStatement(sql);
selectStatement.setInt(1, id_sala);
ResultSet results = selectStatement.executeQuery();
zile = new ArrayList<Zile>();
while (results.next()) {
Zile z = new Zile();
z.setId(results.getInt(1));
z.setDenumire(results.getString(2));
67
Olteanu Alexandru
zile.add(z);
}
} catch (SQLException e) {
e.printStackTrace();
}
return zile;
}
;
public class JFrameIntocmireOrar extends javax.swing.JFrame {
JLabel[][] to = new JLabel[5][5];
List<Sali> saliExistente;
List<Zile> zileExistente;
List<Ore> oreExistente;
List<Formatiuni> formatiuniExistente;
boolean first = true;
public JFrameIntocmireOrar() {
initComponents();
saliExistente = OrarDAO.selectSali();
for (Sali s : saliExistente) {
jComboBoxSala.addItem(s.getDenumire());
}
int inds = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(inds).getId();
jPanel2.setLayout(new GridLayout(5, 5, 160, 80));
to = new JLabel[5][5];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) { // verificare programare loc_timp
int id_lt = OrarDAO.selectLoc_timp(ids, j + 1, i + 1);
68
Olteanu Alexandru
if (OrarDAO.verificaLoc_timp(id_lt)) {
to[i][j] = new JLabel("Liber");
to[i][j].setBackground(Color.green);
to[i][j].createToolTip();
} else {
to[i][j] = new JLabel("Ocupat");
to[i][j].setBackground(Color.red);
to[i][j].createToolTip();
to[i][j].setToolTipText(OrarDAO.selectDetaliiProgramareS(ids, j+1, i+1,"T"));
}
to[i][j].setOpaque(true);
jPanel2.add(to[i][j]);
}
}
jPanel2.revalidate();
}
private void jComboBoxSalaActionPerformed(java.awt.event.ActionEvent evt) {
jComboBoxZiua.removeAllItems();
int inds = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(inds).getId();
zileExistente = OrarDAO.selectZile(ids);
for (Zile z : zileExistente) {
jComboBoxZiua.addItem(z.getDenumire());
}
if (!first) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) { // verificare programare loc_timp
int id_lt = OrarDAO.selectLoc_timp(ids, j + 1, i + 1);
if (OrarDAO.verificaLoc_timp(id_lt)) {
to[i][j].setText("Liber");
to[i][j].setBackground(Color.green);
to[i][j].setToolTipText("");
} else {
to[i][j].setText("Ocupat");
to[i][j].setBackground(Color.red);
to[i][j].setToolTipText(OrarDAO.selectDetaliiProgramareS(ids, j+1, i+1,"T"));
}
}
}
} else {
first = false;
}
}
private void jComboBoxZiuaActionPerformed(java.awt.event.ActionEvent evt) {
jComboBoxOra.removeAllItems();
int inds = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(inds).getId();
int indz = jComboBoxZiua.getSelectedIndex();
if (indz >= 0) {
69
Olteanu Alexandru
70
Olteanu Alexandru
71
to[ido - 1][idz - 1].setToolTipText(formatiune + " " + disciplina + " " +tip_ora + " Profesor " +
profesor );
jComboBoxZiua.removeAllItems();
zileExistente = OrarDAO.selectZile(ids);
for (Zile z : zileExistente) {
jComboBoxZiua.addItem(z.getDenumire());
}
}
private void jButtonGenerareActionPerformed(java.awt.event.ActionEvent evt) {
Object[][] orarSala = new Object[6][6];
orarSala[0][0] = "*";
orarSala[0][1] = "Luni";
orarSala[0][2] = "Marti";
orarSala[0][3] = "Miercuri";
orarSala[0][4] = "Joi";
orarSala[0][5] = "Vineri";
orarSala[1][0] = "8-10";
orarSala[2][0] = "10-12";
orarSala[3][0] = "12-14";
orarSala[4][0] = "14-16";
orarSala[5][0] = "16-18";
int inds = jComboBoxSala.getSelectedIndex();
int ids = saliExistente.get(inds).getId();
// Completare Tabel
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) { // verificare programare loc_timp
int id_lt = OrarDAO.selectLoc_timp(ids, j + 1, i + 1);
if (OrarDAO.verificaLoc_timp(id_lt)) {
orarSala[i+1][j+1] = " ";
} else {
orarSala[i+1][j+1] = OrarDAO.selectDetaliiProgramareS(ids, j+1, i+1, "R") ;
}
}
}
// generare HTML
String title = "Orar sali";
String h1 = "Orar sala:";
String h2 = saliExistente.get(inds).getDenumire();
String body ="Orar provizoriu";
String footer = "";
String raportOrar = MotorHTML.completeHTML(title, h1, h2, orarSala, body,footer);
MotorHTML.string2File(raportOrar, "D://Raport.html");
File f = new File("D://Raport.html");
try {
Desktop.getDesktop().browse(f.toURI());
} catch (IOException ex) {
Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(Level.SEVERE, null, ex);
}
}
Olteanu Alexandru
72
Olteanu Alexandru
73
java.util.logging.Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(java.util.logging.Level.SE
VERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrameIntocmireOrar().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonAdaugaProgramare;
private javax.swing.JButton jButtonGenerare;
private javax.swing.JComboBox jComboBoxDisciplina;
private javax.swing.JComboBox jComboBoxFormatiuni;
private javax.swing.JComboBox jComboBoxOra;
private javax.swing.JComboBox jComboBoxSala;
private javax.swing.JComboBox jComboBoxTip_ora;
private javax.swing.JComboBox jComboBoxZiua;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel14;
private javax.swing.JLabel jLabel15;
private javax.swing.JLabel jLabel16;
private javax.swing.JLabel jLabel17;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField jTextFieldMsg;
// End of variables declaration
}
package UI;
import DB.*;
import DAO.*;
import java.util.List;
import javax.swing.table.DefaultTableModel;
public class JFrameProfesori extends javax.swing.JFrame {
List<Profesori> profesoriExistenti;
Olteanu Alexandru
List<Departament> departamenteExistente;
public JFrameProfesori() {
initComponents();
departamenteExistente = OrarDAO.selectDepartamente();
for (Departament d : departamenteExistente) {
jComboBoxDepartament.addItem(d.getId() + "." + d.getDenumire());
umpleTabelProf();
}
}
private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {
int ind = jTable1.getSelectedRow();
Profesori p = profesoriExistenti.get(ind);
String nume = p.getNume();
jTextFieldNume.setText(nume);
}
private void jButtonStergeActionPerformed(java.awt.event.ActionEvent evt) {
int ind = jTable1.getSelectedRow();
Profesori p = profesoriExistenti.get(ind);
int id = p.getId();
boolean rez = OrarDAO.deleteProfesor(id);
if (rez) {
jTextFieldMsg.setText(id + " Sters!");
} else {
jTextFieldMsg.setText("Eroare!");
}
umpleTabelProf();
jTextFieldNume.setText("");
}
private void jButtonModificaActionPerformed(java.awt.event.ActionEvent evt) {
int ind = jTable1.getSelectedRow();
Profesori p = profesoriExistenti.get(ind);
int id = p.getId();
String nume = jTextFieldNume.getText();
boolean rez = OrarDAO.updateProfesor(id, nume);
if (rez) {
jTextFieldMsg.setText(id + " Modificat!");
} else {
jTextFieldMsg.setText("Eroare!");
}
umpleTabelProf();
jTextFieldNume.setText("");
}
private void jButtonAdaugaActionPerformed(java.awt.event.ActionEvent evt) {
String nume = jTextFieldNume.getText();
int id = 0;
int ind = jComboBoxDepartament.getSelectedIndex();
Departament d = departamenteExistente.get(ind);
int id_dep = d.getId();
Profesori p = new Profesori(0, nume, id_dep);
boolean rez = OrarDAO.insertProfesor(p);
if (rez) {
74
Olteanu Alexandru
jTextFieldMsg.setText(" Adaugat!");
umpleTabelProf();
} else {
jTextFieldMsg.setText("Eroare!");
}
}
private void jComboBoxDepartamentActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void umpleTabelProf() {
tableModel = new javax.swing.table.DefaultTableModel(
new Object[][]{},
new String[]{
"Id", "Nume", "Departament"
}
){
Class[] types = new Class[]{
java.lang.Integer.class, java.lang.String.class, java.lang.String.class
};
public Class getColumnClass(int columnIndex) {
return types[columnIndex];
}
;
};
int ind = jComboBoxDepartament.getSelectedIndex();
profesoriExistenti = OrarDAO.selectProfesori();
for (Profesori p : profesoriExistenti) {
tableModel.addRow(new Object[]{p.getId(), p.getNume(), p.getId_dep()});
}
jTable1.setModel(tableModel);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrameProfesori().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonAdauga;
private javax.swing.JButton jButtonModifica;
private javax.swing.JButton jButtonSterge;
private javax.swing.JComboBox jComboBoxDepartament;
private javax.swing.JLabel jLabelDepartament;
private javax.swing.JLabel jLabelNume;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable jTable1;
private javax.swing.JTextField jTextFieldMsg;
private javax.swing.JTextField jTextFieldNume;
// End of variables declaration
private DefaultTableModel tableModel;
}
Similar pentru celelalte JFrame, doar denumirile componentelor se vor schimba
75
Olteanu Alexandru
76
Bibliografie
[1] Vasilache, Tiberiu; Curs Baze de date; Facultatea de tiine aplicate, 2014;
[2] Vasilache, Tiberiu; Curs Programare orientat obiect; Facultatea de tiine aplicate,
2014;
[3] Frsinaru, Cristian; Curs practic de Java;
[4] Rdulescu, Florin; Curs Proiectarea bazelor de date;
[5] Tnas, tefan; Olariu, Cristian; Andrei,tefan; Java de la 0 la Expert;
Ed,Polirom,2003;
[6] Akeel,I Din; Structured Query Language (SQL) - A practical introduction;
Editura Blackwell;
[7] Wiener,Richard; Pinson,Lewis J.; Fundamentals of OOP and Data Structures
in Java;
[8] Lemay,Laura; Perkins,Charles L.; "Teach Yourself Java in 21 days";
[9] Bracha,Gilad; Generics in the Java Programming Language; 2004;
[10] Forta, B. (2002). SQL pentru incepatori. Bucuresti: Teora.
Surse online:
[1] http://www.biblioteca-digitala.ase.ro/biblioteca/biblioteca1.asp?id=11
[2] http://worknetlab.no-ip.org/.../DespremasinavirtualaJava.html
[3]http://automatica.cch.ro/Laboratoare/Indrumar%20laborator%20Baze%20de%20date
.pdf
[4] Referina P1: http://thor.info.uaic.ro/~acf/java/curs/5/interf_grafica.html
[5] http://www.postgresql.org/docs/
[6] https://netbeans.org/kb/index.html