Specializarea Matematică și Informatică Aplicată [632265]

Universitatea Politehnica din București
Facultatea de Științe Aplicate
Specializarea Matematică și Informatică Aplicată

Aprobat, Decan:
Prof. Univ. Dr. Vasile Iftode

Proiect de diplomă

Gestionare a resurselor umane și de
timp folosind programarea orientată
obiect și un SGBD

Coordonator științific:
Lect. Dr. Tiberiu Vasilache
Absolvent: [anonimizat]
2014

Olteanu Alexandru 2
Cuprins

Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1. Baze de date 6

1.1 Scur t istoric despre bazele de date . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.2 Teoria bazelor de date de tip rela țional. . . . . . . . . . . . . . . . . . . . . . . . 7

1.2.1 Elemente de bază ale modelului relațional. . . . . . . . . . . . . . . . . . . 8

1.2.2 Restricții ale modelului relațional. . . . . . . . . . . . . . . . . . . . . . . 11

1.2.3 Procedeul de normalizare al relațiilor . . . . . . . . . . . . . . . . . . . . . 12

1.2.3.1 Prima formă normală (NF1) . . . . . . . . . . . . . . . . . . . . . . . 12

1.2.3.2 A doua formă normală (NF2) . . . . . . . . . . . . . . . . . . . . . . 13

1.2.3.3 A treia formă normală (NF3) . . . . . . . . . . . . . . . . . . . . . . 13

1.2.3 .4 Formă normală Boyce -Codd(BCNF). . . . . . . . . . . . . . . . . . . 14

1.2.3.5 A patra formă normală (NF4) . . . . . . . . . . . . . . . . . . . . . 14

1.2.3.6 A cincea formă normală (NF5) . . . . . . . . . . . . . . . . . . . . . 14

1.3 Sistem de gestiune al bazelor de date:PostgreSQL . . . . . . . . . . . . . . . . . . . 15

1.3.1 Manipularea bazelor de date. Limbajul SQL . . . . . . . . . . . . . . . . . . 15

1.3.1.1 Construirea și crearea relațiilor . . . . . . . . . . . . . . . . . . . . . . 17

1.3.1.2 Interogarea bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . 19

1.3.1.3 Popularea bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . . 20

1.3.1.4 Ștergerea valorilor din baza de date . . . . . . . . . . . . . . . . . . . 21

1.3.1.5 Actualizarea valorilor din baza de date . . . . . . . . . . . . . . . . . . 22

1.3.1.6 Subinterogări ale relațiilor . . . . . . . . . . . . . . . . . . . . . . . . . 22

Olteanu Alexandru 3

2. Programare orientată obiect. JAVA 24

2.1 Java noțiuni indroductive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.2 Structura limbajului Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.2.1 Operatori și literali în Java. . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.2.2 Declararea și inițializarea variabilelor. . . . . . . . . . . . . . . . . . . . . 27

2.2.3 Vectori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.2 Programare orientată obiect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.3.1 Obiecte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.3.2 Clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2.3.2.1 Clasa Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.3.3 Excepții . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

2.3.4 Pachete standard în Java . . . . . . . . . . . . . . . . . . . . . . . . . . 33

2.3.5 Gestionarea și generarea interfeței grafice cu utilizatorul . . . . . . . . . 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

2.3.6 Conexiunea la o bază de date (JDBC) . . . . . . . . . . . . . . . . . . . . 37

2.3.6.1 DAO (Data acces objet) . . . . . . . . . . . . . . . . . . . . . . . . 38

2.3.6.2 Interfețe SQL în Java . . . . . . . . . . . . . . . . . . . . . . . . . 38

2.3.6.2.1 Interfața Statement . . . . . . . . . . . . . . . . . . . . . . . . . 38

2.3.6.2.2 Interfața PreparedStatement . . . . . . . . . . . . . . . . . 39

Olteanu Alexandru 4

2.3.6.2.3 Interfața ResultSet . . . . . . . . . . . . . . . . . . . . . . 40

3 Aplicația de a sistența de întocmire a orarului 41

3.1 Descrierea aplicației . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

3.2 Structura bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3.2.1 Prezentarea tabelelor . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3.3 Programare Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

3.3.1 Pach etul DB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

3.3.2 Pachetul OrarDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

3.3.3 Pachetul UserInterface(UI ) . . . . . . . . . . . . . . . . . . . . . . 53

3.4 Anexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

3.4.1 Structura scriptului bazei de date. . . . . . . . . . . . . . . . . . . 58

3.4.2 Codul Java pentru pachetul DB . . . . . . . . . . . . . . . . . . . . 63

3.4.3 Codul Java pentru pachetul OrarDAO . . . . . . . . . . . . . . . . 65

3.4.3 Codul Java pentru UI . . . . . . . . . . . . . . . . . . . . . . . . . 70

Bibliografie 76

Olteanu Alexandru 5
Introducere

Bazele de date au devenit în ultimi i ani o parte indispensabil ă din viața noastră
de zi cu zi și asta datorită dezvoltări i uriașe a tehnologiei informaționale. În urma cu
câțiva 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 activități cotidiene și nu numai.
Siguranța datelor și ușurința cu care sunt manipulate într -un sistem de gestiune sunt
principalele atuuri ale unei baze de date.

Nevoia de ap licații care să prelucreze un volum mare de date, sigur și rapid
este în creștere. Astăzi, aplicații le de acest gen le putem întâlni la tot pasul, fie că
vorbim de o gestiune a resurselor umane pe diferite criter ii într -o organizație, fie de
gestiunea si stemelor bancare și a plăților online, fie de organizarea caledarului personal
pentru urmatorul an.

Scopul lucrăr ii este de a crea o aplicație cu ajutorul programării orientate pe
obiect și a unui sistem de gestiune al bazelor de date, care sa ofere asistență în generarea
și întocmirea orarului. Publicul țintă este bine definit, acesta f iind format din
secretariatele facultaților care, pe baza planului de învațământ, trebuie sa programeze
ore pentru fiecare formațiune de studiu, să aloce un interval o rar și un loc de desfașurare
al cursurilor.

Olteanu Alexandru 6
Capitolul 1

Baze de date

1.1 Scurt istoric despre bazele de date

Conform unor a firmații de la î nceputul ani lor 1960 prima oară un sistem de
baze de date a fost introdus în cadrul misiunilor de aselenizare Appolo gestionate de
Agenția Spațial ă American ă (N.A.S.A).

Nevoia de organizare a datelor, precum și de actualizare sau găsire a acestora
în timp real au condus către crearea unui sistem de gestiune. Aproximativ 20 de ani mai
târziu Edgar Frank Codd , un informatician de origine engleză , a introdus no țiunea de
model relațional al bazelor de date, fapt ce a stat la baza creării bazelor de date
relaționale.

Baza de date reprezintă o colecție de informa ții partajate, aflate în dependență
reciprocă logică, structurate într -un mod clar pentru a facilita operațiuni 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) es te un sistem
software care permite utilizatorilor , pe de o parte crearea bazei de date și întreținerea
acesteia , și pe de alt ă parte răspunde la cererile utilizatorilor legate de controlul și
monitorizarea bazei de date.

Bazele de date se clasific ă în funcție de:
 Orientare:
– specializate;
– generalizate;
 Distribuția bio grafic ă:
– locale;
– distribuite;
 Modelul de date:
– ierarhice;
– relaționale;
– orientate pe obiect;
– relație;

Olteanu Alexandru 7

Sistemul de gestiune al bazelor de date este format:

 dintr -un limbaj ce facilitează definirea datelor în care utilizatorul sau
administratorul bazei denumește și descrie relațiile și entităț ile dintre acestea;

 dintr -un limbaj structurat de interogare, numit Limbaj Structurat de Interogare
(SQL), specific pentru manipularea datelor , care are ca scop actualizarea, ștergerea,
inserarea, modificarea și interogarea bazei de date.

1.2 Teoria bazelor de date de tip relațional

Conform informaticianului Codd, orice model de date este necesar să se bazeze
pe structurile , operatori i de manipulare și constrângerile de integritate.

 Structurile de date: În modelul rel ațional datele sunt structurate în relații de tip
bidimensional, iar elementele principale ale unei structuri relaționale sunt tuplurile,
atributele, domeniile, tabelele, chei primare sau de legatur ă.

 Operatori de manipulare: Operatorii relaționali se baz ează pe conceptul
algebrei relaționale, iar manipularea acestora se poate realiza ut ilizând un limbaj de
manipulare (data manipulation language).

 Constrângerile de in tegritate: Prin constrângerile de integritate în țelegem
măsuri luate pentru siguranța, st abilitatea și corectitudinea datelor, măsuri interne care
nu sunt cunoscute de către utilizator.

Modelul relațional al bazei de date este unul simplu, fundamentat pe logica
matematică și teoria seturilor. Acest model a luat amploare în ultim ii ani dat orită unor
serii de avantaje.

– oferă oportunitatea utilizatorului printr -un sistem de gestiune sa ap eleze ce date
dorește și nu cum anume poate ajunge la rezultat.

– informațiile sunt stocate ca valori.

– poate fi utilizat pentru manipularea de da te complexe.

Olteanu Alexandru 8

1.2.1. Elemente de bază ale modelului relațional

Elementele de bază pentru definirea structurii de date sunt:

a) Domeniul: este o mulțime de valori descrisă printr -un nume. Domeniul poate
fi def init prin natura caracteristicilor definitorii ale elementelor componente.

Exemplu:

 Forme de înva țământ = {An, Grup ă, Subgrup ă}

 Calificat iv = {1,2,3,4,5,6,7,8,9,10}

 Zilele săptămânii = {Luni, Marți, Miercuri, Joi, Vineri }

