Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/ fax: +0236 4 70 905, e-mail: aciee@ugal.ro, web: www.aciee.ugal.ro 2/65 Lucrare de… [606308]

UNIVERSITATEA „DUNĂREA DE JOS” DIN GALAȚI
FACULTATEA DE AUTOMATICĂ, CALCULATOARE, INGINERIE
ELECTRICĂ ȘI ELECTRONICĂ

Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/ fax: +0236 4 70 905, e-mail: [anonimizat], web: www.aciee.ugal.ro
2/65

Lucrare de licență

Coordonator ș tiințific,
Conf . dr. ing. Cornelia TUDORIE
Absolvent: [anonimizat]
2017

UNIVERSITATEA „DUNĂREA DE JOS” DIN GALAȚI
FACULTATEA DE AUTOMATICĂ, CALCULATOARE, INGINERIE
ELECTRICĂ ȘI ELECTRONICĂ

Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/ fax: +0236 4 70 905, e-mail: [anonimizat], web: www.aciee.ugal.ro
3/65

Programul de studii Calculatoare

Gestiunea unui cinematograf și
rezervări de bilete

Coordonator științific,
Conf . dr. ing. Cornelia TUDORIE
Absolvent: [anonimizat]
2017

CUPRINS

Introducere ………………………….. ………………………….. ………………………….. ………………………….. ………………………… 1
CAPITOLUL 1. CERINȚE ȘI SPECIFICAȚII TEHNICE ………………………….. ………………………….. ……………. 2
CAPITOLUL 2. ANALIZA PROBLEMEI ………………………….. ………………………….. ………………………….. ……….. 3
2.1. Cinematogr aful ………………………….. ………………………….. ………………………….. ………………………….. ………….. 3
2.2. Strategia de abordare a problemelor ………………………….. ………………………….. ………………………….. …. 3
2.2.1. Gestiunea bazei de date ………………………….. ………………………….. ………………………….. ………………………….. ……. 4
2.2.2. Reprezentarea grafică a sălii de cinema ………………………….. ………………………….. ………………………….. ……. 4
2.2.3. Selectarea filmului ………………………….. ………………………….. ………………………….. ………………………….. …………….. 5
2.2.4. Prețul și categoriile de prețuri ………………………….. ………………………….. ………………………….. …………………….. 5
2.2.5. Gestiunea conturilor de utilizator ………………………….. ………………………….. ………………………….. ………………. 5
2.3. Soluții software existente ………………………….. ………………………….. ………………………….. …………………….. 6
CAPITOLUL 3. PROIECTARE ………………………….. ………………………….. ………………………….. …………………….. 11
3.1 Proiectarea bazei de date ………………………….. ………………………….. ………………………….. …………………… 11
3.1.1 Sistemul de gestiune a bazelor de date ………………………….. ………………………….. ………………………….. …….. 11
3.1.2 Modelul conceptual al bazei de date ………………………….. ………………………….. ………………………….. …………. 12
3.1.3 Modelul logic al bazei de date ………………………….. ………………………….. ………………………….. …………………….. 13
3.2 Proiectarea aplicației ………………………….. ………………………….. ………………………….. ………………………….. 15
CAPITOLUL 4. IMPLEMENTARE ………………………….. ………………………….. ………………………….. ……………… 22
4.1 Medii de lucru utilizate ………………………….. ………………………….. ………………………….. ……………………….. 22
4.2 Limbaje de programare folosite ………………………….. ………………………….. ………………………….. ………… 23
4.3 Implementarea aplicației ………………………….. ………………………….. ………………………….. ……………………. 26
CAPITOLUL 5. TESTAREA APLICAȚIEI ………………………….. ………………………….. ………………………….. …… 37
5.1 Scopul testării ………………………….. ………………………….. ………………………….. ………………………….. …………… 37
5.2 Strategia de testare ………………………….. ………………………….. ………………………….. ………………………….. …. 37
CONCLUZII ………………………….. ………………………….. ………………………….. ………………………….. ………………………. 40

BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. ………………………….. ………………… 41
ANEXA 1. MANUAL DE UTILIZARE ………………………….. ………………………….. ………………………….. …………. 42
ANEXA 2. SURSELE PROGRAME LOR ………………………….. ………………………….. ………………………….. ………. 48

TABEL FIGURI

Figură 1: Reprezentare grafică – SeatAdvisor Box Office ………………………….. ………………………….. …… 7
Figură 2: Reprezentare grafică – Concession Sales ………………………….. ………………………….. ……………… 8
Figură 3: Reprezentare grafică – Food & Beverage ………………………….. ………………………….. …………….. 9
Figură 4: Modelul conceptual ………………………….. ………………………….. ………………………….. …………………… 13
Figură 5: M odelul logic ………………………….. ………………………….. ………………………….. ………………………….. ….. 15
Figură 6: Clasa Conectare ………………………….. ………………………….. ………………………….. ………………………….. 15
Figură 7: Clasa licenta1 -variabile ………………………….. ………………………….. ………………………….. …………… 16
Figură 8: Clasa licenta1 -funcții ………………………….. ………………………….. ………………………….. ……………….. 16
Figură 9:Modificarea filmelor ………………………….. ………………………….. ………………………….. ………………….. 18
Figură 10:Ștergere film ………………………….. ………………………….. ………………………….. ………………………….. …. 19
Figură 11:Inserare reprezentație ………………………….. ………………………….. ………………………….. ……………. 20
Figură 12: Interfață autentificare ………………………….. ………………………….. ………………………….. ……………. 26
Figură 13 : Meniu administrator ………………………….. ………………………….. ………………………….. ………………. 26
Figură 14: Meniu utilizator ………………………….. ………………………….. ………………………….. ……………………….. 27
Figură 15: Administrarea filmelor ………………………….. ………………………….. ………………………….. …………… 27
Figură 16: Mesaj de eroare ………………………….. ………………………….. ………………………….. ……………………….. 28
Figură 17: Input dată + oră + sală ………………………….. ………………………….. ………………………….. ……………. 29
Figură 18: Interfață „home” ………………………….. ………………………….. ………………………….. ……………………… 30
Figură 19: Interfață – sală ………………………….. ………………………….. ………………………….. …………………………. 31
Figură 20: Locuri selectate ………………………….. ………………………….. ………………………….. ……………………….. 36
Figură 21: Butoane vânzare/rezervare ………………………….. ………………………….. ………………………….. ….. 36
Figură 22: Comandă SQL ………………………….. ………………………….. ………………………….. ………………………….. . 37
Figură 23: Testare – corectitudinea datelor ………………………….. ………………………….. ………………………. 38
Figură 24: Mesaj de eroare ………………………….. ………………………….. ………………………….. ……………………….. 38
Figură 25: Interfață aplicație ………………………….. ………………………….. ………………………….. ……………………. 42
Figură 26: Interfață – home ………………………….. ………………………….. ………………………….. ……………………… 43
Figură 27: Informații film ………………………….. ………………………….. ………………………….. …………………………. 43
Figură 28: Tipuri de bilete ………………………….. ………………………….. ………………………….. ………………………… 44
Figur ă 29: Sală de cinema ………………………….. ………………………….. ………………………….. …………………………. 45
Figură 30: Meniu administrator ………………………….. ………………………….. ………………………….. ………………. 45
Figură 31: Administrarea filmelor ………………………….. ………………………….. ………………………….. …………… 46
Figură 32: Film selectat ………………………….. ………………………….. ………………………….. ………………………….. … 46
Figură 33: Modificarea filmului ………………………….. ………………………….. ………………………….. ……………….. 47

1
Introducere

Scopul acestei lucrări este de a crea o aplicație deskto p ce are ca obiective vânzarea și
rezerva rea biletelor de cinema și de a asigura mentenanța bazei de date aferente aplicației.
Am ales această temă deoarece consider că astfel de aplicații sunt foarte importante
pentru societatea modernă în care trăim, und e fiecare minut contează. Mai concret, putem
să ne imaginăm o societate în care toate tranzacțiile se întâmplă manual, unde vânzătorul
de la supermarket ne ia fiecare produs în parte, îi caută prețul în lista de prețuri, și face
calculul manual pentru a ne înștiința cât trebuie să plătim. Rezultatul acestor tranzacții
efectuate manual este pierderea timpului prin urmare scăderea eficienței și tot odată pot
exista și greșeli de calcul, acest lucru fiind inevitabil, din acest motiv avem nevoie de astfel
de ap licații care să ne ușureze treaba.
Industria cinematografică generează anual încasări de miliarde de dolari din vânzarea
de bilete prin urmare, cinematografia este într -o continuă evoluție. În ziua de astăzi putem
urmări filmele în format 2D, 3D chiar și 4 D, și putem să ne imaginăm încotro se îndreaptă
industria cinematografică. Poate, pe viitor, vom putea urmări un film al cărui final să fie
ales de spectatori . Vom putea urmări același film de mai multe ori ca și cum ar f i prima oară
când îl vizionăm. Din acest motiv, astfel de aplicații de vânzare a biletelor vor fi mereu
necesare.
Se propune realizarea unei aplicații desktop cu o interfața coerentă și clară care nu
necesită cunoștințe avansate pentru a putea fi utilizată. Această aplicație își propune să
vină în ajutorul utilizatorului, și anume vânzătorul de bilete, și în anumite cazuri
administratorul, prin oferirea unei metode simple și rapide de a vinde biletele de cinema
dar și prin punerea la dispoziția administratorului instrumentele necesare pentr u
modificarea bazei de date aferente aplicației.
Aplicația are în spate o bază de date MySQL. În această bază de date sunt stocate
conturile și tipurile de conturi (administrator/ utilizator ), filmele, sălile de cinema, data de
rulare a filmelor și restul informațiilor vitale aplicației.
Cu ajutorul acestei aplicații, utilizatorul fără privilegii de administrator va putea vinde
și rezerva bilete de cinema, pe când, utilizatorul cu privilegii de administrator va putea
întreține baza de date. Mai clar, acesta va putea introduce, modifica și șterge filme. Va putea
schimba datele referitoare la unde, cum și când rulează un anumit film. Va putea adăuga,
șterge și modifica săli de cinema.

2
CAPITOLUL 1. CERINȚE ȘI SPECIFICAȚII TEHNICE

Tema acestei lucrări de licență este dezvoltarea unei aplicații de vânzare a biletelor de
cinema. Această aplicație este împărțită în două părți, sau, mai bine zis trebuie să
îndeplinească două funcții. Funcția de mentenanță a bazei de date ș i funcția de v ânzare ș i
de rezervare a biletelor de cinema.
Funcția de mentenanță a bazei de date presupune ca utilizatorul, în acest caz
administratorul, poate să modifice prețu l filmelor sau numele acestora ș i la nevoie chiar să
le șteargă. Poate să schimbe data de rulare a filmelor sau sal a la care rulează. Poat e să
adauge noi săli de cinema ș i să le configureze sau poate să șteargă sălile deja existente ș i nu
în ultimul rând, poate să creeze noi conturi sau să modifice pe cele deja existente.
Funcția de vânzare ș i de rezervare a biletelor de cinema poate fi folosită atât de
utilizatorul fără p rivilegii de administrator cât ș i de utilizatorul cu privilegii de
administrator , pe când, funcția de mentenanță poate fi folosită doar de adm inistrator.
Funcția de vânzare ș i rezervare a biletelor de cinema presupune ca utilizatorul să poată
vizualiza filmele ce rulează săptămâna curentă, poate selecta un anumit film, și după
selectarea sălii ș i a datei de rulare, poate să vadă sala ș i procentajul de ocupare a sălii la
momentul respectiv. Mai mult, ace sta poate selecta locurile disponibile pentru a vinde
biletele aferente acelor locuri sau le poate rezerva.