Fie domeniile D 1, D2, D3, … ,Dn. Definim produsul cartezian ca fiind

dar exist ă și posibilitatea ca în șirul de domenii al produsul ui cartezian s ă regăsim un
element de mai multe ori.

b) Relație/Tabel ă: este suba nsamblul unui produs cartezian al unor domenii,
având asociat un nume, care caracte rizează atributele ce aparțin unei clase de entit ăți.

Un exemplu de tabel ă ar fi situația carierei foștilor studenți ai unei facult ăți:

Tabela 1.2.1

Olteanu Alexandru 9

c) Atribut: este coloana unei relații caracteri zată printr -un nume.

Pentru t abela 1.1 putem da exemplu urmatoarele atribute:

 Id_studen t: este codul cu care identifică m un student. Acest cod este unic și nu
poate exist a într-o tabelă de două ori;
 NumeS: este numele studentului;
 Anul_absolvirii ;
 Domeniu_Job: domeniul în care lucrează în momen tul întocmirii tabelei ;
 Funcția_ocupată ;

d) Tuplul: Elementele unei relații sunt numite tupluri și sunt caracterizate ca
fiind linii le dintr -o tabel ă, dar fără să fie caracterizate printr -un nume. Numă rul
tuplurilor și al atributelor dintr-o tabelă nu are importanță.

În tabela 1.1 identificăm 3 tupluri, adică 3 elemente ale produsului cartezian.

Studenți = { ( 1, „Mocanu Daniel‟, 2008, „IT‟, „manager‟), ( 2, „Cornea Geanina‟, 2007,
„Economie‟, „consultant‟),( 3,‟ Ștefănescu Dragoș‟, 2013, „Inginerie E lectrică‟,
„asistent‟) }

e) Cheia unei relaț ii: este o mulțime minimal ă de atribute care îndeplinesc
rolul de indentificare a unui tuplu în mod unic. Cheile unei relații pot fi de mai multe
tipuri:

 Supercheie: este o coloană sau o mulțime de coloane care identifică în mod
unic un tuplu. Desigur că se preferă la o mulțime cât mai mică de coloane care să
alcătuiască o supe rcheie.

De exemplu tabela Formațiuni_studiu, are coloanele Id, Denumire și
Id_parinte.

Formatiuni_studiu = {(1, ‟I A‟, 0), (2, ‟grupa 1311‟,1),(3,‟grupa 1312‟,1), (4,‟subgrupa
1311a‟,2) , (5,‟subgrupa 1311b‟,2) , (6,‟subgrupa 1312a‟, 3) , (7,‟sungrupa 1312b‟,3) };

Combinația de id si id_parinte poate fi supercheie deoarece determină în mod
unic tuplu. Desigur, în acest caz cel mai indicat ar fi să alegem doar id ca supercheie
deoarece este unic, incrementat consecutiv, pentru fiecare tuplu.

 Cheie candidat : este o supercheie formată dintr -o singură coloan ă care
determină în mod unic un tuplu. Această cheie mai poartă și numele d e cheie minimală.

Tabela Săli este formată din Id și Denumire.
Sali = {(1,‟CB 106‟),(2,‟BN 113‟),(3,‟AN 2006‟)};

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 proie ctează tabela, cu
scopul de a i dentifica și accesa cu ușurință tuplurile. Domeniul cheii primare este
considerat și el ca fiind un domeniu primar.

Tabela 1.2.2

În cazul acesta, cheia primară este id -ul deoarece operațile de manipulare se
pot face mult mai accesibil apelând id -ul. Fiind unic pentru fiecare tuplu nu există riscul
de identificare gresită a unui profesor.

 O cheie primară poate fi reprezentată dintr -o singură coloană și atunci ea se
numește cheie simplă. În cazul în care este alcatuită din mai multe coloane, poartă
numele de cheie compusă.

Un exe mplu de cheie compusă este tabela de Defalcare_ore:

Id Id_formațiune Id_profesor Tip_oră Disciplină
1 2 25 C Analiză numerică

Tabela Defalcare_ore

În tabela Defalcare_ore o cheie candidat dar nu cheie primară este formată din
Id_formațiune, T ip_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ă combinație de coloane determină în mod unic un tuplu.

 Cheie străină : este o cheie canditat care nu a fost definită de proiectant cu
scopul de a identifica și accesa tuplurile. Cheile străine acceptă valoarea nulă cu condiția
ca pro prietatea de unicitate să r ămână viabilă. Id Nume Profesor Prenume Profesor Departament
1. Tudorache Cristina Matematică 1
2. Dumitru Ioana Matematică 2
3. Cazac Iulia Fizică

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 : mulțimea de atribute în care identificăm numele studentului nu poate fi cheie
într-o tabelă, deoarece este posibil ca în tabela 1.1 să regăsim în tupluri diferite același
nume.

– Anul_absolvirii : acest atribut nu este unic pentru că, în mod evident, într-o tabelă de
acest ti p, anul absolvirii coincide pentru toți studenții care au terminat în acee ași
promoție.
Din acest motiv nici un alt atr ibut nu este cheie în tabela 1.1 fiindcă nu
identific ă în mod unic tabela.

1.2.2 Restricții ale modelul ui relațional

Restricțiile de integritate sunt măsuri luate pentru siguranța, stabilitatea și
corectitudinea datelor, măsuri interne care nu sunt cu noscute de către utilizator și care
verific ă coerența în raport cu lumea reală . Acestea se pot c lasifica în dou ă categori i:

1) Restricții de integritate structurale:

-restricția de unicitate a cheii: reprezintă restricția care co nstrânge ca o relație
să nu permită egalitatea valorii atributului cheie pentru diferite tupluri.

Olteanu Alexandru 12
-restricția referențial ă: prevede că într -o relație R care se referă la relația P ,
asocierea cheii externe trebuie s ă fie o cheie primară sau să i se atribuie valoarea nulă,
adică neprecizată.

-restricția entit ății: reprezintă restricția care prevede că într -o relație R cheia
primară a tuplurilor nu trebuie să aibă valoarea “null”.

2) Restricții de integritate comportamentale : sunt restricții impuse facultativ de
utilizatoru l sau administratorul bazei de date, și ele pot fi:

-restricții cu privire la domeniu: poate fi stabilit un interval de valori între care
atributele dintr -o relație să se regăsească având atribuite valori din acesta .

-restricții temporale;

1.2.3 Procedeul de normalizare al relațiilor

Procedeul de normalizare al unor tabele presupune spargerea acestora în doua
sau mai mult e tabele pentru a satisface anumite restricții, forma finala a tabelei purtând
numele de forma normală(NF – normal form). În funcție de complexitatea seturilor de
reguli pe care le respectă tabela poate fi încadrată la o anumită formă. O formă
superioară verifică setul de reguli ale tutror celor precedente ei.

Formele normale se referă în principiu la relații, da r, putem spune ca o bază de
date este într -o NFi daca toate relațile care alcătuiesc baza sunt în forma NFi.

1.2.3.1 Prima formă normală (NF1)

O relație este în forma normală unu dacă:
– nu admite ca în componența ei sa existe 2 tupluri identice.
– nu admite valori multiple, fiecare câmp trebuie să fie atomic.
– nu admite valori nule ale câmpurilor.

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, presupunând ca fiecare student este
înscris la o singură facultate este:

1.2.3.2 A doua formă normală (NF2)

Pentru ca o relație sa fie in forma normală doi, trebuie sa respecte forma
normală unu și sa admita:
– ca orice atribut n e-prim (non -cheie) din relație să fie dependent funcțional de
atributul cheie.

O relație R care are atributul cheie x și atributul ne -prim y al aceleiași relație,
este NF2 dacă orice valoare a atributului y in corespunde o valoare unica a atributului x.

1.2.3.3 A treia formă normală (NF3)

O relație este in forma normală trei, daca respectă condițiile impuse de NF2 și
NF1 și în plus:
– Orice atribut ne -prim al unei relații trebuie să depindă direct(ne -tranzitiv) de
atributul cheie al relației respective.

Olteanu Alexandru 14
Daca în relația A are atribute cu numele șefilor de promoție al fiecarei facultați,
în anul 2014 și orașul din care fac parte, atunci atributul oraș depinde în mod tranzitiv de
atributele supercheii, numele și facultatea.

1.2.3.4 Formă normală Boyce -Codd(BCNF)

Forma norma lă BCNF impune orice atribut x de care sunt dependent e alte
atribute trebuie sa fie o cheie candidat.

1.2.3.5 A patra formă normală (NF4)

O relație este în a patra forma normală dac ă respect ă forma normală 3 și
conține cel mult o dependența multivaloare.

Într-o relație de tip Orar cu atribute ca sala, ora, profesor, locație, student și
anul de studiu putem exemplifica dependența multivaloare.

– Cursul este ținut de un profesor.

– La o anumită oră și locație un pr ofesorul se poate afla doar în acea sală de curs.

– Studentul urmează cursul destinat anului său de studiu.

– Studentul se poate afla la o anumită oră și locație doar la un curs.

Rezultă ca există o dependența multivaloare a cursulu i cu ora și locația, a dică
unui curs i se asociază o sală și un interval orar care nu depind de alte informații din
tabelă.

1.2.3. 6 A cincea formă normală (NF5)

O relație se află in forma normală cinci dacă respectă toate formele normale
inferioare și în plus:
– candi dații cheie al relației trebuie sa genereze fiecare dependența joncțiune.

A patra, a cincea și respectiv a șasea formă normală enunță noțiuni mai
generale, dar datorită seturilor complexe de reguli ce trebuiesc îndeplinite simultan de o
relație, în prac tică sunt destul de greu de întalnit.

Olteanu Alexandru 15
1.3 Sistem de gestiune al bazelor de date: PostgreSQL

PostgreSQL este un sistem open -source de gestionare a bazelor de date
compatibile cu limbajul standardizat de interogare SQL .Sistemul este disponibil în mod
gratuit, beneficiind de suport fina nciar și teh nic din partea mai multor companii, acestea
sponsorizând de zvoltatorii sau oferind soluții hardware. Termenul “open -source” de scrie
dezvoltarea sub licență li beră permițând, astfel , ca orice utilizator s ă poată accesa codul
sursă.

Sesiunea Postgres folosește modelul server -client, fiind alcatuit ă din:

 proces de supervizare de tip daemon (postmaster) ;

 aplicație pe care utilizatorul o folosește pentru utilizarea serviciilor SQL ;

 procesul postgres, forma t din unul sau mai multe servere backend.

1.3.1 Manipularea bazelor de date. Limbajul SQL

Tabelele stocate într -un sistem de gestiune cum este PostgreSQL, sunt entități
logice asemănătoare cu relațile reprezentate la Tabela 1.2.1 și Tabela 1.2.2. Grafic se
păstreaza și reprezentarea sub formă de tabel, iar coloanele tabelului sunt cămpurile
relației iar lin ile corespund înregistrărilor.
Primul pas pentru crearea unei baze de date este definirea tabelelor și a
tipurilor de date utilizate în aceas ta. În PostgreSQL se pot o listă întreaga de date, cum
ar fi:

– bytea : este un tip de dată ce stochează o valoare binară

– int8: stochează un număr întreg ce se poate scrie pe 8 octeți de memorie (un numar
întreg între 0 și 255)

 Sintaxă:

Olteanu Alexandru 16

– boolean: este o înregistrare logica, având doua posibilitați (true/ false) ;

– character[(n)]: un șir de caractere cu un numar fix de caractere n

– character varying [(m)]: un șir de caractere cu finit de caractere n ;

– real: real cu precizie simpla ;

– double precision : este un numar real cu precizie dublă, pana la 15 octeți ;

– integer: un numar întreg, care are și semn ;

– serial: autoincrementare cu valori stocate pe 4 octeți ;

 Sintaxă:

– bigserial: autoincrementare cu valori stocate pe 8 octeți;

– text: este un șir de caractere cu lungime variabilă;

Relațiile dintr -un sistem de baze de date respectă acelea și reguli de
normalizare. În proiectarea acestora, administratorul, de regula ține cont de regulile de
normalizare descrise la NF3.

Olteanu Alexandru 17
1.3.1.1 Construirea și crearea relațiilor

Relațiile sunt obiecte componente ale unei baze de date, astfel , pentru a costrui
tabele trebuie, în prealabil, să creăm o bază de date. De regulă orice sistem de gestiune
oferă doua modalitați de construire a un ei noi baz e de date:

– fie printr -o interfaț ă grafică prin care s electăm Create Databases, și introducem
numele ce îl va purta baza de date

– fie prin programare efectiva, cu ajutorul unui SQL de creare a bazei.

Exemplu : drop database if exists ‟db_na me‟
create database ‟db_name‟ ;

Prima linie verifică dacă în sistemul de gestiune există baza de date cu numele
db_nume și daca există o va sterge. Apoi crează baza de date cu numele db_name.

Pentru a crea și relații în baza de date avem tot doua posibilitați. Prin tabul din
meniu care, prin apasarea lui, generează o nouă relație, noi fiind nevoiți sa inserăm
numele tabelei și numărul de atribute sau prin SQL. Un exemplu pentru SQL -ul de
creare al unei relații este:

Olteanu Alexandru 18
Unde numele tabelei relației care va fi creată este scris în ghilimele și este
”Programare_ore ”. Scriptul scris crează și atribut ele relației, și stabilește tot odată și tipul
datelor.

Tot în acest exemplu putem identifica și constrângeri ale sistemul ui de
gestiune. Atributul Id este declarat ca f iind primary key , adică nu permite înregistrări cu
valorea nula sau înregistrări duplicat și este declarat de către utilizator cu numele
pk_loc_timp. Atributel e ”Id_loc_timp” și ”Id_defalcare” au constrângeri de tip foreign
key. ”Id_loc_timp” este o referință la cheia primară din relația ”Loc_timp”, iar atributul
”Id_defalcare” este referință a cheii primare din relația ”Defalcare_ore”.
Duplicarea id -ului este asigurată de instrucțiunea ‟SERIAL‟.
Atributele declarate ca integer sunt numere întregi și nu admint valoarea nulă.

Alte constrângarei în PostgreSQL sunt:

 NOT NULL: nu admit valori nule in relații.

 UNIQUE: această constrângere nu permite duplicarea tuplurilor în relație.

 FOREING KEY: costrânger ea presupune ca atributul astfel definit să aibă o
valoare identică în tabela de legătură, valoare ce trebuie sa fie unică sau cheie
primară.

 Sintaxă:

Olteanu Alexandru 19
În această relație atributul Id_loc_timp este o cheie străina, definită astfe l de
utilizator cu numele fk_loc_timp (FOREIGN KEY). În script este precizată și relația la
care face referire cheia, ca fiind atributul Id din relația “Loc_timp”.

 CHECK: această costrângere elimină valorile ce nu satisfac unele condiții logice.

1.3.1.2 Interogarea bazei de date.

Interogarea bazei de date se efectuează prin apelarea instrucțiunii SQL
SELECT. PostgreSQL este case sensitive în ceea ce privește numele relaților, dar în
ceea ce privește instrucțiunile, ele se pot scrie atât cu litere m ici sau cu litere mari, dar
de preferat este să pastrăm sistemul de scriere pe tot parcursul codului. Instrucțiune se
pot scrie pe mai multe rânduri. Se recomandă folosirea majusculelor și scrierea pe mai
multe rânduri pentru o vizibilitate mai bună.

Instrucțiunea selectează valoarea câmpului ‟Denumire‟ din tabela ‟Ore‟ unde
‟Id-ul‟ tuplului este egal cu 1. Daca id -ul nu există instrucțiunea va intoarce o eroare.
Această instrucțiune poate întoarce un rezultat ordonat dupa valoarea unui
anumit atribut.

Instrucțiunea ”SELECT * ” întoarce valoarea tuturor atributelor din tabelă, iar
instrucțiunea ORDER BY ordonează în mod crescator rezultatul interogări dupa
valoarea atri butului Id.

Rezultatul interogării se poate grupa în funcție de valoarea unui atribut. Daca
valoarea unui atribut este aceeași pentru mai multe tupluri, atunci instrucțiunea grupează
valorile rezultatului , valorile identice ale atributului fiind succesive.

Olteanu Alexandru 20
Instrucțiunea anterioară selectează din tabela ”Profesori” numele profesorilor și
ii grupează dupa denumirea departamentului

1.3.1.3 Popularea bazei de date.

Dupa crearea bazei de date și a tuturor relațiilor putem manipula efectiv
valorile din tabele cu ajutorul unor instrucțiuni SQL care ne permit inserarea,
modificarea sau ștergerea de date.

Popularea efectivă a bazei de date se poate realiza prin două moduri:
– fie cu instrucțiunea INSERT;
– fie cu instruc țiunea COP Y

a) Inserarea unei înregistrări în baza de date cu instrucțiunea INSERT se
realizează astfel:

Tabela ”Facultăți” este populată cu 16 tupluri, formate din 2 coloane. Id -ul este
primary key si este de tip integer, iar Denumirea facultați es te 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 fiecărui id în parte.

Olteanu Alexandru 21

Dacă în scriptul de ins erare nu declarăm toate coloanele și cele omise nu sunt
setate să se autoincrementeze sau să poată lua valoarea NULL atunci sistemul de
gestiune va da eroare.

b) Instuc țiunea COP Y prevede ca în scr iptul de populare să scrie calea către un
fisier de pre ferat de tip .csv ( Comma -separated values ), adică un fișier în care coloanele
sunt separate prin virgulă.

COPY ”Profesori” FROM ‟C: \Documents and Settings \User \Profesori.csv‟ with csv ;

Tot în scriptul de copiere se mai specifică și:

– NULL: specifică faptul că șirul poate avea și valoarea null, adică intre doi
delimitatori te tip virgulă nu există nimic.

– CSV: specifică tipul fișierului din care se adaugă datele.

– HEADER: anunța sitemul de gestiune ca primul șir de caractere denumește
nume le coloanei.

– DELIMITER: specifică dacă se folosește un alt delimitator fată de cel implicit,
virgula.

1.3.1.4 Ștergerea valorilor din relații.

Instrucțiunea de ștergere a unei relații este DELETE. Se poate șterge toată
tabela, sau doar un tupl u.

Daca nu se sepecifică o condiție de ștergere, atunci sitaxa DELETE FROM
name, va șterge toate valorile din tabelă.

Pentru a putea distruge o tabelă sau o coloană din tabelă există instrucțiunea
DROP. Această instrucțiune nu doar sterge ci di struge coloana, tabela sau baza de date.

Olteanu Alexandru 22
1.3.1.5 Actualizarea valorilor din relații.

Pentru a putea actualiza o relație, trebuie ca acea relație sa existe și sa fie
populată. Instrucțiunea de actualizare este UPDATE.

Sintaxa de actualiza re este formată din:
– UPDATE : care definește ce procedură urmează să fie desfășurată urmată de numele
relației în care se va produce actualizarea.

– SET: stabilește în ce coloană se va face actualizarea.