Aplicația are următoarele specificații tehnice:

1. Aplicația este dezvoltată î n NetBeans folosind limbajul Java .
2. Baza de date este implementat ă folos ind MySQL Workbench 6.3 CE .

Aplicația este realizată astfel încât să poată fi utilizată de oricine cu sau fără
cunoștințe de Java sau MySQL. Pentru ca acest lucru să fie posibil, la fiecare pas pe care
utilizatorul îl face, se declanșează anumite verific ări pentru a asigura buna funcționare a
aplicației. În cazul în care utilizatorul nu completează un anumit câmp sau completează un
câmp greșit, un mesaj de eroare va fi afișat pe ecran în care utilizatorul este informat de
pașii necesari pentru remedierea problemei.

3
CAPITOLUL 2 . ANALIZA PROBLEMEI

2.1. Cinematograful

Cinematograful este un loc destinat proiectării peliculelor cinematografice. Arta și
industria cinematografică s-a născut la sfârșitul secolului 19, și se împarte în două sectoare
distinct e: producția de film și difuzarea lor în sălile de cinematograf sau la televizor, pe
internet etc .
De la începutul industriei cinematografice, pan ă în prezent, ambele sectoare au
evoluat. Atâ t producția filmelor a evoluat î n mod spectaculos câ t și modul d e difuzare.
Pentru a evidenția evolu ția producției filmelor putem să ne aducem aminte de filmele
alb-negru cu Stan și Brand sau de apariția filmului „Star Wars” care la vremea aceea a creat
o adevărat ă cultură, filmul „Star Wars” fiind un film cunoscut în toată lumea. A impresionat
foarte mult prin efectele speciale , deși pe vremea aceea efectele nu erau făcute pe
calculator. Efectele erau realizate folosind modele de plastic, pictura pe sticl ă și filmatul din
anumite unghiuri speciale cu scopul de a crea i luzii.
În zilele noastre efectele speciale se realizează folosind imagini generate pe calculator
(CGI) . Deci urmărind evoluția artei cinematografice deducem c ă automat a evoluat și
proiecția filmelor și pe măsură ce proiecția filmelor a evoluat de la filme le fără sunet, alb –
negru la filmele din ziua de azi, a evoluat și modalitatea de a vinde biletele. Din moment ce
industria cinematografică a ajuns să încaseze miliarde de dolari în fiecare an din urma
vânzării de bilete, s -a pus problema gestiunii vânzării acestora și mărirea eficienței.
Problema gestiunii se referă la faptul că vânzătorul, fără un sistem bine pus la punct
care să gestioneze locurile deja rezervate sau vândute, poate să vândă sau să rezerve un loc
care nu mai este disponibil.
Problema efici enței se referă la faptul că vânzătorul poate pierde timp prețios
vânzând biletele manual. Să presupunem că cinematograful are două săli unde, simultan,
rulează același film. Vânzătorul verifică disponibilitatea locurilor, vinde două bilete, și la
final no tează cum că cele două locuri pentru care a vândut biletele nu mai sunt disponibile.
Nu putem doar să ne imaginăm cât timp durează să vândă bilete pentru zece oameni care
așteaptă la rând. Problema și mai mare ar fi dacă acest scenariu s -ar întâmpla cu 1 0 minute
înainte să înceapă filmul.
2.2. Strategia de abordare a problemelor

După ce am evidențiat cele mai import ante probleme de care trebuie să ținem cont
urmează să stabilim și strategia de abordare a acestor probleme.
Pentru oferir ea unei soluții sof tware care să satisfacă toate nevoile clientului trebuie
să fim familiarizați cu nevoile clientului , în cazul de față trebuie să fim familiarizați cu ceea

4
ce implică un cinematograf . În primul rând trebuie să ne întrebăm despre ce își dorește
clientul unui cinematograf și î n al doilea rând tr ebuie să ne întrebăm de ce are n evoie
vânzătorul de bilete ca să fie mai eficient.
Clientul unui cinematograf își dorește ca tranzacția de cumpărare a biletelor să se
desfășoare câ t mai rapid.
Vânzătorul unui cine matog raf își dorește o metodă câ t mai simp lă și mai eficientă de a
vinde bilete.
După ce am luat la cunoștință nevoile clientul ui ce cumpără bilete de cinema ș i a
vânzătorului , putem contura elemente le necesare aplicație software ș i anume : o bază de
date, repre zentare grafică a să lii de cinema, interfață ușor de utilizat. Dar cel mai im portant
lucru de care trebuie să ținem cont atunci când implementam o soluție software este
gestionarea posibilelor erori ce apar în urma erorilor umane. Nu putem s ă oferim client ului
o aplicație care va funcționa într -un mod defectuos în cazul în care utilizatorul o folosește
greșit. Tocmai din acest motiv trebuie s ă punem accent pe anumite verificări de date astfel
încât chiar dac ă utilizatorul introduce date greșite, aplicația să funcționeze și să îndrume
utilizatorul către o anumită soluție la problema întâlnită.

2.2.1. Gestiunea bazei de date

Orice cinematograf are nevoie de o bază de date și de o modalitate de a gestiona
această bază de date pentru a funcționa la potențialu l său maxim.
Printre cele mai importante informații necesare bazei de date se numără
următoarele: filmele disponibile, data de rulare, sălile cinematografului și structura lor,
utilizatorii aplicației, biletele cumpărate și rezervate și prețul filmelor.
Alt aspect foarte important este corectitudinea datelor introduse în baza de date.
Pentru a evita erorile ce pot apărea în urma introducerii unor date eronate sunt necesare
anumite verificăr i și anume: filmul nu trebuie să existe de două ori în baza de date , nu pot
rula două filme în aceeași sală la aceeași ora în aceeași zi , același ut ilizator nu poate exista
de două ori, utilizatorul nu trebuie să introducă litere în câmpurile destinate prețurilor sau
în câmpurile care sunt destinate introducerii numerelor .

2.2.2. Reprezentarea grafică a sălii de cinema

Reprezen tarea grafică a sălii trebuie să fie câ t mai e xplicită. Fiecare loc trebuie să fie
ușor de identificat. Cel mai optim este ca la fiecare rând să fie asignată litera
corespunzătoare și fiecare loc să fie afișat pe ecran când utilizatorul muta cursorul
deas upra lui. De asemenea trebuie să existe un sistem explicit de memorare și afișare a
locurilor deja selectate.

5
Reprezentarea grafică a sălii se dorește a fi dinamică astfel încât în urma modific ării
sălii de cinema să îi fie ușor utilizatorului să modifice reprezentarea grafică a sălii.
De asemenea trebuie să existe un cod de culori pentru scaunele disponibile pentru a fi
selectate, scaunele deja selectate și scaunele rezervate. Este de preferat ca p entru scaunele
ce se pot rezerva să se folosească o culoare neutr ă cum ar fi gri, pentru scaunele selectate
să se folosească verde iar pentru scaunele deja rezervate să se folosească roșu.

2.2.3. Selectarea filmului

Selectarea filmului trebuie să fie câ t mai simplă. Se dorește afișarea filmelor ce
rulează pe săptămâna curentă deoarece pentru o aplicație de vânzare a biletelor de cinema
filmele din săptămâna curentă sunt cele care prezintă interes către clienți. Eventual clienții
ar putea fi int eresați de filmele ce urmează să ruleze la cinematograf.
După selectarea filmului trebuie ca utilizatorul aplicației să primească informațiile
necesare filmului respectiv cum ar fi: data și ora la care filmul rulează și sala unde rulează.
După ce utilizatorul prime ște datele necesare , trebuie să existe o modalitate de selectare a
datei , a orei și a sălii dorite pentru a cumpăra sau a rezerva bilete.

2.2.4. Prețul și categoriile de prețuri

Prețul este alt aspect important care trebuie luat în considerare. Înainte de a încheia o
tranzacție , clientul trebuie să știe prețul biletelor , eventual preț ul pe diferite categorii
(adult / student / copil).
Fiecare film în parte trebuie să aibă un anumit preț sau prețul poate fi asignat în
funcție de formatul film ului , depinde de politica cinematografului. În cazul de față fiecare
preț este în funcție de film. Utilizatorul aplicației poate pune prețul pe fiecare film în parte
după cum dorește și după cum se stabilește cu conducerea cinematografului .
Categoriile de prețuri trebuie s ă fie bine definite și în funcție de politica
cinematografului pot fi gestionate ca un procentaj de reducere din prețul filmului sa u direct
ca o sumă ce urmează să fie scăzută din prețul final al unui film.

2.2.5. Gestiunea conturilor de utilizator

Trebu ie definite tipurile de utilizator(administrator / utilizator) și permisiunile
fiecărui tip de utilizator.
Administratorul este utilizatorul care are drepturi depline de la gestionarea bazei de
date la vânzarea și rezervarea de bilete.

6
Utilizatorul este de fapt vânzătorul care are dreptur i limitate. Acesta poate doar să
vizualizeze filmele din săptămâna curent ă și poate rezerva sau vinde bilete în măs ura
disponibilității locurilor.
2.3. Soluții software existente

În momentul de față , pe piaț ă exist ă multe companii care vin cu diverse soluții
software pentru gestionarea unui cinematograf ș i nu numai. Soluț iile diferă ca tip ș i
complexitate.

SeatAdvisor

Compania SeatAdvisor vine cu soluții pentru vânzarea de bilete la casierie (box
office t icketing) , vânzarea de bilete online(online ticketing) , strâ ngere de fonduri , etc.
SeatAdvisor Box Office este soluția propus ă de SeatAdvisor pentru vânzarea și
rezervarea biletelor de cinema. Această aplicație promite s ă acopere toate nevoile unui
cinema togra f. Promite o modalitate rapid ă și eficient ă de vân zare a biletelor de cinema cu
hărți interactive ale sălilor de c inema unde utilizatorul poate să vizualizeze locurile libere și
locurile deja rezervate și poate să selecteze locuri pentru a rezerva sau a vinde bilete.
Unul din punctele forte al aplicației propus ă de SeatAdvisor este sistemul de scanare
a biletelor pentru a confirma validitate biletului care permite scanarea oricărui tip de bilet
fie el printat acasă, primit la casierie sau î n format el ectronic pe telefonul mobil. Mai mult
de atât , sistem ul de scanare are ș i o funcție de notificare astfel încâ t vânzătorul să fie
anunțat atunci când este vorba despre un client VIP pentru a -i oferi tratament special.
Cu toate acest ea, așa cum interfața ap licației este simpla, reprezentarea grafică a
sălii este la rândul ei simplă ș i poate crea confuzie când se selectează un anumit loc .

7

Figură 1: Reprezentare grafică – SeatAdvisor Box Office

Un alt dezavantaj al acestei apli cații, pe lângă simpli tatea reprezentării grafice a să lii
este imposibilitatea de a modifica aranjamentul sălii de cinema de către clientul final.
Reprezentar ea grafică este personalizată în funcție de specificațiile cli entului iar la o
redecorare a să lii de ci nema , clientul trebuie să ceară personalizarea reprezentării grafice
după noii parametrii.
Dar SeatAdvisor Box Office este o aplicație ce asigur ă protecția tranzacțiilor efectuate
lucru care după părerea mea este foarte important .
În continuare vom ur mări alte soluții software pentru a ne face o idee despre soluțiile
software deja existente și a ne face o idee asupra punctelor forte pe care soluțiile software
existente mizează , dar înainte de asta vom face o scurt ă listă cu ceea ce are de oferit
aplica ția SeatAdvisor Box Office :
• Securitatea tranzacțiilor.
• Scanarea biletelor.
• Notificări î n aplicație.
• Interfață ușor de utilizat.