– WHERE: este condiția care împreuna cu coloan a selectată precedent localizează
exact ce valoare urmează sa fie actualizată. De regulă condiția apelează cheia primară
pentru a putea localiza tuplu din care face partea valoarea ce trebuie actualizată.

1.3.1.6 Subinterogări ale relațiilor.

În ur matoarea sintaxă utilizatorul a folosit două subinterogări, “in” și “not in”

Daca interpretăm codul, acesta ar însemna:
– selectează denumirea orei din tabela “Ore” unde “id” orei se afla și în tabela
“Loc_timp” dar “id” de oră nu se află in tabela “Programare_ore”. Rezultatul va întoarce
o listă a orelor ce nu au fost programate.

Olteanu Alexandru 23
Alte subinterogări:

 EXISTS: aceasta este o instrucțiune binară, care întoarce ca rezultat true dacă
interogarea are cel puțin o înregistrarea ca rezultat, altfel intoarce false.
 ALL: verifică daca interogarea expresia satisface condițiile pentru fiecare
înregistrare

Olteanu Alexandru 24
Capitolul 2

Programare orientată obiect . Java

2.1 Java noțiuni introductive

În anul 1995 compa nia Sun Microsystems a lansat o tehnologie remarcabilă și
inovatoare denumită inițial OAK, ulterior Java, care s -a impus pe piața dezvoltatorilor
de software datorită calităților sale ,printre care :

 Portabilitatea: Java este un limbaj de programare indep endent, aplicațiile
dezvoltate putând fi rulate pe multe sisteme de operare, cum ar fi Windows,
Ubuntu, Mac OS, și chiar pe sitemele mobile de operare cum ar fi Android, iOS, fară
a fi nevoie de o recompilare.

 Orientat rea pe obiect: procedeul de programa re elimina programarea clasica,
procedura lă.

 Moștenirea C: este proiectat după modelul C și C++, de aceea utilizatorii care
sunt familiarizați cu C++ vor programa ușor în Java.

 Securitatea: Java verifică dinamic codul introdus pentru detectarea
eventua lelor probleme și are un set de reguli stricte pentru rularea proceselor la
distanță.

Dezvoltatorii Java au creat mai multe platforme de lucru pentru rezolvarea
problemelor aparute în diverse domenii printre care:

 J2SE Standard Edition, aceasta este platforma standard Java dedicată creări de
aplicații 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.

Aplicațile Java au un mediu de execuție numit mașina Java virtuală (JVM).

Olteanu Alexandru 25
2.2 Structura limbajului Java

Limbajul Java a fost proiectat sa lucreze cu setul de caractere binar Unicode,
un mo ștenitor al cosacratului ASCII , care, fiind programat să lucreze pe un singu r octet
putea să reprezinte maxim 256 de caract ere. Unicod poate reprezenta până la 65536 de
semne.
Ca orice limbaj de programare și Java are o serie de cuvinte cheie, majortatea
moștenite de la C++ . Asta înseamnă că în aplicați nu se pot folosi aceste cuvinte
deoarece ele definesc metode, clase, interfețe. Cateva din aceste cuvinte cheie sunt
enumerate in tabelul 2.1

Tabelul 2.1

2.2.1 Operatori și literali în Java

Constantele în Java poartă numele de literali. Aceștia pot fi de mai multe tipuri:

 Intregi(integer): literali întregi se pot scrie în trei baze: baza 8, baza 10 ș i baza
16 și pot fi de doua tip uri.
– normali: se reprezintă pe maxim 4 octeți

– lungi : se reprezintă pe maxim 8 octeți.
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

Olteanu Alexandru 26
 Flotanți( Floating Point ): sunt constante care au cel puțin o zecimală sau “f”,
“F” ca sufix pentru reprezentarea valorilor normale sau “d”,”D” ca sufix pentru
reprezentarea valorilor duble. Reprezentarea se face pe 32 o cteți pentru valorile normale
și 64 octeți pentru cele duble. Alaturarea literei “e” la o cifra reprezinta notație
exponențială.

Exemplu: 9.5, 9e8, 3d, 4F

 Literali logici(Boolean): este o înregistrare logica, având două posibilitați
(true/ false);

În exemplul de mai sus constanta logică este isInserted și are valoarea false la
începutul proceduri iar daca instrucțiunea merge , valoarea devine true. Spre deosebire
de limbajul C++, literali 0 și 1 nu sunt logici în Java

 Caracter(Character ): Literali de tip caracter sunt utilizați pentru a exprima
valorile din codul Unicode. Reprezentarea acestora se face printr -o literă sau o secvență
trecută între apostrofi, cum ar fi:

– ‟\b‟: secvență pentru tab orizontal;

– ‟\r‟: secvență pentru înc eput de rând;

– ‟\n‟ : secvență pentru linie nouă;

– ‟\f‟ : secvență pentru pagină nouă;

– ‟\” ‟ : secvență pentru ghilimele;

– ‟\ \‟ : secvență pentru backlash

Olteanu Alexandru 27

 Șiruri de caractere(String): Un șir de caractere este format fie din șirul v id,
declarat cu ghilimele și nimic între ele, sau din mai multe caractere sau secvențe de
caractere.

Operatorii Java sunt asemănători celor din C++, cu cateva deosebiri:

 Operatorul de atribuire: atribuirea în java se realizează cu semnul “=” .

 Operatori matematici: sunt operatori matematici clasici, cum ar fi +, -, *, /, dar
și operatori de auto -increment și auto -decrement, i++ respectiv i –;
Operatorul matematic + are rol și de concatenare a șirurilor.

Exemplu: String h1 = ”Orarul”;
String h2 = ”este”;
String h3= ”provizoriu”;
System.out.println(h1 + h2 + h3 );
Sintaxa System.out.ln(); afișază în consolă rezultatul concatenări.

 Operatori organizați la nivel de octet: &(and), ||(or), !(not);

 Operatorul if -else: este expres ia logic dacă condiția este îndeplinită returnează
de exemplu true, altfel false.

Comentarile în Java dau posibilitatea utilizatorilor să poată nota direct în cod o
observație sau o indicație cu privire la cod. În funcție de marimea paragrafului com entat
se pot nota astfel:

 La nivel de rând comentariile încep cu //. Cele două caractere transformă tot
ce se află pe același rând în secvență de comentariu, asta î nseamnă că în momentul
compilări programul nu ține cont de aceste secvențe.

 Secvențele care su nt mai mari de un rând se pun î ntre /* la începutul
paragrafului și */ la sfârșitul paragrafului comentat.

Exemplu:

Olteanu Alexandru 28

2.2.2 Declararea și inițializarea variabilelor

Variabilele sunt mărimile care pot lua diferite valori în timp. În Java variabilele
trebuie declarate și inițializate pentru a putea lucra cu ele. Declararea implică
specificarea tipului variabilei și a numelui pe care îl are. Inițializarea presupune
atribuirea unei valori și se realizează cu ajutorul operatorului matematic de atribuire =
.O valoare poate fi constantă dacă declararea se face stipulând sintaxa “final” înaintea
tipului de variabilă.

Exemplu: – declararea unui șir de caractere: String a;

– inițializarea unui întreg: int b = 0;

-declararea unui întreg constant: final C = 12;

Convențional sa stabilit ca variabilele finale constante sa fie declarate cu
majuscule, iar restul cu litere mici. Dacă variabilele conțin mai multe cuvinte în numele
lor, primul ato m lexical se scrie cu literă mică iar urmatorii atomi cu prima literă mare.

Exemplu: string numeProfesor ;

Declararea variabilelor se poate face în mai multe locuri din cod, astfel
variabilele sunt de mai multe tipuri:

 variabile declarate la nive l de clasă, sunt vizibile pentru toate metodele clasei.

 variabile locale declarate la nivelul metodelor și parametri metodelor sunt
vizibile doar la nivelul metodelor.

 se pot declara variabile și doar la nivelul unui bloc cod, iar acea variabilă este
cunoscută de program doar la nivelul acelui bloc.

Exemplu de vari abilă declarată la nivel de cod:

Olteanu Alexandru 29

2.2.3 Vectori

Vectorii ca și varibilele, pentru a putea opera cu ei trebuie declarați și
inițializați. Declararea vectorilor seamana cum cea a variabilelor, doar că dupa ce
alegem tipul vectorului trebuie adăugată sintaxa [] și apoi numele vectorului.

Exemplu: String[ ] numeVector;

Inițializarea vectorului se realizează prin alocarea memoriei prin intermediul
sitaxei new.

Exemplu: numeStudenti = new String[numărul de elemente],

unde numărul de elemente reprezintă maximul de elemente ce le poate avea vectorul.
Pentru a afla numărul de elemente se poate folosi sintaxa length

Exemplu: int[ ] c = new int[20];
a.length întoarce valoarea 20;

2.3 Programare orietată -obiect

2.3.1 Obiecte

Programarea orientată -obiect, înseamnă lucrul cu obiecte create în limbajul de
programare. Crearea obiectelor realizează prin declararea, instanțierea și inițializarea
obiectului.

a) Declararea obiectului: se realizează prin specificarea clasei acestuia.

b) Instanțierea: presupune alocarea de memorie pentru crearea efectivă a
obiectului cu sintaxa new.

c) Inițializarea: se realizează cu ajutorul constructorilo r din clasă.

Odat ă creat obiectul se pot afla informați despre el, se pot schimba stările
obiectului sau se pot executa acțiuni. Accesul la valorile variabilelor unui obiect depind
de drepturile oferite de clasa din care face parte obiectul. Apelarea m etodelor unui
obiect se realizează prin aplicarea unui punct dupa numele obiectului.

Olteanu Alexandru 30

Exemplu: Rectangle dreptunghi = new Rectangle(0,0,50,70);
dreptunghi.setLocation(15,15);
dreptunghi.setSize(100,150);
System.out.println( dreptunghi .height);
Unde: – prima linie de cod atribuie obiectului dreptunghi o metoda clasa Rectangle cu
originea în 0 iar dimensiunile inițiale sunt 50 lațimea și 70 înalțimea.

-sintaxa setLocation schimbă originea obiectu lui dreptunghi în locația (15,15)

-setSize schimbă dimensiunile dreptunghiului de la (50,70) la (100,150).

-sintaxa System.out.println(dreptunghi.height) tipărește în consola programului
dimensiunea înalțimi dreptunghiului.

2.3.2 Clase

Moda litatea de a introduce tipuri noi de date într -o aplicație Java este fie prin
intermediul claselor, fie prin intermediul interfețelor.
Pentru a declara o clasă trebuie pentru început sa specificăm modificatori clasei
și anume:

 O clasă declarata public va putea fi folosită de clase indiferent de pachetul
în care se află.
 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 așteaptă 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
mulțime de sublcase dar numai o singură clasă pe care o moștenește, 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.

Exemplu de declararea al unei clase:

// Corpul clasei

Corpul unei clase conține:

a) variabile de clasă declarate și inițializate

b) declararea constructorilor

c) declararea, daca e cazul, al unor clase interne.

d) metodele clasei.

Constructorii poartă același nume ca și clasa din care fac parte, aceștia sunt metode
specifice pentru acea clasă cu rol de inițializare a obiectelor.

2.3.2.1 Clasa Object

Toate clasele din Java moștenesc clasa Object, orice obiect fiind descedent al
acestei clase direct sau indirect.
Fiind clasa fără nici un pă rinte punem spune că definește standardul de
comportament comun al subclaselor ei, cum ar fi:

 posibilitatea de a testa egalitatea valorilor obiectelor.

 returnează clasa din care un obiect face parte.

 specifică reprezentarea sub formă de șir a obiectului;

Olteanu Alexandru 32
Subclasele lui Object po t folosi metodele acestuia, și le pot înbunătăți 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
afișeze un șir de obiect e.

2.3.3 Excepții

Excepțiile sunt evenimente ce produc întreruperea unui program în timpul
execuției. Ele pot sa apară din vari i motive, fie elementele unui șir declarat sunt mai
multe decat numărul cu care a fost inițiat, 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 pregătească inserarea unor valori într -o relație dintr -o bază de
date. Daca conexiunea e realizată atunci codul nu va întoarce eroare, altfel va genera o
eroare SQL.

Olteanu Alexandru 33

2.3.4 Pachetele standard în Java

Pachetele sunt o colecție de interfețe și clase apropiate ca utilitate. Clasele sunt
organizate în pachete pentru a eficientiza găsirea și utilizarea lor, pentru a nu apărea
conflicte cu privire la numele claselor.

Pachetele standard cele mai importante în Java sunt:

– java.lang: este pachetul ce conține clasele de bază ;

– java.io: pachetul ce conține clasele responsabile de intrări/ieșiri și lucrul cu fi șiere;

-java.awt: pachetul cu clase folosite pentru crearea interfeței grafice cu utilizatorul ;

-java.awt.event: tratarea evenimentelor produse de utilizator;

-java.applet: pachetul ce conține c lase de dezvoltare a appleturilor;

-java.sql: clasele ca lucrează cu baze de date;

-java.net: clasele de programare în rețea;

-java.math: pachetul ce lucrează cu operații matematice complexe ;

-javax.swing: pachetul cu clase îmbogățite folosi te pentru crearea unei interfețe
grafice, cu utilizatorul.

Pentru a putea folosi un pachet într -un cod, acesta trebuie importat.Importul se
realizează prin scrierea sintaxei import și numele pachetului înaintea declarării clasei, la
începutul fișierul ui sursă.

Exemplu

Olteanu Alexandru 34

2.3.5 Gestionarea și generarea interfeței grafice cu utilizatorul

Crearea intefeței grafice se realizează cu ajutorul pachetului javax.swing . Acest
pachet este mult îmbogățit estetic și funcțional fața de predecesor ul său java.awt .
Pachetul pune la dispoziție sute de interfețe și clase.Setul componentelor GUI puse la
dispoziție de tehnologia Swing, a fost unul din marile schimbări fața de tehnologia
predecesoare, swing punând la dispoziție 17 pachete:

Componentele pachetului swing pentru crearea interfețelor poti fi grupate
astfel:

-Componente atomice: JLabel, JCheckBox, JRadioButton, JButton, JScrollBar.

-Componente de editare text: JTextPane, JTextField, JPasswordField,
JFormattedTextField;

-Meniuri: JMenu, JPopupMenu, JMenuBar, JRadioButtonMenuItem, JMenuItem;

-Componente complexe: JTree, JTable, JList, JComboBox;

-Containere intermediare: JPanel, JSplitPanel, JScrollPane, JTabbedPane, JTollBar,
JDesktopPane;

-Containere complexe: JFrame , JApplet, JDialog ,JWindow.

2.3.5.1 JPanel

JPanel reprezintă containerul intermediar pentru interfața 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 poziționare lm se declară JPane l(LayoutManager lm).

2.3.5.2 JLabel

JLabel reprezintă etichetele din Java, etichete ce nu pot fi suprascrise sau
selectate în momentul rulări programului. Acestea au rol informativ pentru utilizator,
deoarece în etichete se pot insera atat câmpuri t ext cu descrierea acțiuni ce trebuie
urmată sau imagini.

2.3.5.2 JButton

JButton face parte din clasa AbstractButton, și funcționalitatea 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
câmpuri text cu descrierea acțiuni pe care o generează la apasare, dar și imagini, care pot
apărea în diferite momente ale butonului, cand acesta este apăsat sau eliberat.

2.3.5 .3 JComboBox

JFrame este containărul de nivel înalt cel mai des folosit pentru aplicațile
bazate pe tehniologia Swing. Componentele pachetului Swing se poziționează în
interiorul containărului.

Componenta JComboBox este o combinație între u n 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 inițializat dintr -un vector, sau folosind un
model dat explicit de tip ComboBoxModel.

Exemplu JComboBox:

JComboBoxSala este programat să listeze toate sălile din baza de date. Componenta
JComboBox este declarată automat de programul NetBeans, utilizatorul fiind nevoit
doar să inițializeze 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 folosește la listarea unor obiecte dintr -o bază de date și are posibilitatea
selectări unui astfel de obiect cu ajutorul metodei jTable1MouseClicke d din clasa
moștenita java.awt.event.MouseEvent

Exemplu

2.3.6 Conexiunea la o bază de date (JDBC)

JDBC(Java DataBase Conectivity) este interfață de programare dezvoltată
pentru accesul la o bază de date , care oferă posibilitatea dezvoltato rilor să lucreze direct
cu instrucțiuni SQL. Codul sursă scris pentru a manipula o bază de date în Java este
portabil indiferent de SGBD, fiind nevoie doar de driverele potrivite pentru fiecare
sistem în parte.

Pe scurt JDBC este capabil să realizeze co nexiunea cu baza de date, să
manipuleze baza cu secvențe sql standard și este capabil să efectueze și prelucrarea
datelor ce se întorc din baza de date.

Pentru ca o aplicație să se poată conecta la o bază de date, primul pas este
înregistrarea unui dr iver. Acest lucru se face prin încarcarea unor clase, cum ar fi:

-Class.forName: această clasă apelează funcția ClassLoader

Class.forName(”sun.jdbc.odbc.JdvcOdbcDriver”);

– DriverManager

Olteanu Alexandru 37

import java.sql.DriverManager;

Nu există o restricți e al numărului de drivere importate în mașina virtuală Java,
de aceea specificarea căii URL JDBC unui sistem de gestiune este necesară. Sintaxa
generală de specificare a căii este jdbc.<subprotocol>:<nume>. De exemplu, pentru
folosirea unui sistem de gesti une PostgreSQL calea arată astfel:

După înregistrarea driverului, conexiunea cu baza de date se realizează prin
metoda GetConnection din clasa DriverManager.
Stabilirea conexiuni folosind un driver PostgreSQL.

Unde: – numele driverului folosit este declarat pe a doua linie de cod;

– userul și parola pentru conectarea la baza de date din PostgreSQL sunt
inițializate sub stringul user și password;

Olteanu Alexandru 38
– în url sunt trecute calea catre serverul local și numele bazei de date la care
trebuie aplicația sa se conecteze.

2.3.6.1 DAO (Data acces objet)

DAO este un obiect ce are o interfață de programare pentru a acesa datele
stocate în diverse sisteme de gestiune al bazelor de date. Ca urmare, DAO nu depinde de
sistemul de gestiune, codul odată scris putând fi folosit pentru a accesa datele din
diverse siteme.

DAO folosește secvențe SQL pentru a interacționa cu baza de date.Tuplurile și
atributele din baza de date sunt create în Java sub forma unor obiecte, fiecare tuplu și
atribut fiind privit ca un array de obiecte. De aceea DAO manipulează datele din tabele
cu ajutorul metodelor definite în Java, cum ar fi getA sau setA.

2.3.6.2 Interfețe SQL în Java.

2.3.6.2.1 Interfața Statement

Metodele inter feței Statement transmit secvențe SQL către baza de date și
astfel oferă suport pentru două subinterfețe PreparedStatement și CallableStatement.
Metodele interfeței Statement sunt:

 executeQuery: această metodă realizează interogări ale bazei de date p rin