8
Vista Entertainment Solutions

Vista Entertainment Solutions vine cu aplicația Vista Cinema care incorporează
soluții mult mai complexe pentru gestionarea unui cinematograf. Nucleul aplicați ei Vista
Cinema este Box Office , care este de fapt unul dintre modulele aplicației . Vista Cinema mai
are î n componență urm ătoarele module: Concession Sales, Food & Beverage, Digital
Signag e, CashDesk, InTouch, UsherPoint, MovieTeam .
Box Office este modulul prin intermediul căruia se poate configura prețul biletelor,
nivelul de pri vilegii al fiecărui utilizator î n parte, orarul de ru lare al filmelor și punctele de
vânzare. Tot prin i ntermed iul modulului Box Office , se pot trimite automat prin sms ale rte
către managerul responsabil , se pot scana în mod rapid și sigur vouchere.
Concession Sales este modulul prin intermediul căruia de la aceea și sta ție de lucru , se
pot vinde și băuturi , mâncare sau diferite pachete promo ționale pe lângă biletele de
cinema . Acest modul ține evidența celor mai populare produse și le afiș ează pe ecran
vânzătorului care , la r ândul lui poate să propună acest produs clientului.

Figură 2: Reprezentare grafică – Concession Sales
Food & Beverage este modulul care se adresează cinematografelor ce au în
componență un loc destinat servirii de băuturi și mâncare. Acest modul ofer ă o interfață
grafică complet personalizat ă conform necesităților clie ntul ui, interfa ță care ulterior poate
fi modificată de client.

9

Figură 3: Reprezentare grafică – Food & Beverage
Digital Signage este modulul care permite utilizatorului să creeze conținut audio –
video care poate fi afiș at pe oric e ecran. Prin intermediul a cestui modul , utilizatorul poate
informa clienții despre anumite promoții , poate s ă afișeze reclame sau s ă informeze clienții
despr e filmele ce urmează să ruleze afișând secvențe cu filmele respective . Utilizând aceste
strategii de marketing puse la dispoziție de modulul Digita Signage, cinematograful își
poate mări profitul considerabil.
CashDesk este modulul care permite vânzătoru lui să finalizeze tranzacțiile cu plat ă
cash, folosind cecuri , vouchere , plat ă electronic ă sau onli ne.
Modulele InTouch, UsherPoint și MovieTeam sunt folosite pentru gestiunea
angajaților și pentru a crea un mod mai simplu de comunicare între angajați și
management.

JACK ROE

Compania Jack Roe oferă soluții complexe asemenea celor de la Vista Enterta inment
Solutions . Aplicația software oferit ă de aceștia are următoarele caracteristici :
Se poate trece foarte rapid de la film , la data de rulare , la tipul de bilet cu doar câteva
clickuri rapide pe ecran.
Se pot vinde și bilete și gustări în cadrul unei singure tranzacții .
Se pot vinde bilete pentru filmul curent și bilete pentru filmele din săptămânile
viitoare în aceeași tranzacție .
Se pot vinde bilete î n avans de la orice stație de vânzare a biletelor .

10
Se pot căuta rezervările după codul de rezervare sau ultimele 4 cifre ale numărului
cardului folosit la încheierea tranzacției .
Aproape toată activitatea este urmărită astfel încât acțiunile operatorilor să fie
înregistrate pentru a fi examinate de către managerii lor. În acest fel, activitatea
frauduloa să poate fi urmărită și vinovatul va fi găsit foarte repede.
Se pot genera rapoarte pentru orice interval de dat e ales de utilizator.
Se poate plăti cu cardul și se pot face ramburs ări parțiale sau complete.
Biletele se pot tip ări utilizând imprimante Blu etooth c e conțin tipare de bilete .
Aplicația mai oferă posibilitatea de a utiliza puncte de plat ă mobile astfel încât,
vânzătorul poate să vândă biletele și în afara ghișeului.

11
CAPITOLUL 3. PROIECTARE

3.1 Proiectarea bazei de date

În sensul larg, o bază de date (database) este o colecție de date corelate din punct de
vedere logic, care reflectă un anumit aspect al lumii reale și este destinat unui anumit grup
de utilizatori.[1]
Proiectarea bazei de date este o etapă esențială p entru dezvoltarea unei aplicații ce
depinde de buna funcționare a bazei de date , fiind că în urma proiectării defectuoase a bazei
de date pot apărea anomalii care pot genera pierderi financiare uriașe.
Pentru o proiectare câ t mai co rectă a bazei de date t rebuie să ținem cont de anumite
principii.
• Evitarea datelor redundante. Datele redundante sunt de fapt datele dubl ate.
Este optim și recomandat să nu se folosească date dublate deoarece se ocup ă
spațiul și crește șansa apariției anomaliilor și a inconsecv ențelor.
• Corectitudinea datelor. Corectitudinea datelor este foarte importantă întrucât
o singură dată introdusă incorect poate să genereze căderea totală a sistemului
sau poate genera rapoarte de date incorecte.

Proiectarea bazei de date presupune în primul rând determinarea scopului bazei de
date. Trebuie să știm scopul ei , cine și cum o va utiliza și nivelul de complexitate necesar
pentru baza de date.
În cazul de faț ă, scopul bazei de date este gestionarea unui cinematograf. Cum se
dorește o aplicați e de vânzare a biletelor d e cinema , baza de date va fi relativ simpl ă.
Baza de date va fi utilizat ă de aplicația software în primul rând pentru afișarea
datelor și va fi modificat ă de administrator.

3.1.1 S istemul de gestiune a bazelor de date

Sistemul de gestiune a bazelor de date(SGBD) reprezintă sistemul de programe care
permite construirea bazelor de date, introducerea de înregistrări în bazele de date și
dezvoltarea de aplicații privind bazele de date, permițând astfel accesul utilizatorului la
date printr -un limbaj de nivel înalt, aprop iat modului obișnuit de operare, el reprezintă o
interfață î ntre utilizator și sistemul de operare.[2]
Un SGBD îndeplinește următoarele funcții:
• Funcția de manipulare a bazei de date
• Funcția de descriere a bazei de da te
• Funcția de comunicare.

12

Funcția de manipulare a bazei de date se referă la faptul că utilizatorului îi sunt puse
la dispoziție instrumentele necesare pentru gestionarea bazei de date.
Funcția de descriere se refer ă la faptul că S GBD -ul permite utilizato rului să descrie
relațiile dintre date și condițiile de acces la datele stocate.
Funcția de comunicare asigură o punte între utilizator și baza de date astfel încât
utilizatorul să poată interacționa cu baza de date.

3.1.2 Modelul conceptual al bazei de d ate

Înainte de realizarea modelului conceptual trebuie să înțelegem fluxul de date
necesar pentru a satisface nevoile clientului.
Clientul , în cazul de față este firma care se ocupă cu proiecția peliculelor
cinematografice. Știind cu ce se ocupă clientul putem să definim fluxul de date necesar
pentru oferirea unei soluții software.
Prin urmare am fost nevoit să țin cont de faptul că un cinematograf are nevoi e de o
gestiune a filmelor deci , am avut nevoie de un tabel în care sunt salvate filmele și
informaț iile necesare.
Apoi , fiecare film rulează la o anumită dată. Dacă folosim un câmp pentru data de
rulare î n tabelul cu filme vom obține date duplicate în tabel ceea ce nu este indicat. Tocmai
pentru a evita acest lucru am stabilit că este nevoie de un tabel unde sunt salvate datele de
rulare a filmelor.
După ce am stabilit tabelele de gestiune a filmelor am fost nevoit să stabilesc tabele
pentru sală prin urmare am folosit un tabel î n care salvez numărul sălii și numărul de
locuri. Dar pentru gestiunea unui cinematograf avem nevoie ș i de structura exact ă a sălii .
Dacă definim structura sălii î n același tabel în care am salvat sala obținem date redundante
pentru că , pentru aceeași sală avem ma i multe rânduri , fiecare rând î n parte având un
număr de locuri din acest motiv este nevoie de un tabel î n care să fie definit ă struc tura sălii
pentru fiecare sală î n parte.
După ce am definit primele două aspecte , respectiv sala și f ilmele , trebuie să
gestionăm și conturile . Prin urmare am folosit un tabel unde sunt sal vate conturile de
utilizator împreuna cu privilegiile contului.
Alt asp ect important de care trebuie să ținem cont este tabelul î n care sunt salvate
rezervările. Pentru realizarea apl icației software mi -am propus să folosesc un tabel unde
salvez biletele rezervate dar și biletele cump ărate. Diferența dintre un bilet rezervat și un
bilet cumpărat o va face o coloan ă numit ă generic “tip” unde se va salva tipul biletului
(cumpărat/ rezervat).
Prețul filmului este salvat î n tabela “filme” . Am implementat acea stă logic ă cu gândul
că filmele pot să difere ca preț nu doar după tipul lui (2D/ 3D), ci și după popularitatea lui,

13
sau, de ce nu, după anumite promoții . Cu toate acestea , am folosit și un tabel unde sunt
salvate tipurile de reduceri. Deși fiecare film are un anumit pre ț, acesta poate fi influențat
de categoria de preț prin urmare reducerea este salvat ă în tabelul unde avem categoriile de
preț.

Figură 4: Modelul conceptual

3.1.3 Modelul logic al bazei de date

După stabilirea m odelului conceptual am creat următoarele tabele : CONT, SALA,
RANDURI, FILME, REPREZENTATII, REZERVARE, REZERVARELOC, CATPRET.
Tabelul CONT este tabelul în care sunt stocate datele despre conturile de utilizator. În
acest tabel avem un câmp cheie , un câ mp p entru numele utilizatorului , unul pentru parola
acestuia și încă un câmp unde v a fi salvat tipul contului (administrator/ utilizator).
Tabelul CONT v a fi accesa t atunci când utilizatorul se v a conecta la aplicație. Dacă
utilizatorul introduce parola și nume le corect se va citi tipul contului și în funcție de tipul
contului , utilizatorul v a avea permisiuni depline asupra aplicației sau v a avea permisiuni
limitate.
• CONT [id_cont , User, Password, Permissions]

14
Tabelul SALA este tabelul în care sunt stocate sălile de cinema. În acest tabel avem un
câmp cheie , un câmp unde este stocat identificatorul sălii și un câmp unde este stocat
numărul de scaune din sală.
• SALA[ idSala , Numar, NrLocuri]
Tabelul RANDURI es te tabelul în care este descrisă fiecare sală în parte. În acest tabel
avem un câmp cheie , un câmp unde v a fi stocat identificatorul rândului (A, B, C , …) , un
câmp unde v a fi stocat numărul de scaune și cel mai important câmp este câmpul idSala
care definește o relație de 1 la n între tabelul SALA și tabelul R ANDURI.
• RANDURI[ idranduri , idSala , literarand, nrmax,]
Tabelul FILME este tabelul în care sunt st ocate date despre filme. Aici v a fi salvat
numele filmului , actorii principali , prețul filmului, genul filmului și descrierea acestuia.
• FILME[ idFilm , Nume, Pre t, Gen, Durata, Actori, Descriere]
Tabelul REPREZENTATII este tabelul care conține datel e de rulare a filmelor. Datorită
acestui tabel știm când și unde rulează un anumit film. Ac est tabel are două chei străine .
Prima cheie străină este idFilm care defineș te o relație de 1 la n între FILME ș i
REPREZENTATII , iar a doua cheie străin ă este id Sala care asemenea cheii idFilm , definește
o relație de 1 la n între SALA și REPREZENTATII.
• REPREZENTATII[ idReprezentatii , idFilm , idSala , Data, Ora]
Tabelul REZERVARE es te tabelul care stochează datele despre biletele rezervate și
biletele vândute. Diferența dintre biletele vândute și cele rezervate se v a realiza prin
intermediul unui câmp numit “tip ” care va stoca tipul biletului , dacă este cumpărat sau este
rezervat.
• REZERVARE[ idRezervare , idReprezentatii , Nume, Locuri, Tip, PretTotal]
Tabelul REZERVARELOC este tabelul care stochează toate locurile rezervate de pe un
anumit bilet.
• REZERVARELOC[ idrezervareloc , idRezervare , idcatpret , rand, loc]
Tabelul CATPRET este tabelu l în care sunt salvate categoriile d e prețuri (adult/
student/ copil)
• CATPRET[ idcatpret , denumire, reducere ]

15

Figură 5: Modelul logic

3.2 Proiectarea aplicației

Pentru p roiectarea aplicației am ales să folosesc un des ign câ t mai „curat” și ușor de
folosit de către orice u tilizator cu sau fără experiență .
Pentru realiza rea acestui lucru am convenit că o să pun accent mai mult pe fluxul
datelor , verificări ș i suportul oferit utilizatorului prin intermediul mesajelor.
Am folosit două clase principale : Conectare și licenta1.
Clasa „Conectare ” este clasa prin intermediul căreia se realizează conexiunea cu baza
de date , iar clasa licenta1 este clasa unde este interfața grafică împreună cu funcțiile ș i
variabilele necesare.

Figură 6: Clasa Conectare

16
Pe câ t de simplă pare clasa „Conectare” pe atât de compl icată o să pară clasa
licenta1. Deoarece am convenit să folosesc o singură clasă unde să implem entez toată
logica programului. Prin urmare, numărul de v ariabile ș i numărul de funcții este foarte
mare.

Figură 7: Clasa licenta1 -variabile

Figură 8: Clasa licenta1 -funcții

17

În figura 7 și în figura 8 se poa te vedea o mică parte din variabilele și funcțiile folosite
în clasa licenta1.
Am pus accent pe un design static pe partea de administrare a bazei de date unde
afișez sau ascund anumite panouri cu date. Majoritat ea panourilor au câ te un tabel cu
informații din baza de date și butoane care îi permit utilizatorului să facă modificări în baza
de date.
Pentru a crea o aplicație care să poată fi folosit ă de orice persoană cu sau fără
experiență am convenit, ca pe partea de administrare a bazei de date să folosesc multe
verificări pentru a asigura corectitudinea datelor introduse. În cazul oricărei aplicații este
bine să nu ne bazăm doar pe cazurile ideale și să tratăm utilizatorul ca o persoană fără
experiență care trebuie ghidată către rezolvarea problemelor atunci când este cazul.
Cum pe partea d e administrare a bazei de date am convenit să folosesc verificări
pentru a asigura buna funcționare a aplicației, și pe partea de rezervare sau cumpărare a
biletelor de cinema o să folosesc verificări cum ar fi: se va verifica dacă s -a sel ectat un film
pentru rezervarea sau cumpărarea biletelor , se va verifica dacă după ce avem filmul
selectat, avem și datele despre dată, oră, și sal a selectate.
Cum tot codul ce ține de interfața utilizatorului o să fie în aceeași clasă, automat o să
am variabile globale . Am hotărât că o să folosesc aceste variabile globale pentru a reține
cheile anumitor tabele.
Aplicația are o singura fereastra, unde se schimbă informațiile în funcție de acțiunile
utilizatorului . Pentru a face acest lucru o să folosesc un singur jPannel în care o să definesc
mai multe jLayeredPa ne. În fiecare jLayeredPane o să am anumite informații, spre exemplu
interf ața de selectare a filmelor o să fie de fapt un jLayere dPane în care o să definesc un
tabel în care o să afișez informațiile necesare. Pe lângă tabelul care afișează informațiile,
jLayeredPane -ul o să mai conțină butoanele ș i câmpurile text necesare pentru procesarea
informațiilor.
După ce am toate elementele necesare pentru afișarea datelor, voi folosi o funcție
pentru a selecta datele și a popula tabelul. Am gândit ca în aceasta metoda care va avea
convenția de nume „afisare_XXXXX ()” , să inițializez variabila globala ce memorează cheia
tabelului afișat. Spre exemplu avem cazul următor : utilizatorul apasă butonul pentru
administrarea filmel or, se ascunde jLayeredPane -ul curent și se afișează jLayeredPane -ul
care conține tabelul cu filme, butoanele și câmpurile necesare mentenanței filmelor după
care se afișează metoda „afisare_filme()” . În acest moment, variabila globală menită să
rețină che ia filmului se inițializează cu valoarea „ null ”. Dacă se dorește modificarea sau
ștergerea unui film, se verifică variabila ce memorează cheia filmului. Dacă aceasta este
„null” înseamnă că utilizatorul nu a selectat filmul ș i nu se poate modifica nimic. D acă
variabila ce memorează cheia filmului nu are valoarea „null” înseamnă că s-a selectat filmul

18
dorit din tabel, pe baza liniei obținut e din tabel în urma apăsării click stânga. Pentru a
înțelege mai bine fluxul logic al datelor se poate vizualiza figura 9.

Figură 9:Modificarea filmelor

Pentru ștergerea filmului se testează doar dacă avem selectat filmul (figura 10) . Dacă
este selectat filmul, ace sta se șterge din baza de date ș i se face iar selecția de date apelând
funcția de afișare a filmelor.

19

Figură 10:Ștergere film

Am hotărât să mă axez pe această logica și să o implementez în câ t mai multe locuri cu
putință pentru că în acest mod se pot evita erori ce pot apărea în urma neatenției
utilizat orului.
Un alt aspect foarte important este că două filme nu pot rula în același timp, la aceeași
dată în aceeași sala. Este ceva normal și foarte logic că două filme să nu poată rula simultan
la aceeași data, în aceeași sală la aceeași oră dar, utilizator ul chiar dacă are experiența în
întreținerea datelor din ba za de date poate face o greșeală iar astfel de greșeli pot fi foarte
grave mai ales dacă nu sunt depistate la timp. Putem doar să ne imaginăm ce confuzie s -ar
crea atunci când la un cinematograf se cumpără bilete pentru filme ce rulează în același
timp la aceeași sală . Ar ajunge clienț ii să intre î n sală, să ocupe locurile altor oameni după
care să realizeze că nu e filmul la care au făcut rezervare sau să fie filmul la care au făcut
rezerv are dar s ă vina altă persoană să afirme că locul este luat. Din acest motiv m -am
gândit s ă implementez următoarea logica : atunci când utilizatorul introduce sau modifică
data de rulare pentru un anumit film, se testează inițial dacă sunt câmpurile obligatorii

20
compl etat e; dacă nu sunt completate, nu se va adăuga sau nu se va insera nimic și un mesaj
de eroare în care utilizatorul este informat că nu a completat câmpurile obligatorii o să
apară pe ecran ; dacă utilizatorul a completat câmpurile obligatorii o să se test eze ca nici un
film să nu ruleze î n intervalul orar al filmului actual în sala selectată la ora selectată de
admin istrator. De asemenea trebuie să se țină cont și de durata filmului. Să presupunem că
filmul nostru are trei ore și testam ca în intervalul as ta de trei ore să nu existe înregistrări
în baza de date. Deci dacă filmul nostru începe la ora 16 :00 și se termina la 17 :00 și în baza
de date nu avem alt film care s ă aibă ora de rulare în intervalul orar 16 :00-17:00 nu este
îndeajuns s ă validăm testarea . Poate c ă nu este un film în intervalul orar dar este un film
care rulează la ora 15 :00 și durează 2 ore. Asta înseamnă că o să se intercaleze cu noul film,
din acest motiv trebuie o verificare mai amănunțită care să testeze filmele după durata lor.

Figură 11:Inserare reprezentație

21
Alt aspect foarte important de care am ținut cont în etapa de proiectare a aplicației a
fost modul în care afișez sala de cinema.
Am preferat să aleg o soluție fiabilă , din acest motiv m -am gândit să fac o afișare
dinamica în defavoarea unul layout prestabilit pe care utilizatorul final nu poate interveni.
Pentru afișarea dinamică a sălii de cinema o să selectez rândurile și numă rul de locuri
pentru fiecare rând. În momentul selecției o s ă contoriz ez numărul de rânduri, apoi, pentru
fiecare rând selectat o să adaug câte un buton cu aspectul unui scaun de cinema până când,
pe rândul respectiv se va regăsi un număr de scaune egal cu cel selectat din baza de date
pentru rândul curent după care trec la r ândul următor.
Deși sala este afișata dinamic și o s ă avem locul, rândul și toate informațiile necesare,
această logica aceasta are un mic dezavantaj, acela că aspectul nu o s ă reflecte realitatea în
sensul că în sala de cinema se poate s ă avem un spațiu d e 5 metrii între două scaune, pe
când în interfața grafică acele scaune vor fi apropiate. Dar având în vedere ca voi pune la
dispoziție toate instrumentele necesare pentru descrierea locurilor din sala de cinema,
acest lucru nu va fi o problemă și nici nu va pune în dificultate utilizatorul.

22
CAPITOLUL 4. IMPLEMENTARE

4.1 Medii de lucru utilizate

NetBeans IDE 8.0.2

NetBeans IDE este un mediu de dezvoltare disponibil pentru Windows, Linux, Mac și
Solaris folosit de programatori pe ntru scrierea, compilarea, depanarea, ș i instalare a
programelor. Deși este scris î n JAVA, în NetBeans se pot scrie programe folosind orice
limbaj de programare.
NetBeans este un IDE open -source cu o bază de utilizatori foarte mare și o comunitate
care este în continuă creștere. În NetBean s se pot dezvolta aplicații web , aplicații pentru
desktop sau aplicații mobile.
Natura modulară a mediului NetBeans oferă posibilitatea de a satisface cerințele
complexe prin combinarea a mai multor module mici, simple și u șor de folosit care
încapsulează caracteristicile anumitor aplicații .
Suportul tehnic oferit pentru fiecare versiune oferă asigurarea că modulele vor
funcționa împreună, î n timp ce controlul strict al API -urilor publice expuse de module va
ajuta la crea rea unei aplicați i mai flexibil e și mai ușor de întreținut.
Utilizatorii finali ai aplicației beneficiază de aplicații care permit instalarea de module.
Modulele NetBeans pot fi instalate, dezinstalate, activate și dezactivate în timpul
rulării, grație contai nerului de rulare.
Platforma NetBeans oferă o infrastructură pentru înregistrarea și recuperarea
implementărilor de servicii, permițându -ne să minimalizăm dependențele d irecte între
module individuale.
Platforma NetBeans oferă un sistem virtual de fișiere, care este un registru ierarhic
pentru stocarea setărilor de utilizator, comparabil cu Registry Windows pe sistemele
Microsoft Windows. Acesta include, de asemenea, un API unificat care oferă acces orientat
spre flux la structuri plate și ierarhice, cum ar fi fișierele pe disc , pe servere locale sau la
distanță, fișiere bazate pe memorie și chiar documente XML. [3]