secvența SQL SELECT. Rezultatul inrerogări este de tip tabel și conține 1 sau mai
valori ale coloanelor în funcție de sintaxa SQL.

Exemplu :

Olteanu Alexandru 39
unde, în acest exemplu instucțiunea SQL întoarce toate valorile din tabela
Formațiuni_studiu pe ntru care Id_parinte este egal cu 0.

 executeUpdate: metoda realizează actualizări ale datelor (INSERT, DELETE,
UPDATE) sau asupra structurii bazei de date(CREATE, ALTER,DROP).

Exemplu:

 execute : este o metodă care întoarce un rezultat format d in mai multe obiecte.

2.3.6.2.2 Interfața Prepared Statement

Metoda PreparedStatement “pregătește” secvențele sql ce vor trebui executate.
În această metodă se pot seta mai mulți parametri de intrare, fiecare fiind înlocuit în
secvența SQL cu un se mn al întrebari, ulterior fiind nevoie să se specifice o valoare
pentru fiecare parametru.

Obiectului de tip PreparedStatement se crează cu sintaxa preparedStatement și
se specifică o secvența SQL. Execuția unui obiect de acest tip se face prin aceleași
metode ca la obiectele de tip Statement.

Exemplu:

în acest exemplu, prepareStatement pregatește conexiunea la baza de date.

Olteanu Alexandru 40

2.3.6.2.3 Interfața ResultSet

Orice interogare executată corect SQL a unei baze de date, întoarce un rezu ltat
reprezentat cu ajutorul unui obiect de tip ResultSet. Obiectul conține rezultatul
interogări sub forma unui tabel cu un număr de linii și coloane diferit în funcție de
secvența SQL și consistența bazei de date.

În exemplul de sus, ob iectul de tip ResultSet poarta numele de results, și
afișează valorile selectate din tabela Profesori. Extragerea efectivă din tabelă a valorilor
se realizează parcurgând linie cu linie tabela folosind metode de tipul getB, unde b este
tipul de dată din tabelă. Numerele din paranteză semnifică coloană în care se află tipul
de dată în tabelă.
Un exemplu de valori din tabela Profesori după execuția secvenței SQL este:

Id Nume Id_dep
1 Popescu Marian 42

Olteanu Alexandru 41

Capitol ul 3

Aplicația de asistența de întocmire a orarului

3.1 Descrierea aplicației

Aplicația 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 secvențe sql în Netbeans, a fost necesară folosirea unui
driver JDBC numit postgresql -9.1-901.jdb c4.

Baza de date a fost concepută plecând de la ideea că publicul țintă al aplicației
sunt secretariatele facultăților, care la începutul fiecărui an universitare trebuie să
întocmnească pe baza planului de învațământ notele de comandă și orarul. Pentr u ca
întocmirea orarului sa fie corectă trebuie avut în vedere eventualele probleme ce pot
apărea în momentul programării pe săli și zile atât formațiunile de studiu cat și
profesori.

Setul de reguli de care o aplicație de asistare a întocmiri orarului trebuie sa țină
cont în momentul în care utilizatorul încearcă sa programeze un câmp din orar este:

– formațiunile de studiu pot fi programate o singură dată pe un interval orar. Daca
există formațiuni ce au sub -formațiuni de care depind, cum ar fi anul, grup, semigrupa,
atunci nu se pot programa pe același interval orar și formațiuni și subformațiuni.

– profesori nu pot fi programați să țină doua discipline în același timp.

– daca o sală a fost programată pentru o formațiune la un anumit interval or ar, atunci
acea sală nu este disponibilă pentru nici o altă formațiune în același interval.

Interfața grafică creată a fost proiectată pentru a fi în primul rând intuitivă,
partea estetic ă fiind pusă pe locul 2.

Olteanu Alexandru 42

3.2 Structura bazei de date

Baza de date este formată din 14 tabele distincte, fiecare fiind proiectată pentru
a asigura integritatea și optimizarea informației. Scriptul de crearea al bazei de date este
redat în totalitate în subcapitolul A nexe, la punctul 3.4 .1
Tabelele au următoarele roluri:

– Profesori: este tabela de gestiune pentru profesori.
– Ore: gestiunea intervalelor orare
-Zile: gestiunea zilelor saptămâni
– Sali: gestiunea salilor alocate pentru o anumită facultate.
-Mod: gestiunea parității
-Formatiuni_studiu: gestiunea anilor, grupelor, subgrupelor.
-Planuri_scolarizare: Planurile de scolarizare pentru fiecare an.
-Loc_timp: tabelă de legătură între ore, zile și săli.
– Departamente: gestionarea departamentelor.
– Facultați: gestionare a facultaților;
-Detalii_plan_scolarizare: gestionarea tuturor informațiilor dintr -un plan de
scolarizare
-Defalcare_ore: tabelă de legătura între profesor, disciplină, tipul orei, numărul de ore.
-Asociere_an_plan: tabelă de legătură între, tabela de f ormațiuni și tabela de planuri.
-Programare_ore: tabela de gestiune a programarilor orarului.

Olteanu Alexandru 43

3.2.1 Prezentarea tabelelor:

Caracteristici generale ale tabelelor:
 toate coloanele ”Id” ale tabelelor sunt chei primare și sunt declarat ca serial,
adică au proprietatea de autoincrement .
 Sirurile de caractere sunt declarate ca fiind charachter varying de diferite
lungimi în funcție de ce rol are acel șir în aplicație.

a) Tabela Profesori:

Tabela Profesori este formată din 3 coloane:

-Nume: coloana în care se regăsesc numele și prenumele profesorilor ..

-Id_dep: este o cheie străin ă (foreign key) , adică, este cheia de legătură cu
cheia primară din tabela Departamente.

b) Tabela Ore:

Tabela Ore este formată din 2 coloane:

Olteanu Alexandru 44

-Denumire : este coloana declarat ă ca șir de caractere cu lungimea 10 și în ea
se vor stoca intervalele orare, de exemplu ”13 -14”;

c) Tabela Zile:

Tabela Zile este formată din 2 coloane:

-Denumire : este coloana declarată ca șir de caractere cu lungimea 10 și în ea
se vor stoca intervalele denumirea zilelor, de exemplu ”Luni”, ”Marți”;

d) Tabela Formatiuni_studiu:

Tabela Formațiuni de studiu este formată din 3 coloane:

-Denumire : este coloana declarată c a șir de caractere cu lungimea 10 ș i în ea
se vor stoca denumirea fiecărei formațiuni de studiu , de exemplu ” Anul I ”,”Grupa
1331” ;

-Id_parinte: Grupele sunt copii anilor, iar subgrupele sunt copii grupelor, deci
fiecare formațiune de studiu are un id pa rinte în funcție de parintele lor, numai anii nu
au nici un parinte.

Olteanu Alexandru 45

e) Tabela Facultati:

Tabela Facultați este formată din 2 coloane:

-Denumire _facultate: este coloana declarată ca șir de caractere cu lungimea
80 și în ea se vor s toca denumirea facultaților din UPB, de exemplu ”Stiințe Aplicate”;

e) Tabela Departamente :

Tabela Formațiuni de studiu este formată din 3 coloane:

-Denumire _departament: este coloana declarată ca șir de caractere cu
lungimea 80 și în ea se vor stoca denumirea tuturor departamentelor UPB.

Olteanu Alexandru 46
-Id_facultate: este o cheie străină (foreign key) , adică, este cheia de legătură
cu cheia primară din tabela Facultați.

f) Tabela Sali:

Tabela Formațiuni de studiu este formată din 2 coloane:

-Denumire : este coloana declarată ca șir de caractere cu lungimea 20 și în ea
se vor stoca denumirea fiecărei săli din UPB sau, pentru a nu încarca foarte mult baza de
date, se vor stoca doar sălile alocate facultății care întocmește ora rul, de exemplu ”BN
113”;

g) Tabela Loc_timp:

Olteanu Alexandru 47
Tabela Loc_timp este formată din 5 coloane:

-Id_sala: este o cheie străină (foreign key) , adică, este cheia de legătură cu
cheia primară din tabela Săli.

-Id_zi: este o cheie s trăină (foreign key) , adică, este cheia de legătură cu cheia
primară din tabela Zile

. -Id_ora: este o cheie străină (foreign key) , adică, este cheia de legătură cu
cheia primară din tabela Ore

-Id_mod: este o cheie străină (foreign key) , adică, este cheia de legătură cu
cheia primară din tabela Mod.

g) Tabela Defalcare_ore:

Tabela Defalcare_ore este formată din 6 coloane:

-Id_formatiune: este o cheie străină (foreign key) , adică, este cheia de
legătură cu cheia primară din t abela Formatiuni_studiu.

-Id_profesor: este o cheie străină (foreign key) , adică, este cheia de legătură
cu cheia primară din tabela Profesori.

. -Tip_ora: este coloana ce precizează ce tip de oră este. Curs, Seminar,
Laborator și este declarată ca un șir de caractere de lungime 5.

-Disciplina: această coloană stochează denumirile materiilor.

Olteanu Alexandru 48

-Nr_ore: este coloana ce stochează numărul de ore al unui curs, seminar sau
laborator. Variabila este declarată ca intreg.

h) Tabela Programare_ore:

Tabela Programare_ore este formată din 3 coloane:

-Id_loc_timp: este o cheie străină (foreign key) , adică, este cheia de legătură
cu cheia primară din tabela Loc_timp.

-Id_defalcare ore: este o cheie străină (foreign key) , adică, e ste cheia de
legătură cu cheia primară din tabela Defalcare_ore.

Îmbinarea celor două chiei străine din tabelele Defalcare_ore și Loc_timp
crează o programare efectică în orar.

3.3 Programare Java.