23
MySQL Workbench 6.3 CE
MySQL Workbench este un instrument de proiectare a baze lor de date. Este un
instrument ușor de folosit datorită interfeței care ne permite să cream tabel ele atât prin
linie de cod cât ș i asistat prin intermediul interfeței.
Versiunea 6.3 MySQL Workbench a fost lansată în Martie 2015 și este ultima versiune
lansată. Versiune a 6.3 aduce în plus față de celela lte ver siuni o opțiune de migrare a
datelor, mai rapidă, din linia de comandă în loc de GUI, un generator de certificate SSL,
auto -completarea SQL a fost îmbunătățită, un nou wizard a fost introdus pentru importul și
exportul de date din tabel, și suport MySQL En terprise Firewall. [4]

4.2 Limbaje de programare folosite

JAVA

Java este un limbaj de programare de nivel înalt, dezvoltat de Sun Microsystems.
Java este definit ca un limbaj o rientat pe obiecte similar cu C ++, dar simplificat pentru
a elimina caracte risticile lingvistice care cauzează erori de programare obișnuite.
Obiect orientat înseamnă că software -ul este organizat ca o combinație de diferite
tipuri de obiecte care încorporează atât date cât și comportament.
Progr amarea orientată pe obiecte (POO ) este o metodologie care simplifică
dezvoltarea și mentenanța software -ului prin furnizarea unor reguli.
Conceptele de bază ale POO sunt:
• Obiect
• Clasă
• Moș tenire
• Polimorfismul
• Abstractizare
• Încapsulare

1) Obiectul este conceptul fundamental care st ă la baza programării orientate pe
obiecte.
Obiectul este un model software al unui concept din realitate. Obiectele din lumea
real ă au două car acteristici în comun : stare ș i acțiuni ce pot fi executate de obiect sau
asupra lui .
Starea se refer ă la anumite caracte ristici ale obiectului , cum ar fi: culoare , tip etc.
Acțiunea sau comportamentul se refera la faptul c ă starea obiectului poate fi
influențat ă de anumite acțiuni î n urma cărora starea obiectului se schimb ă. Spre

24
exemplu un ventilator care este oprit , la un moment dat este pornit , automat ace astă
acțiune schimb ă starea ventilatorului din oprit în starea de funcționare.
Așa cum un obiect din lumea real ă are o stare și un comportament , obiectele dintr -un
limbaj de programare au atribute și metode. Atributele s unt folosite pentru a
caracteriza starea obiectului respectiv la un moment dat , iar metodele sunt folosite
pentru a altera starea obiectului așa cum la un obiect din lumea reală starea se
alter ează î n urma schimbării de comportament al obiectului sau î n ur ma execuției
unei acțiuni.

2) Clasa este o colecție de o biecte cu același comportament ș i aceleași caracteristici.
Spre exemplu avem obiectul ventilator. Putem s ă definim clasa ventilator unde vom
avea ca ș i caracteristici culoarea ventilatorului, tipul ventilatorului și energia
consumat ă de ventilator apoi avem ș i metodele clasei care definesc de fapt
comportamentul acestuia.

3) Moștenirea este mecanismul prin care o clasă preia datele și metodele altei clase la
care adaugă e lemente specifice noii clase . Să pres upunem ca avem clasa automobil ș i
clasa be rlină care moștenește metodele ș i atributele cl asei automobil, dar la r ândul ei ,
clasa berlină vine cu elemente specifice.
Moște nirea este de două tipuri : moștenire simpla și moștenire multiplă.
În cazul m oștenirii simple , clasa derivată preia atributele ș i metodele de la o singură
clasă pe când, în cazul moștenirii multiple, clasa derivată prei a atribute ș i metode de
la mai multe clase.

4) Polimorfismul este abilitatea unei metode de a avea comportament diferit î n
funcție de parametrii de intrare. Mai bine zis , polimorfismul reprezintă abilitatea unui
obiect de a lua mai multe form e.

5) Abstractizarea exprimă toate caracteristicile esenț iale ale unui obiect care fac ca
acesta să se distingă de alte obiec te.

6) Încapsularea este conceptul prin intermediul căruia se asigur ă consisten ța stării
unui obiect. Consisten ța stării unui obiect se realizează prin ascunderea
implementării faț ă de client.

25

SQL

SQL (Structured Query Language ) este limbajul stan dard folosit pentru manipularea ,
inserarea ș i selectarea datelor dintr -o baza de date.
A devenit un standard în domeniu (standardizat ANSI -ISO), fiind cel mai po pular
limbaj utilizat pentru cr earea, modificarea, regăsirea și manipula rea datelor de către SGB D-
urile (Sistemele de Gestiune a Bazelor de Date) relaționale. Pe lângă versiunile
standardizate ale limbajului, există o mulțime de dialecte și variante, unele proprietare,
fiind specifice anumitor SGBD -uri și de asemenea conținând exte nsii pentru a suport a SBD –
urile (Sistemele de Baze de Date) obiectu ale(obiectual -relaționale). [6]
Ce poate face SQL?

• SQL poate executa interogări asupra unei baze de date
• SQL poate prelua date dintr -o bază de date
• SQL poate insera înregistrări într -o bază de date
• SQL poate ac tualiza înregistrările dintr -o bază de date
• SQL poate șterge înregistrări dintr -o bază de date
• SQL poate crea noi baze de date
• SQL poate crea noi tabele într -o bază de date
• SQL poate crea proceduri stocate într -o bază de date
• SQL poate crea vizualizări(vie ws) într -o bază de date
• SQL poate stabili permisiuni pe tabele, proceduri și vizualizări

HTML

HyperText Markup Language (HTML) este un limbaj folosit pentru a crea pagini WEB.
Deși clasicul cod HTML, are tagurile între paranteze unghiulare(</ >), acesta poate
crea probleme și d e aceea, în NetBeans s -a mai ad ăugat încă o convenție pentru tagurile de
HTML, acestea fiind paranteze pătrate([/ ]).
De asemenea pentru programul NetBeans, s -a creat un Plugin de HTML, care permite
vizualizarea codului și rezultatul acestuia. Tot în NetBeans pot fi create proiecte HTML/
JavaScript, car e au deja scheletul predefin it și fișierele sursă, fără a mai fi neces ar să le
creăm noi.
În cazul de față , am folosit limbajul HTML pentru formatarea anumitor texte afișate în
interfața utilizatorului.

26
4.3 Implementarea aplicației

În implementarea aplicației am pus accent pe rezo lvarea problemelor evidențiate î n
capitolu l 2.
Am început prin implementarea interfeței de autentificare.

Figură 12: Interfață autentificare
După cum se poate observa î n figura 11, interfața de autentificare este foarte simplă
de utilizat. Am folosit un jTextField pentr u câmpul unde se va completa utilizatorul și un
jPasswordField pentru câmpul unde se va completa parola. Atunci când va completa
câmpul destinat numelui de utilizator scrisul va fi vizibil , pe când, atunci când va introduce
parola, aceasta va fi ascuns ă datorit ă câmpului de tipul jPasswordField .
În cazul în care utilizatorul are privilegii de adm inistrator, meniul va ar ăta ca î n figura
13, iar în cazul în care utilizatorul nu are privilegii de adm inistrator, meniul va ar ăta ca î n
figura 1 4.

Figură 13: Meniu administrator

27

Figură 14: Meniu utilizator

După cum se poate vedea î n figura 1 3 și figura 1 4, diferența dintre utilizatorul cu
permisiuni de administrator și utilizatoru l fără permisiuni de administrator este aceea că
administratorul are acces la administrarea filmelor, a sălilor de c inema ș i a conturilor.
Pentru admi nistrarea filmelor , a sălilor ș i a conturilor am folosit în mare parte
aceleași elemente comune astfel în cât utilizatorului să îi fie foarte simplu să utilizeze
aplicația.

Figură 15: Administrarea filmelor

După cum se poate vedea în pa noul de administrare a filmelor , am folosit un tabe l
pentru afișarea informațiilor , trei butoane specifice fiecărui panou folosit pentru

28
mentenanța bazei de date , și anume butonul de adăugare, de modificare și de ștergere a
înregistrărilor din baza de date.
Pentru a adăuga un film în baza de date, utilizatorul trebuie să completeze câmpurile
obligato rii. Aceste câmpuri sunt notate cu o steluța roșie ca utiliz atorului să îi fie mai
simplu să le iden tifice.
În cazul în care utilizatorul nu completează unul din câmpurile obligatorii, acesta v a
primi un mesaj de eroare iar î n baza de date nu se va insera filmul până ce utilizatorul nu
completează câmpurile obligatorii.
În cazul în care utilizatorul dorește să modifice un film existent, trebuie să selecteze
filmul dorit din tabel , în cazul în care nu a selectat filmul din tabel și apasă butonul pentru a
mod ifica filmul, utilizatorul va primi un mesaj de eroare . Același lucru se va întâmpla în
cazul în care utilizatorul se lectează filmul dar șterge un câ mp obligatoriu după care apasă
butonul pentru modificarea filmului.

Figură 16: Mesaj de eroare
De asemenea când utilizatorul introduce un nou film se testează ma i întâi ca filmul să
nu existe în baza de date. În cazul î n care exista deja, filmul nu este introdus și utilizatorul
primește un mesaj prin care este informat că fi lmul exist ă în baza de date.
Pentru a asigura corectitudinea datelor introduse , am implementat ca pentru
câmpurile de preț ș i de durată a filmului să se poată introduce doar numere cu condiția ca
numărul introdus nu începe cu cifra zero. În cazul î n care u tilizatorul va introduce o literă
sau un caracter nepermis, acest a va primi o avertizare sonor ă și câmpul nu se va completa.
Pentru a implementa acest comportament am declarat o metod ă declanșată de utilizator
când introduce date pe câmpurile respective.

private void add_pret_filmKeyTyped(java.awt.event.KeyEvent evt) {
// TODO add your handling code here:
String new_Str = "";
char c = evt.getKeyChar();
if (!((c >= '0') && (c <= '9' )
|| (c == java.awt.event.KeyEvent.VK_BACK_SPACE)
|| (c == java.awt.event.KeyEvent.VK_DELETE))) {
char a, b;
b = Character.MIN_VALUE;;
a = c;
getToolkit().beep();

29
evt.consume();
String txt = add_pret_film.getText();

txt.replace(c, b);
add_pret_film.setText(txt);//new_Str);
};
if (c == '0') {
char p;
char a, b;
b = Character.MIN_V ALUE;

String txt = add_pret_film.getText();
p = txt.charAt(0);
if (p == 0) {
txt.replace(p, b);
};
add_pret_film.setText(txt);
};
}

Pentru panoul de administrare datei de rulare am folosit câteva e lemente care nu se
regăsesc și î n panoul de administrare a filmelor. Din elementele noi fac parte un
jDateChooser , două jComboBox și un jSpinner .
Pentru a alege data , utilizatorul poate utiliza jDateChooser -ul (figura 1 7). Pentru
selectarea orei se poate utiliza jSpinner -ul iar pentru selectarea s ălii se poate selecta unul
din cele două jComboBox -uri. Al doilea jComboBox este folosit pentru selectarea filmului.

Figură 17: Input dată + oră + sală
Așa cum pentru panoul de administrare a filmelor am folosit verificări pentru a
asigura corectitudinea datelor, am implementat anumite verificări și pentru panoul de
administrare a datei de rulare . Printre verif icările implementate se enu meră : verificare ca
pentru data, ora și sala selectată nu mai rulează un film , verificarea ca toa te câmpurile să fie

30
completate î n momentul adăugării unei noi reprezentații și verificarea ca la m odificarea
unei reprezentații să fie selectată reprezentația respectiv ă din tabel .
Restul panourilor de administrare a datelor sunt asemănătoare cu panoul de
administrare a filmelor. Toate au verificările necesare pentru a asigura corectitudinea
datelor introduse.

Primul lucru pe care utilizatorul îl vede este p anoul principal. În acest panou (figura
18), utilizatorul vede filmele pe săptămâna curent ă și poate selecta un anumit film î n
vederea vânzării sau rezervării de bilete sau poate vizualiza reze rvările existente î n baza de
date .

Figură 18: Interfață „home”

După selectarea filmului și apăsarea butonului „pasul următor”, utilizatorul este
ghidat către selectarea datei și a sălii de rulare după care este ghidat către alegerea tipului
de reduce re și a nu mărului de locuri ca în final să fie afișata sala (figura 1 9).
Una din părțile mai speciale ale aplicației este reprezentarea grafică a sălii de cinema
care este complet dinamic ă și depinde de descrierea sălii de cinema. Mai exact de numărul
de rânduri ș i num ărul de locuri al fiecărui rând.

31

Figură 19: Interfață – sală

Pentru a face posibila afișarea dinamic ă a sălii de cinema, am folosit următorul
algoritm.

///// ///////////PAS URMATOR – AFISAREA SALII/////////////////////////////
/////////////// ///////////////////////////////////////////////////////////
private void jButton19ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int locuri = 0;
nr_scaune = 0;

String loc = combo_adult.getSelectedItem().toString();
locuri = Integer.parseInt(loc);
loc = combo_student.getSelectedItem().toString();
locuri = locuri + Integer.parseInt(loc);
loc = combo_copil.getSe lectedItem().toString();
locuri = locuri + Integer.parseInt(loc);
nr_scaune = locuri;
nr_comp = 0;

if (locuri == 0) {
JOptionPane.showMessageDialog(null, "Pentru a trece mai departe selectati un numar de locuri" );
} else {

//////////////////////////////////////////////////////////////////////////
//////////////SCAUNE REZERVATE -SELECTIE////////////////////////////////

32
//////////////////////////////////////////////////////////////////////////
String idSala = null, idReprezentatii = null;
String LocuriRezervate = null;
try {
ResultSet rs = null;
PreparedStatement pst = null;
String com = "select idSala from sala where Numar = '"
+ combo_sala.getSelectedItem().toString() + "' ;";

pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {
idSala = rs.getString("idSala ");

}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

try {
ResultSet rs = null;
PreparedStatement pst = null;
String c om = "select idReprezentatii from reprezentatii where idSala = '"
+ idSala + "' and Data ='" + combo_data.getSelectedItem().toString() + "' and Ora ='" +
combo_ora.getSelectedItem().toString() + "' and idFilme ='" + cod_film_bilet + "' ;";

pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {
idReprezentatii = rs.getString("idReprezentatii");

}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

try {
ResultSet rs = null;
PreparedStatement pst = null;
String com = "select Locuri from rezervare where idReprezentat ii = '"
+ idReprezentatii + "' ;";

pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {

33
if (LocuriRezervate == null) {
LocuriRezervate = rs.getString("Locuri");
} else {

LocuriRezervate = LocuriRezervate + ";" + rs.getString("Locuri");
}

}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

//////////////////////////////////////////////////////////////////////////
pannel_cinema.removeAll();
pannel_cinema.add(jLabel32);
pannel_cinema.add(jLabel33);
pannel_cinema.add(jLabel34);
pannel_cinema.add(jLabel35);
pannel_cinema.add(jButton20);
pannel_cinema.add(jButton21);
jLabel35.setText("");
String rand = null;
ArrayList<St ring> randuri = new ArrayList<String>();
ArrayList<String> nrmax = new ArrayList<String>();
int nrranduri = 0;
try {
ResultSet rs1 = null;
PreparedStatement pst1 = null;
String com1 = "select * from randuri where idSala ='"
+ idSala + "' order by literarand asc ;";

pst1 = con.prepareStatement(com1);
rs1 = pst1.executeQuery();
while (rs1.next()) {
nrranduri = nrranduri + 1;
randuri.add(rs1.getString("literarand"));
nrm ax.add(rs1.getString("nrmax"));
}
} catch (Exception e) {
JOptionPane.showMessageDialo g(null, e);
}
pannel_locuri.setVisible(false);
pannel_cinema.setLocation(10, 10);
pannel_cinema.setVisible(true);

int y = 0;

34

int width = pannel_cinema.getWidth();

for (i nt i = 0; i < nrranduri; ++i) {

y = y + 40;
int aux = Integer.parseInt(nrmax.get(i));
int res = (width – ((aux * 30) + (aux + 1) * 10)) / 2;
int x = res;
JLabel _lbl = new JLa bel(randuri.get(i));
_lbl.setBounds(10, y, 30, 30);
pannel_cinema.add(_lbl);

for (int j = 0; j < aux; j++) {

int nr = j + 1;
String numebtn = randuri.get(i) + nr;
JButton btn = new JButton(numebtn);

btn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
LOCActio nPerformed(evt);
}
});

btn.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
btnMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
btnMouseExited(evt);
}
});

x = x + 40;

//TESTAM DACA AVEM LOCURI REZERVATE
if (LocuriRezervate != null) {
for (String retval : LocuriRezervate.split(";")) {

//BUTOANELE REZERVATE DEVIN ROSII
if (retval.equals(numebtn)) {
btn.setBackground(Color.RED);
}
}
if (btn.getBackground().equals(RED)) {
} else {

35
btn.setBackground(Color.darkGray);
}
} else {
btn.setBackground(Color.darkGray);
}
btn.setForeground(new Color (255, 255, 255, 0));
btn.setFocusPainted(false);
btn.setBounds(x, y, 30, 30);
pannel_cinema.add(btn);

buttons[i] = btn;
}
}
}
}

Dup ă cum se poate vedea în codul de mai sus, logica de afișare a sălii este următoarea:
se verifică în primul rând dacă utilizatorul a selec tat un anumit număr de locuri, d acă nu a
selectat numărul dorit de locuri, un mesaj va apărea pe ecran pentru a atențio na
utilizatorul că nu a ales un număr de locuri, d acă utilizatorul a ales un număr de locuri, se
selectează locur ile rezervate din baza de date ș i sunt salvate într -un șir de caractere, fie care
loc fiind separat de „ ; ” . După ce am selectat toate locurile rezervate am șters toate
componentele din interfața în care se afișează sala de cinema și am reinițializat
componentele statice. A fost necesar acest lucru pentru că în cazul în care utilizatorul
rezervă locuri dintr -o anumită sală apoi schimbă sala , locu rile s -ar suprapune. Ca să evit
acest lucru am șters toate componentele de pe ecran, am rein ițializat componentele statice
și am continuat către inițializarea sălii.
După reinițializarea componentelor am selectat toate rândurile din sala aleasă
împreună cu numărul de locuri pentru fiecare rând și am salvat numărul total de rânduri .
Odată ce am avut toate datele ce descriu sala , am adăugat î n interfaț ă rândurile cu
scaunele din sală. Fiecare scaun este de fapt un buton formatat astfel încât să semene cu un
scaun de cinema. Pentru fiecare rând am adăugat un text pentru a informa utilizatorul de
litera rândului.
Fiecare buton ce reprezintă scaunele din sală are cate o metodă care se declanșează
atunci când utilizatorul mută cursorul deas upra lui ș i o metodă care se declanșează atunci
când utilizatorul selectează un scaun.
Am folosit aceste metode pentru a scăpa de orice confuzie ce se poate crea din
aranjarea sălii de cinema. Astfel , atunci când cursorul este deasupra unui loc, utilizatorul va
știi exact des pre ce loc este vorba, iar atunci când utilizatorul selectează un loc, acesta va fi
afișat pe ecran la locurile salvate (figura 20).

36

Figură 20: Locuri selectate
Am utilizat aceeași metod ă care salvează locurile selectate pentru a schimba culoarea
scaunelor. Dac ă scaunul pe care utilizatorul a dat click are culoarea gri înseamnă c ă acesta
se poate rezerva și devine verde. Dacă scaunul are culoarea verde, înseamnă ca locul este
deja selectat de utilizator și se poate deselecta. În cazul în care scaunul are culoarea roșie,
scaunul nu se poate selecta pentru că este deja rezervat.
În final, după ce utilizatorul selectează toate locurile, poate să vândă biletele clientului
sau le poate rezerva. Pentru a realiza acest lucru, am impleme ntat două butoane. Un buton
pentru rezervare și un buton pentru a vinde biletele (figura 21).

Figură 21: Butoane vânzare/rezervare
Dacă se selectează butonul de rezervare, utilizatorul, în cazul nostru vânzătorul de
bilete o să fie nevoit s ă introducă numele pe care se face rezervarea

37
CAPITOLUL 5. TESTAREA APLICAȚIEI

5.1 Scopul testării

Scopul principal al testării este acela de a identifica și a corecta erorile existente dar și
de a evita apariția neprevăzut ă a erorilor.
Testarea este un pas foarte important în implementarea oricărui program software.
Prin intermediul testării se asigură c ă aplicația funcționează conform specificațiilor
clientului. Rezultatul unei aplicații testate prea puțin sau deloc poate fi fatal în anumite
cazuri sau poate cauza mari pierderi financiare.
În cazul unei aplicații de vânzare a biletelor de cinema, lipsa testării aplicației sau
testarea insuficient ă poate duce la mari pierderi financiare din partea cinematografului
întrucât, în lipsa unei testări nu se pot evidenția posibilele erori. Nu este de ajuns să
implement ăm aplicația într -o manieră în care tot codul este scris bine , fără erori de sintaxă
și logic ca și funcționare din orice punct de vedere , pentru c ă aplicația, mai bin e spus codul
scris, poate avea un comportament neprevăzut în timpul rulării.

5.2 Strategia de testare

Am testat aplicația încă de la începutul implementării. La fiecare pas al implementării
am testat aplicația și în urma obținerii unei erori am folosi t debuggerul pentru a identifica
pasul la care se obține eroarea. În mare parte, erorile au apărut din cauza comenzilor SQL
scrise greșit.
În continuare am testat la fiecare pas al implementării și am pus accent pe testarea
comenzilor SQL. Spre exemplu pe ntru afișarea reprezentațiilor pe partea de administrare a
bazei de date, am obținut următoarea comand ă SQL urmărind debuggerul : “select
sala.numar , reprezentatii.Data , reprezentatii.Ora , reprezentatii.idSala from reprezentatii
inner join sala on sala .idSala = reprezentatii.idSala where reprezentatii.idFilme = '11' ; ”
(figura 22) .

Figură 22: Comandă SQL

38
După ce comanda a fost rulată cu succes, am comparat datele obținute în aplicație cu
datele obținute în urma executării comenzii SQL direct în MySQL Workbench.
Rezultatele se pot vedea în figura 2 3.

Figură 23: Testare – corectitudinea datelor