Programarea în Java a aplicației este structurat ă în 3 pachete. Orar.DAO, DB
și UI. Fiecare pachet din Netbeans este proiectat având sarcini clare cu privire la
dezvoltarea, rularea și funcționarea corectă a aplicației.

3.3.1 Pachetul DB.

În pachetul DB s -au definit constructori pentru tabelele din baza de date.
Fiecare tabelă cu care se lucrează direct trebuie să aibă un constructor definit în DB.

Olteanu Alexandru 49
Pentru crearea unui constructor al unei tabele este necesar să definim clasa publică cu
același nume, și să inițializăm în ace asta variabile pentru fi ecare 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 instricțiunea 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, aplicația 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

Astfel de clase constructor se crează pentru toate tabelele cu care vrem sa
lucrăm în înterfața grafică și pentr u care trebuie sa recuperăm un id sau sa setăm o nouă
valoare în baza de date.

3.3.2 Pachetul OrarDAO.

În pachetul OrarDAO se realizează conexiunea la baza de date folosind diferite
metode și cu ajutorul unui driver special pentru fiecare sistem de gestiune în parte. În
acest caz, sistemul de gestiune este PostgreSQL și astfel driverul necesar pentru
stabilirea conexiuni este postgresql -9.1-901.jdbc4 .

Olteanu Alexandru 51

Pentru a realiza conexiunea la o bază de date trebuie să specificăm cal ea către
baza de date, în acest caz calea fiindu -i atribuitră unui șir de caractere care este denumit
generic DB_CONNECTION_URL. În finalul căii, dupa ultimul backslesh este
specificat numele bazei de date în care vrem să lucrăm.
A doua linie de cod rep rezintă driverul cu care se realizează conexiunea.
În a treia și respectiv a patra linie din cod sunt stipulate userul și parola cu care
aplicația se va loga automat astfel la baza de date.

În continuare se declară nulă conexiunea și deschiderea unei noi sesiuni se
prinde într -un bloc try -catch pentru a testa driverul, respectiv conexiunea și datele de
logare în urmatorul bloc try -catch.

Tot în OrarDAO, sunt inițializate clase, care cu ajutorul constructorilor
declarați în pachetul DB se încearcă manipularea bazei de date. Acest procedeu de
creare unor obiecte care să conțină secvențe SQL ușurează munca programatorului
deoarece pentru a inițializa proceduri de interogare sau actualizare a bazei de date este
suficientă apelarea acestor metode. Prog ramarea orientată -obiect se bazează pe acest
procedeu de dezvoltare al aplicațiilor.

Pentru selectarea unor valori dintr -o tabelă se scrie o metodă în OrarDAO,
numită selectNumeleTabelei, și în funcție de complexitatea tabelei sau de ce anume
vrem sa ne întoarcă, secvența SQL diferă. De exemplu:

Olteanu Alexandru 52

Mai sus am exemplificat o metodă completă de selectare a tuturor valorilor din
tabela Formatiuni_studiu. Metoda, este declarată ca o listă de obiecte. Rezultatul întors
de instrucțiunea sql est e afișat sub formă de tabel. Metoda este foarte folositoare în
momentul în care dorim sa operăm secvențe de actualizare a bazei de date deoarece
pune la dispoziție utilizatorului lista iar acesta poate selecta cu o metodă din java printr –
un simplu click tu plu asupra caruia vrea să facă actualizări.

Și pentru actualizarea datelor se pot crea metode de acest tip, indiferent ca e
vorba de secvențe de stergere, actualizare sau inserare în baza de date, de exemplu:

Metoda inserează în tabe la denumirea unor săli, id fiind setat ca auto -increment
se va insera automat. Interfața PreparedStatement pregătește conexiunea pentru
introducerea unor valori de la interfața grafică a utilizatorului în tabela. Această
pregatire poartă numele în metoda p rezentată insertStatement.

Sintaxa de obținere a unei denumiri pentru sală este descrisă la a șaptea linie de
cod și anume: insertStatement.setString(1, s.getDenumire()), unde numărul 1 precizează
a câta valoare declarată in sintaxa sql este denumirea, iar metoda getDenumire preia
valoarea denumiri introduse de utilizator și o pregătește pentru inserare.

Olteanu Alexandru 53

3.3.3 Pachetul UserInterface(UI).

În acest pachet se generează cu ajutorul metodelor grafice predefinite, care
aparțin claselor swing s au awt, interfața prin care utilizatorul va programa orarul. În
acest scop am creat 7 ferestre grafice de tip JFrame. Voi descrie pe rând fiecare fereastră
cu toate componentele ei, codul sursă anexândul la subcabitolul 3. 4.4.

a) JFrameMenu.java

Frame -ul Meniu a fost creat pentru a facilita navigarea către toate ferestrele
aplicației. Acesta este format dintr -un JMenuBar cu două meniuri.

Meniul UPB listează doi itemi, un ul care conduce la un JFrameSali , iar al
doilea conduce către JFra meProfesori.

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) JFrame Sali.java

Acestă f ereastră da posibilitatea utilizatorului sa gestioneze tabela Sali. Tabelul
din josul ferestrei listează automat toate sălile din tabelă acest lucru fiind posibil datorită
metodei selectSali din pachetul
OrarDAO
.
Butoanele Adaugă Sala,
Modifică Sala și Sterge Sala
realizează secvențe de actualizare
a tabelei.

Dupa introducerea unei
denumiri în campul text prin
apăsarea butonului Adaugă Sala
se realizează secvența de insert.

Pentru a modifica și sterge o
sală este necesară selectarea din
tabelul din josul ferestrei a unei
săli. Listarea se face automat în
momentul rulări ferestrei iar
reinițializarea listei de săli se
produce la apăsarea oricărui buton
din fereastră.

Câmpul text de aceași culoare
cu fundalul este destinat pentu
afișarea erorilor în cazul în care
secvența sql nu funcționează.

Olteanu Alexandru 55

c) JFrame Profesori .java

JFrameProfesori est e fereastra de gestiune a profesorilor singura diferență fată
de gestiunea pe săli este ca aici trebuie să selectăm dintr -o listă departamentul din care
face parte profesorul. Lista, la fel ca și tabelul se încarcă automat la rularea aplicației.
Procedurile de actualizare și selectare a datelor sunt delcarate în OrarDAO.

Olteanu Alexandru 56

d) JFrame IntocmireOrar .java

În ace astă fereastră se realizează efectiv programarea orelor. În partea de sus a
ferestrei avem 6 ComboBox -uri care listează datele care nu au fost înca programate.
Prima oară se va alege un loc și un timp pentru care va trebui să selectăm formațiunea
de studiu ce vrem sa o programăm, disciplina ce urmează sa o studieze în acel înterval și
tipul disciplinei, daca este Curs, Seminar sau Laborator. Odată selectate aceste valori nu
trebuie sa apară listate în continuare. Se poate observa ca pentru Sala CB 106 luni
dimineața, pana la ora 12 nu se mai pot programa ore deoarece sala este ocupată.

În momentul apasări butonului de adăugare programare, se introduc în tabela
Programare_ore valorile id -urilor pentru loc_timp și defalcare_ore. În urma unei metode
de sele ct din programare_ore ComboBox -urile se eliberează de datele care au fost deja
programate.
Gridul din partea de jos a ferestrei afisează în timp real programarile efectuate.
Butonul de Generare raport afisează un raport cu privire la situația programării pe ore.

Olteanu Alexandru 57

d) JFrame RapoarteX .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 afișa într -o fereastră programarea respectivei categori pentru toată
saptamana.

Sursele cod pentru toate ferestrele de tip JFrame vo r fi anexate în subcapitolul 3.4 .4

Olteanu Alexandru 58

3.4 Anexe

3.4.1 Structu ra 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 "Fac ultati"
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 PRIM ARY 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,

Olteanu Alexandru 59
"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 "Departame nte" ("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_det alii PRIMARY KEY ("Id"),