La finalul implementării, toate erorile depistate au fost rezolvate și am început să
folosesc ca tehnic ă de te stare testarea utilizabilit ății(Usability Testing). Pentru a folosi
aceast ă tehnic ă m-am pus în pielea unui utilizator fără experiență care nu citește
instrucțiunile.
Am început să testez partea de administrare a bazei de date. Am testat în primul râ nd
inserarea datelor în baza de date. Am evitat s ă completez toate câmpurile pentru a observa
comportamentul. Toate verificările implementate au funcționat întrucât de fiecare dată
când am omis s ă completez un câmp obligatoriu am primit un mesaj de eroare (figura 2 4).

Figură 24: Mesaj de eroare
În cazul acesta nu pot apărea erori din cauza omiterii complet ări anumitor c âmpuri.
În continuare am testat câmpurile ce așteaptă date numerice și toate testele au trecut,
întrucât mi -a fost imposibil s ă introduc date greșite.
Următorul aspect testat a fost modificarea datelor fără a selecta ce date se doresc a fi
modificate. Ca și î n cazul anterior, testele au trecut cu succes întrucât mi -a fost imposibil s ă
modific datele fără să le selec tez din tabel. De fiecare dat ă când am încercat s ă modific f ără
să selectez datele dorite am primit un mesaj de eroare. Fără altă modalitate de a modifica
datele, utilizatorul va fi nevoit s ă citească mesajul și va înțelege ce este de facut pentru
rezolvar ea problemei.

39
5.3 Rezultatul testării

Rezultatul a fost un succes deoarece anumite erori neprevăzute au fost identificate în
urma testelor.
Toate erorile identificate în urma testărilor au fost corectate evitându -se în acest mod
posibilele c ăderi ale aplicației sau funcționarea incorectă a aplicației ce poate duce la
pierderi financiare.
În urma testelor bine efectuate se poate asigura calitatea superioară a aplicației
software.

40
CONCLUZII

Obiectivul lucrării a fost crear ea unei aplicații de tipul aplicațiilor box office pentru
vânzarea și rezervarea biletelor de cinema.
Am observat soluțiile software existente și caracteristicile lor după care am evidențiat
nevoile oricărui cinematograf.
Ținând cont de ceea ce oferă aplic ațiile box office existente și de nevoile oricărui
cinematograf am creat o aplicație de tipul aplicațiilor box office care permite vânzarea sau
rezervarea biletelor de cinema și administrarea bazei de date.
Aplicația este ușor de utilizat și îndeplinește n evoile de bază ale cinematografului.
Consider că scopul lucrării a fost atins și c ă aplicația este o soluție bun ă pentru
vânzarea si rezervarea biletelor de cinema. Este o aplicație ce poate fi folosit ă de orice
utilizator indiferent de cunoștințele acestu ia. Deși aplicația nu impresionează prin interfața
grafică, care nu este foarte atractiv ă, fluxul de date și verificările folosite pentru aplicație
sunt foarte complexe.
De asemenea, deși scopul lucrării a fost atins întrucât aplicația acoperă nevoile de
bază ale unui cinematograf, multe îmbunătățiri pot fi aduse aplicației. Printre
îmbunătățirile ce pot fii aduse aplicației se enumer ă următoarele :
• Reprezentare a grafică a sălii care să descrie mult mai bine sala.
• Interfața grafică care se poate ajusta î n funcție de rezoluția monitorului.
• Opțiune de a scana codul de bare de pe bilete.
• Interfața grafică mult mai atractivă.

41
BIBLIOGRAFIE

• [1] http://www.cs.ubbcluj.ro/~v cioban/Matematica/Anul3/BD/Bd.pdf
• [2]http://referat.clopotel.ro/Sisteme_de_gestiune_a_bazelor_de_date_S_G_B_D_ –
7924.html
• [3]http://netbeans.org/fetures/platform/features.html
• [4] https://en.wikipedia.org/wiki/MySQL_Workbench
• [5]https://inf.ucv.ro/~mihaiug/courser/poo/slides/Curs%2006%20 –
%20Mostenire.pdf
• [6]https://ro.wikipedia.org/wiki/SQL

42
ANEXA 1 . MANUAL DE UTILIZARE

În momentul în care utilizatorul pornește aplicația, va apărea următoarea fereastră.
(figura 2 5)

Figură 25: Interfață aplicație
În această interfața utilizatorul va fi nevoit să introducă un cont și o parolă corectă
pentru a p utea folosi aplicația.
După ce va introduce datele corecte, atât utilizatorul cu privilegii de administrator cât
și cel fără privilegii de administrator va vedea următoarea fereastră. (figura 2 6)

43

Figură 26: Interfață – home
De a ici utilizatorul poate să selecteze unul din filmele care rulează săptămâna curentă
la cinematograf și să urmeze pasul următor către vânzarea sau rezervarea de bilete. După
apăsarea butonului care duce către pasul următor, pe ecran vor apărea următoarele
informații.

Figură 27: Informații film

44
În această fereastră, utilizatorul se poate informa cu privire la genul filmului, la durata
acestuia, etc. Pentru a trece mai dep arte, este nevoie ca data, ora și sala să fie selectate.
După ce utilizatorul a selectat toate informațiile necesare, acesta poate continua către
selectarea numărului de locuri în funcție de tipul de bilet.(figura 2 8)

Figură 28: Tipuri de bilete
După selectarea numărului de bilete, utiliza torul o să poată vedea sala de cinema.
Aici el poate selecta locurile libere la apăsarea unui click și poate deselecta locurile
deja alese în caz că dorește alt loc. Locurile selectate împreună cu locul aflat sub cursor vor
fi afișate pe ecran în stânga jo s.(figura 2 9)

45

Figură 29: Sală de cinema

După selectarea locurilor, utilizatorul poate să cumpere, în cazul nostru să vândă
biletele de cinema sau să le rezerve. Pentru a vinde sau a rezerva bilete, utilizatorul poate
folosi but oanele din dreapta jos a ecranului. Butonul de jos este folosit pentru rezervare, pe
când cel de deasupra butonului de rezervare se folosește atunci c ând clientul aflat la
casieria cinematografului dorește să cumpere biletul.
Pentru a administra baza de d ate, utilizatorul trebuie să aibă permisiuni de
administrator. Dacă are permisiuni de administrator, acesta va avea acces la meniul de
administrare a bazei de date (figura 30).

Figură 30: Meniu administrator
În acest meniu, util izatorului îi sunt puse la îndemână instrumentele necesare pentru
a întreține baza de date. Acesta are următoarele opțiuni: poate să adauge filme, poate să
seteze data, sala și ora la care rulează un anumit film, poate să adauge săli și poate să
modifice s tructura sălilor, de asemenea mai poate să creeze conturi sau să modifice
conturile existente.

46
Pentru administrarea bazei de date, utilizatorul are trei opțiuni. Adăugare, modificare
sau ștergere (figura 31).

Figură 31: Administ rarea filmelor
Pentru adăugarea unui film nou, câmpurile obligatorii trebuie să fie completate după
care se apasă butonul „Adaugare”. După apăsarea butonului, filmul nou introdus va fi vizibil
în tabelul filmelor.
Pentru modificarea unui film, trebuie ca f ilmul să fie selectat. Pentru a selecta un film,
cursorul trebuie să fie plasat deasupra filmului dorit după care se selectează folosind click
stânga (figura 32).

Figură 32: Film selectat
După selectarea filmului, câmpurile pentr u informațiile filmului vor fi populate cu
informațiile filmului selectat. Pentru a modifica o anumită informație , se modifica câmpul
respectiv și se apasă butonul de modificare (figura 33).

47

Figură 33: Modificarea filmului
Pentru a șterge o înregistrare se urmează aceeași pași ca la modificare. Se selectează
înregistrarea care se dorește a fi ștearsă, se apasă butonul „Stergere” după care se poate
vedea în tabel rezultatul ștergerii.

48
ANEXA 2 . SURSELE PR OGRAMELOR

1) Metode de afișare a datelor

///////// ////////////////////////////////////////////////////////////////////////////
///////////////// ////////////AFISAREA HOME///////////////////////////////////////////
//////////////// /////////////////////////// //////////////////////////////////////////
public void afisare_home() {

cod_film_bilet = "";
film_curent = "";
// Get calendar set to current date and time
Calendar c = GregorianCalendar.getInstance();

System.o ut.println("Current week = " + Calendar.DAY_OF_WEEK);

// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Current week = " + Calendar.DAY_OF_WEEK);

// Print d ates of the current week starting on Monday
DateFormat df = new SimpleDateFormat("dd -MM-yyyy",
Locale.getDefault());
DateFormat df2 = new SimpleDateFormat("yyyy -MM-dd",
Locale.getDefault());
String startDate = "", endDate = "", iniD ate = "", finDate = "";

startDate = df.format(c.getTime());
iniDate = df2.format(c.getTime());
c.add(Calendar.DATE, 6);
endDate = df.format(c.getTime());
finDate = df2.format(c.getTime());

System.out.printl n("Start Date = " + startDate);
System.out.println("End Date = " + endDate);
jLabel19.setText(startDate + " / " + endDate);

//pannel_filmesaptamana.setLocation(50, 50);
modelTabFilme.setRowCount(0);
try {
ResultSet rs = null;
PreparedStatement pst = null;
String com = "select distinct filme.Nume from filme "
+ "inner join reprezentatii on reprezentatii.idFilme =
filme.idFilme "

49
+ "WHERE (repr ezentatii.Data >= '" + iniDate + "' AND
reprezentatii.Data <= '" + finDate + "')";
pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {
modelTabFilme.addRow(new Object[]{rs.getStr ing("filme.Nume")});
}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
TabFilme.setModel(modelTabFilme);

pannel_filmesaptamana.setVisible(true);
pannel_datafilm.setVisible( false);
pannel_cinema.setVisible(false);
pannel_rezervari.setVisible(false);
}

/////////////////////////////////////////////////////////////////////////////////////
//////////////////////AFISAREA REPREZENTATIILOR IN TABEL///////////// ///////////////
/////////////////////////////////////////////////////////////////////////////////////

public void afisare_reprezentatie() {
modelTabData.setRowCount(0);
String film_curent = filme_combo.getSelectedItem().toString();

try {
ResultSet rs = null;
PreparedStatement pst = null;
String com = "select idFilme from filme where Nume ='" +
film_curent + "' ;";
pst = con.prepareStatement(com);
rs = pst.executeQuery( );
if (rs.next()) {
cod_film = rs.getString("idFilme");

}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

try {
ResultSet rs = null;
PreparedStatement pst = null;

50
String com = "select sala.numar , reprezentatii.Data ,
reprezentatii.Ora , reprezentatii.idSala from reprezentatii"
+ " inner join sala on sala.idSala = reprezentatii.idSala "
+ " where reprezentatii.idFilme = '" + cod_film + "' ;";
pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {
modelTabData.addRow(new
Object[]{rs.getString("reprezentatii.Data" ), rs.getTime("reprezentatii.Ora"),
rs.getString("sala.numar")});
}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
TabData.setModel(modelTabData);
cod_reprezentatie = "";
}

2) Selecții de date

/////////////////////////////////////////////////////////////////////////////////////
////////// /////////SELECTIA CON TULUI DIN TABEL// ////////////////////////////////////
////////////////////////////////////////////////////////////////////// ///////////////

private void selectie_cont(int i) {
try {
utilizator_cont.setText(modelTabConturi.getValueAt(i,
0).toString());
privilegii_cont.setSelectedItem(modelTabConturi.getValueAt(i,
1).toString());

try {
ResultSet rs = null;
PreparedStatement pst = null;
String com = "select * from cont where User ='" +
modelTabConturi.getValueAt(i, 0).toString() + "';";
pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {
parola_cont.setText(rs.getString("Password"));

cod_cont = rs.getString("idCont");
}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);

51
}

} catch (Exception e) {
System.err.println(e);
JOptionPane.showMessageDialog(null, "Eroare de selectare" +
e.getLocalizedMessage());
}

}

/////////////////////////////////////////////////////////////////////////////////////
////////// /////////SELECTIA FILMULUI PE SAPTAMANA CURENTA/////// /////////////////////
/////////////////////////////////////////////////////////////////////////////////////
private void selectie_filmsaptamana(int i) {
try {
film_curent = modelTabFilme.getValueAt(i, 0).toString();

durata_film.setText("");
gen_film.setText("");
actori_film.setText("");
descriere_film.setText("");

//privilegii_cont.setSelectedItem(modelTabConturi.getValueAt(i,
1).toString());
try {
ResultSet rs = null;
PreparedStatement pst = null;
String com = "select * from filme where Nume ='" + film_curent
+ "';";
pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {
cod_film_bilet = rs.getString("idFilme");
durata_film.setText(rs.getString("Durata") + " MIN");
gen_film.setText(rs.getString("Gen"));
actori_film.setText(rs.getString("Actori"));
descriere_film.setText("<html>" + rs.getString("Descriere ")
+ "</html>");
}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

} catch (Exception e) {
System.err.println(e);

52
JOptionPane.showMessageDialog(null , "Eroare de selectare" +
e.getLocalizedMessage());
}

}

3) Acțiune pe buton

////////////////////////////////////////////////////////////////////////////////
///////////////////////PAS URMATOR – AFISAREA SALII/////////////////////////////
////////////////////////////////////////////////////////////////////////////////
private void jButton19ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int locuri = 0;
nr_scaune = 0;

String loc = combo_adult.getSelectedItem().toString();
locuri = Integer.parseInt(loc);
loc = combo_student.getSelectedItem().toString();
locuri = locuri + Integer.parseInt(loc);
loc = combo_copil.getSelectedItem().toString();
locuri = locuri + Integer.parseInt(loc);
nr_scaune = locuri;
nr_comp = 0;

if (locuri == 0) {
JOptionPane.showMessageDialog(null, "Pentru a trece mai departe
selectati u n numar de locuri");
} else {

////////////////////////////////////////////////////////////////////////////////
//////////////////////SCAUNE REZERVATE -SELECTIE////////////////////////////////
/////////////////////////////////////////////////////// /////////////////////////
String idSala = null, idReprezentatii = null;
String LocuriRezervate = null;
try {
ResultSet rs = null;
PreparedStatement pst = null;
String com = "select idSala from sala where Numar = '"
+ combo_sala.getSelectedItem().toString() + "' ;";

pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {

53
idSala = rs.getString("idSala");

}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

try {
ResultSet rs = null;
PreparedStatemen t pst = null;
String com = "select idReprezentatii from reprezentatii where
idSala = '"
+ idSala + "' and Data ='" +
combo_data.getSelectedItem().toString() + "' and Ora ='" +
combo_ora.getSelectedItem().toString() + "' and idFilme ='" + cod_film_bilet + "' ;";

pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {
idReprezentatii = rs.getString("idReprezentatii");

}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

try {
ResultSet rs = null;
PreparedStatement pst = null;
String com = "select Loc uri from rezervare where
idReprezentatii = '"
+ idReprezentatii + "' ;";

pst = con.prepareStatement(com);
rs = pst.executeQuery();
while (rs.next()) {
if (LocuriRe zervate == null) {
LocuriRezervate = rs.getString("Locuri");
} else {

LocuriRezervate = LocuriRezervate + ";" +
rs.getString("Locuri");
}

}

54

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// ///
////////////////////////////////////////////////////////////////////////////////
pannel_cinema.removeAll();
pannel_cinema.add(jLabel32);
pannel_cinema.add(jLabel33);
pannel_cinema.add(jLabel34);
pannel_cinema.add(jLabel35);
pannel_cinema.add(jButton20);
pannel_cinema.add(jButton21);

jLabel35.setText("");
String rand = null;
// String idSala = null;
//String ran duri[];
ArrayList<String> randuri = new ArrayList<String>();
ArrayList<String> nrmax = new ArrayList<String>();
int nrranduri = 0;

try {
ResultSet rs1 = null;
PreparedStatemen t pst1 = null;
String com1 = "select * from randuri where idSala ='"
+ idSala + "' order by literarand asc ;";

pst1 = con.prepareStatement(com1);
rs1 = pst1.executeQuery();
while (rs1.next()) {
//itm1 = rs1.getString("Pret");
nrranduri = nrranduri + 1;
randuri.add(rs1.getString("literarand"));
nrmax.add(rs1.getString("nrmax"));
// rand = rs1.getString("literarand");

}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}

pannel_locuri.setVisible(false);
pannel_cinema.setLocation (10, 10);

55
pannel_cinema.setVisible(true);

int y = 0;

int width = pannel_cinema.getWidth();

// String names[] = {"Foo", "Bar", "Baz", "Fob", "Bao"};
for (int i = 0; i < nrranduri; ++i) {

y = y + 40;
int aux = Integer.parseInt(nrmax.get(i));
int res = (width – ((aux * 30) + (aux + 1) * 10)) / 2;
int x = res;
JLabel _lbl = new JLabel(randuri.get(i));
_lbl.setBounds(10, y, 30, 30);
pannel_cinema.add(_lbl);

for (int j = 0; j < aux; j++) {

int nr = j + 1;

String numebtn = randuri.get(i) + nr;
JButton btn = new JBut ton(numebtn);

btn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
evt) {
LOCActionPerformed(evt);
}
});

btn.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt)
{
btnMouseEntered(evt);
}

public void mouseExited(java.awt.event.MouseEvent evt)
{
btnMouseExited(evt);
}
});

x = x + 40;

//TESTAM DACA AVEM LOCURI REZERVATE
if (LocuriRezervate != null) {

56
for (String retval : LocuriRezervate.split(";")) {

//BUTOANELE REZERVATE DEVIN ROSII
if (retval.equal s(numebtn)) {
btn.setBackground(Color.RED);
}

}
if (btn.getBackground().equals(RED)) {
} else {
btn.setBackground(Color.darkGray);
}

} else {
btn.setBackground(Color.darkGray);
}

btn.setForeground(new Color(255, 255, 255, 0));
btn.setFocusPainted(false);
btn.setBounds(x, y, 30, 30);
pannel_cinema.add(btn);

buttons[i] = btn;
}
}

}

}

///////////////////// //////////////////////////////////////////////////////////
///////////////////BUTON ADAUGARE FILM (ADMINISTRATOR)//////////////////////////
////////////////////////////////////////////////////////////////////////////////
private void b_add_filmActionPe rformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

////////////////////////////////////////////////////////////////////////////////
////////////////////TEST CA TOATE CAMPRUILE SA FIE COMPLETATE /////////////////
////////////////////////////////////////////////////////////////////////////////
if (add_nume_film.getText().equals("") ||
add_pret_film.getText().equals("") || add_durata_film.getText().equals("")) {
final JPanel panel = new JPanel();
JOptionPane.showMessageDialog(panel, "Completati campurile
obligatorii!", "Error", JOptionPane.ERROR_MESSAGE);
} else {

57

try {
ResultSet rs = null;
PreparedS tatement pst = null;

String com = "select Nume from filme where Nume ='" +
add_nume_film.getText() + "' ;";
pst = con.prepareStatement(com);
rs = pst.executeQuery();
if (rs.next()) {
test = rs.getString("Nume");

}

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
////////////////////////////////////////////////////////////////////////////////
///////////////////TESTAM CA FILMUL SA NU EXISTE IN BAZA DE DATE ///////////////
////////////////////////////////////////////////////////////////////////////////
//DACA NU EXISTA
if (test == null) {
/////////////// /////////////////////////////////////////
ResultSet rs = null;
PreparedStatement pst = null;
String sql;
sql = "insert into filme
(Nume,Pret,Gen,Durata,Actori,Descriere) values(?,?,?,?,?,?)";

try {

pst = con.prepareStatement(sql);
pst.setString(1, add_nume_film.getText());
pst.setString(2, add_pret_film.getText());
pst.setString(3, add_gen_film.get Text());
pst.setString(4, add_durata_film.getText());
pst.setString(5, add_actori_film.getText());
pst.setString(6, add_descriere_film.getText());
pst.execute();
JOptionPane.showMessageDialog(null, "Filmul a fost inserat
cu succes");
// JOptionPane.showMessageDialog(null, "Adaugat");

} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);

}

58
} ///DACA EXISTA
else {
final JPanel panel = new JPanel();
JOptionPane.showMessageDialog(panel, "Filmul exista in baza de
date!", "Error", JOptionPane.ERROR_MESSAGE);

}

}
test = null;
///////////AFISARE DATE IN TABELUL DE FILME
afisare_filme();
}

////////////////////////////////////////////////////////////////////////////////
//////////////// //////////// ///SELECTAREA LOCULU I///////////////////////////////
////////////////////////////////////////////////////////////////////////////////
private void LOCActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

JButton o = (JButt on) evt.getSource();
if (o.getBackground().equals(Color.GREEN)) {
nr_comp = nr_comp – 1;
o.setBackground(Color.DARK_GRAY);
String incepe = o.getText() + ";";
if (jLabel35.getText().contains(";" + o.ge tText())) {
String stergere = ";" + o.getText();
jLabel35.setText(jLabel35.getText().replace(stergere, ""));
} else if (jLabel35.getText().contains(o.getText()) &&
jLabel35.getText().startsWith(incepe)) {
jLabel35.setText(jLabel35.getText().replace(incepe, ""));
} else {
jLabel35.setText(jLabel35.getText().replace(o.getText(), ""));
}
} else if (o.getBackground().equals(Color.DARK_GRAY)) {
if (nr_comp < nr_scaune) {
nr_comp = nr_comp + 1;
o.setBackground(Color.GREEN);
if (jLabel35.getText().length() == 0) {
jLabel35.setText(o.getText());
} else {
jLabel35.setText(jLabel35.getText() + ";" + o.getText());
}
} else {
JOptionPane.showMessageDialog(null, "Puteti selecta maxim " +
nr_scaune + " locuri.");

59
}

}
String name = o.getName();
String text = o.getText();
String accesible = o.getAccessibleContext().toString();
if (name == "clear") {

}
//JOptionPane.showMessageDialog(null,name);
}

4) Hover buton

///////////////////// /////////BUTON REZERVARE////////////////////////////////////////
private void jButton22MouseEntered(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
jButton22.setIcon(new
javax.swing.ImageIcon(getClass().getResource("/img/RezervareHover1.png")));
}

//////////////////////////////BUTON REZERVARE////////////////////////////////////////
private void jButton22MouseExited(java.awt.event.M ouseEvent evt) {
// TODO add your handling code here:
jButton22.setIcon(new
javax.swing.ImageIcon(getClass().getResource("/img/Rezervare1.png")));
}

///////////////////////////HOVER LOC//////////// ////////////////////////////////////
private void btnMouseEntered(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
JButton o = (JButton) evt.getSource();
jLabel34.setText(o.getText());
}

private voi d btnMouseExited(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
JButton o = (JButton) evt.getSource();
jLabel34.setText("");
}

Similar Posts