Olteanu Alexandru 60
CONSTRAINT fk_departament FOREIGN KEY ("Id_departament")
REFERENCES "Departamente" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_plan FOREIGN KEY ("Id_plan")
REFERENCES "Planuri_sc olarizare" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Detalii_plan_scolarizare"
OWNER TO postgres;
– Table: "Asociere_an_plan"
–DROP TABLE IF EXISTS "Asociere_an_plan";
CREATE TABLE "Asociere _an_plan"
(
"Id" SERIAL,
"Id_an" integer NOT NULL,
"Id_plan" integer NOT NULL,
CONSTRAINT pk_asocieri PRIMARY KEY ("Id"),
CONSTRAINT fk_an FOREIGN KEY ("Id_an")
REFERENCES "Formatiuni_studiu" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_plan FOREIGN KEY ("Id_plan")
REFERENCES "Planuri_scolarizare" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Asociere_an_plan"
OWNER TO postgres;
– Table: "Defalcare_ore"
– DROP TABLE IF EXISTS "Defalcare_ore";
CREATE TABLE "Defalcare_ore"
(
"Id" SERIAL,
"Id_formatiune" integer NOT NULL,
"Id_profesor" integer NOT NULL,
"Tip_ora" character(5) NOT NULL,
"Disciplina" character varying(50) NOT NULL,
"Nr_ore" integer NOT NULL,
CONSTRAINT pk_defalcare_ore PRIMARY KEY ("Id"),
CONSTRAINT fk_defalcare_p FOREIGN KEY ("Id_profesor")
REFERENCES "Profesori" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_defalcare_ f FOREIGN KEY ("Id_formatiune")
REFERENCES "Formatiuni_studiu" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Defalcare_ore"
OWNER TO postgres;

– Table: "Loc_timp"

Olteanu Alexandru 61
– DROP TABLE IF EXIST S "Loc_timp" ;

CREATE TABLE "Loc_timp"
(
"Id" SERIAL,
"Id_sala" integer NOT NULL,
"Id_zi" integer NOT NULL,
"Id_ora" integer NOT NULL,
"Id_mod" integer NOT NULL,

CONSTRAINT pk_loc_timp PRIMARY KEY("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Loc_timp"
OWNER TO postgres;

– Table: "Programare_ore"

– DROP TABLE IF EXISTS "Programare_ore";

CREATE TABLE "Programare_ore"
(
"Id" SERIAL,
"Id_loc_timp" integer NOT NULL,
"Id_defalcare" integer NOT NULL,
CONSTRAINT pk_progra mare PRIMARY KEY ("Id"),
CONSTRAINT fk_loc_timp FOREIGN KEY ("Id_loc_timp")
REFERENCES "Loc_timp" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_defalcare FOREIGN KEY ("Id_defalcare")
REFERENCES "Defalcare_ ore" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Programare_ore"
OWNER TO postgres;

– Table: "Mod"

– DROP TABLE IF EXISTS "Mod";

CREATE TABLE "Mod"
(
"Id" SERIAL,
"Denumire" charac ter varying(10) NOT NULL,
CONSTRAINT pk_mod PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
ALTER TABLE "Mod"
OWNER TO postgres;

Olteanu Alexandru 62

– 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;

3.4.2 Codul Java pentru pachetul DB.

Codul pentru constructorul Formatiuni
package DB;

public class Formatiuni {

private int id;

Olteanu Alexandru 63
private String denumire;
private i nt id_parinte;

public Formatiuni(int id, String denumire, int id_parinte) {
this.id = id;
this.denumire = denumire;
this.id_parinte = id_parinte;
}
public Formatiuni() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}

public String getDenumire() {
return denumire;
}
public void setDenumire(String denumire) {
this.denumire = denumire;
}
public int getId_parinte() {
return id_parinte;
}
public void setId_parinte(int id_parinte) {
this.id_parinte = id_parinte;
}
}

Constructorul Loc_timp . Ceilalți constructori sunt asemănători și se construiesc analog.
package DB;

public class Loc_timp {

private int id;
private int id_sala;
private int id_zi;
private int id_ora;
private int id_mod;
private String disponibilitate;

public Loc_timp(int id, int id_sala, int id_zi, int id_ora, int id_mod, String disponibilitate) {
this.id = id;
this.id_sala = id_sala;
this.id_zi = id_zi;
this.id_ora = id_ora;
this.id_mod = id_mod;
this.dis ponibilitate = disponibilitate;
}
public Loc_timp() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;

Olteanu Alexandru 64
}
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 disponib ilitate) {
this.disponibilitate = disponibilitate;
}
}

3.4.3 Codul Java pentru pachetul OrarDAO
.
package DAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import jav a.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import DB.*;

public class OrarDAO {

private final static String DB_CONNECTION_URL = "jdbc:postgresql://127.0.0.1:5432/TestOrar";
private final static String DRIVER_CLASS_NAME = "org.postgresql.Driver";
private final static String USER = "postgres";
private static final String PASSWORD = "aezakmihesoyam";

private static Connection databaseConnection = null;

static {
try {

Olteanu Alexandru 65
Class.forName(DRIVE R_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.ge tDenumire());

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);

}

Olteanu Alexandru 66

} catch (SQL Exception 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.se tInt(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 67
selectStatement.setInt(1, id_sala);
selectStatement.setInt(2, id_zi);
ResultSet results = selectSt atement.executeQuery();
ore = new ArrayList<Ore>();

while (results.next()) {
Ore o = new Ore();
o.setId(results.getInt(1));
o.setDenumire(results.getString(2));

ore.a dd(o);
}

} catch (SQLException e) {
e.printStackTrace();
}

return ore;
}

public static boolean deleteOre(int id) {

boolean isDeleted = false;

String sql = "DELETE from \"Ore \" whe re \"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 = ne w ArrayList<Zile>();

while (results.next()) {
Zile z = new Zile();
z.setId(results.getInt(1));
z.setDenumire(results.getString(2));

Olteanu Alexandru 68
zile.add(z);
}

} catch (SQ LException e) {
e.printStackTrace();
}

return zile;
}

3.4.3 Codul Java pentru UI

package UI;

import DB.*;
import DAO.*;
import producehtml.MotorHTML;
import java.util.List;
import java.awt.*;
import javax.swing.JLabel ;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

;

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, 1 60, 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);

Olteanu Alexandru 69

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("Oc upat");
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].setOp aque(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.getDenumir e());
}

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) {

Olteanu Alexandru 70
int idz = zileExistente.get(indz).getId();
oreExistente = OrarDAO.se lectOre(ids, idz);
for (Ore o : oreExistente) {
jComboBoxOra.addItem(o.getDenumire());
}
}

}

private void jComboBoxOraActionPerformed(java.awt.event.Acti onEvent evt) {
jComboBoxFormatiuni.removeAllItems();
int indz = jComboBoxZiua.getSelectedIndex();
if (indz >= 0) {
int idz = zileExistente.get(indz).getId();
int indo = jCom boBoxOra.getSelectedIndex();

if (indo >= 0) {
int ido = oreExistente.get(indo).getId();
formatiuniExistente = OrarDAO.selectFormatiuni(idz, ido);
for (Formatiuni fo : formatiuniExistente) {
jComboBox Formatiuni.addItem(fo.getDenumire());
}
}
}
}

private void jButtonAdaugaProgramareActionPerformed(java.awt.event.ActionEvent evt) {
int j = jComboBoxZiua.getSelectedIndex();
int i = jComboBoxOra.getSelectedIndex();
int k = jComboBoxSala.getSelectedIndex();

int ids = saliExistente.get(k).getId();
int idz = zileExistente.get(j).getId ();
int ido = oreExistente.get(i).getId();

int id_lt = OrarDAO.selectLoc_timp(ids, idz, ido);

int indfs = jComboBoxFormatiuni.getSelectedIndex();
String formatiune = formatiuniExistente.get(indfs).getDenumire();
int idfs = formatiuniExistente.get(indfs).getId();
String disciplina = (String) jComboBoxDisciplina.getSelectedItem();
String tip_ora = (String) jComboBoxTip_ora.getSelectedItem();
String profesor = OrarDAO.selectProfesor(idf s, disciplina, tip_ora);

int id_defalcare = OrarDAO.selectDefalcare(idfs, disciplina, tip_ora);

boolean rez = OrarDAO.insertProgramareOre(id_lt, id_defalcare);
if (rez) {
jTextFieldMsg.setText(" Programare efec tuata!");

} else {
jTextFieldMsg.setText(" ");
}

to[ido – 1][idz – 1].setBackground(Color.red);
to[ido – 1][idz – 1].setText("Ocupat");
to[ido – 1][idz – 1].createToolTip();

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) {
Obje ct[][] 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
private void jComboBoxFormatiuniActionPerformed(java.awt.event.ActionEvent evt) {
jComboBoxDisciplina.removeAllItems();
int indfs = jComboBoxFormatiuni.getSelectedIndex();
if (indfs >= 0) {
int idfs = formatiuniExistente.get(indfs).getId();
String [] discipline = OrarDAO.selectDisciplina(idfs);
for (String d : discipline) {
jComboBoxDisciplina.addItem(d);
}
}
}

private void jComboBoxDisciplinaActionPerformed(java.awt.event.ActionEvent evt) {
jComboBoxTip_ora.removeAllItems();
int indfs = jComboBoxFormatiuni.getSelectedIndex();
if(indfs >= 0) {
int idfs = formatiuniExistente.get(indfs).getId();
String disciplina = (String) jComboBoxDisciplina.getSe lectedItem();

String [] tipOre = OrarDAO.selectTipOre(idfs, disciplina) ;
for (String t : tipOre) {
jComboBoxTip_ora.addItem(t);
}
}
}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor -fold defaultstate="collapsed" desc=" Look and feel setting code (optiona l) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (java x.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(java.util.logging.Level.SE
VERE, null, ex);
} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(JFrameIntocmireOrar.class.getName()).log(java.util.logging.Level.SE
VERE, null, ex);
} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(JFrameIntocmireOrar.class.getName() ).log(java.util.logging.Level.SE
VERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {

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 j ComboBoxFormatiuni;
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.swin g.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 jTe xtFieldMsg;
// 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<Profeso ri> profesoriExistenti;

Olteanu Alexandru 74
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 jButtonModificaActionPerfo rmed(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.s etText("");
}

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) {

Olteanu Alexandru 75
jTextFieldMsg.setText(" Adaugat!");
umpleTabelProf();
} else {
jTextFieldMsg.setText("Eroare!");
}
}
private void jComboBoxDepartam entActionPerformed(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.la ng.Integer.class, java.lang.String.class, java.lang.String.class
};

public Class getColumnClass(int columnIndex) {
return types[columnIndex];
}
;
};
int ind = jComboBoxDepartament.getS electedIndex();
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
privat e 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

Olteanu Alexandru 76
Bibliografie

[1] Vasilache , Tiberiu; Curs Baze de date; Facultatea de Științe aplicate, 2014;

[2] Vasilache, Tiberiu; Curs Programare orientată obiect; Facultatea de Științe aplicate,
2014;

[3] Frăsinaru, Cristian; Curs practic de Java;

[4] Rădulescu, Florin; Curs Proiectarea b azelor de date;

[5] Tănasă, Ș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.; Fundamenta ls 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 onlin e:

[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] Referința 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

Similar Posts