Sunteți pe pagina 1din 47

Universitatea din Craiova

Facultatea de Automatica, Calculatoare si Electronica


Colegiul Tehnica de Calcul

PROIECT DE ABSOLVIRE

Indrumator stiintific,
S.l. dr. ing. Catalin Cerbulescu

Absolvent,
Popa Ionica Marian

Craiova - 2004
Tema proiect

Gestiune si prezentare on-line a programelor


cinematografelor din Romania
Cuprins

Cap.1 Prezentare functiuni


Cap.2 Notiuni fundamentale de baze de date
Cap.3 Limbajul SQL
Cap.4 Active Server pages
4.1 Pagini ASP
4.2 Accesarea bazelor de date
4.3 Obiectul Response
4.4 Obiectul Request
Cap.5 Descriere aplicatie
5.1 Structura bazei de date
5.2 Legaturi intre tabele
5.3 Interfata cu utilizatorul
5.4 Validari asupra datelor
5.5 Tehnici de programare utilizate in partea de administrare
5.5.1 Conexiunea la baza de date
5.5.2 Inserarea si actualizarea datelor
5.5.3 Stergerea datelor
5.6 Tehnici de programare utilizate in partea de client
5.6.1 Pagina Acasa
5.6.2 Pagina In cinematografe
5.6.3 Pagina cu informatii detaliate despre un film
5.6.4 Pagina cu informatii detaliate despre un actor
5.6.5 Pagina Filme
5.6.6 Pagina Actori
5.6.7 Pagina Arhiva filme
Cap.6 Concluzii

Bibliografie
Listing sursa
Cap.1 Prezentare functiuni

Aplicatia care face obiectul acestui proiect se intituleaza Gestiune si


prezentare on-line a programelor cinematografelor din Romania si
reprezinta un site Web care afiseaza informatia existenta intr-o baza de date
MS Access. Ca urmare este un site dinamic, schimbarea informatiei din baza
de date conducind la schimbarea automata a informatiei care se afiseaza pe
Internet.
Ca solutie pentru realizarea acestui site am ales HTML (HyperText
Mark-up Language) si ASP (Active Server Pages).
Site-ul cuprinde doua parti distincte. Prima parte este destinata
consultarii de catre orice persoana doritoare de a vedea un film la cinema.
Facilitatile oferite de aceasta prima parte a site-ului realizat de mine
sunt grupate sub urmatoarele titluri :
1. Acasa – este pagina introductiva, in care vizitatorul este informat
asupra a doua lucruri: filmele noi aparute in cinematografe in
saptamina curenta, precum si filmele recomandate. Prin asta am
inteles filmele care prin calitatea lor sunt recomandate spre
vizionare. Pentru fiecare film apare titlul acestuia, afisul si date
legate de subiect. Pe fiecare titlu este amplasata o hiperlegatura care
conduce la pagina cu informatiile detaliate despre film.
2. In cinematografe - afiseaza datele ce incadreaza saptamina curenta
si o lista drop-down din care trebuie ales orasul care intereseaza. In
acest moment se afiseaza fiecare cinematograf din orasul respectiv
cu adresa s telefonul sau. Apoi, pentru fiecare cinematograf in parte
apare lista filmelor care ruleaza, precum si cu zilele si orele de
vizionare. Si aici avem hiperlegatura pe titlul filmului pentru a
merge in pagina cu detalii.
3. In viitor – aceasta pagina este asemanatoare cu cea anterioara,
numai ca afiseaza informatii despre filmele programate sa ruleze in
cinematografe in etapa de timp viitoare
4. Filme – afiseaza titlurile filmelor care ruleaza in tara in saptamina
curenta.
5. Actori – afiseaza, in ordine alfabetica, numele actorilor care
figureaza in baza de date. Numele actorului este o hiperlegatura care
daca este urmata conduce la afisarea in partea inferioara a paginii a
informatiilor detaliate despre actorul ales.
6. Arhiva filme – permite vizualizarea titlurilor filmelor care sunt in
baza de date pentru ca au rulat in trecut intr-unul din
cinematografele existente in baza de date. Aceasta arhiva este
mentinuta, pentru ca un film poate sa ruleze din nou, peste un
anume timp, fie in acelasi cinematograf, fie in altul.

Doresc sa mentionez ca interfata grafica este placuta, cu un fundal si


butoane adecvate temei.
Cea de a doua parte a site-ului este pusa numai la dispozitia celor care
au drepturi sa administreze baza de date MS Access. Acesti utilizatori trebuie
sa se identifice printr-un nume de utilizator si parola. In partea de
administrare, exista urmatoarele hiperlegaturi:
1. Cinematografe
2. Filme
3. Actori
4. Saptamina
5. Program

Aceste titluri corespund in general tabelelor din baza de date a caror


informatie trebuie actualizata. Fiecare din aceste optiuni permite gestionarea
informatiei corespunzatoare, prin adaugare, modificare sau stergere de
inregistrari.
In pagina Filme, in afara de posibilitatea de adaugare, modificare si
stergere exista doua hiperlegaturi numite Distributie si Imagini care permit
gestionarea informatiilor corespunzatoare pentru fiecare film in parte.
In pagina Cinematografe, utilizatorul cu drept de administrare poate sa
gestioneze informatia despre acestea: sa adauge, sa modifice sau sa stearga
inregistrari.
In pagina Filme, administratorul poate sa modifice informtia legata de
acestea, plus informatia legata de imaginile din filme si distributia acestora.
De exemplu,in cazul in care se administreaza informatia legata de
distributia filmelor, numele actrilor se alege dintr-o lista drop-down, munca
acestuia fiind mult simplificata. Aceasta tehnica este utilizata si in alte parti
ale site-ului de administrare. Astfel, in cazul informatiilor despre
cinematografe, se alege orasul din care apartine, la adagarea programului de
rulare al unui film se alege sapatamina si apoi titlul filmului tot prin
intermediul unor liste drop-down.
Lucrurile se produc asemanator in cazul celorlalte hiperlegaturi.
Doresc sa evidentiez ca in aceasta sectiune am acordat atentie speciala
validarii datelor care se introduc sau se modifica in tabele, pentru a pastra
consistenta informatiei, pentru a evita iesirea utilizatorului din pagina din
cauza unei erori.

Cap.2 Notiuni fundamentale de baze de date

Entitate,relaţie,atribut

Se numeşte entitate orice obiect,fenomen sau concept care poate fi


distins prin valorile caracteristicilor sale de alte obiecte,fenomene sau
concepte asemănătoare.
Se numeşte atribut o caracteristică specifică unei entităţi.
Un atribut se caracterizează prin :nume,semantică.structură,tipuldatelor
şi domeniul de definiţie.
Prin tipul datelor înţelegem structura datei,mulţimea
valorilor,operaţiile admise si modul de tratare a erorilor specifice.
Semantica înseamnă semnificaţia atributului în cadrul entităţii.Într-o
colecţie pot să apară diverse atribute cu acelaşi nume dar plasate in entităţi
diferite.Chiar dacă au acelaşi nume atributele pot să aibă semnificaţii diferite.
Domeniul este o noţiune specifică bazelor de date şi puternic legată de
semantica acestora.Cunoaşterea semanticii atributelor şi a domeniilor
specifice este una din cerinţele de bază ale proiectării unei baze de date.
Din punct de vedere al semanticii distingem :
1. Atribute identificator-ale cărui valori pot identifica în mod unic o
anumita entitate.
2. Atribute descriptor-ale carui valori descriu o anumită proprietate a
entităţii.
3. În asemenea situaţii o entitate poate să nu aibă cheie primară
naturală.În acest caz proiectantul bazei de date poate decide
introducerea unei chei primare artificiale.
Din punct de vedere al structurii putem distinge :

1. Atribute atomice din a căror valoare nu poate fii eliminată nici o


componentă fără a afecta semantica atribitului.
2. Atribute compuse a căror valoare este dată de reuniunea valorilor unor
atribute atomice.
Din punct de vedere al numărului de valori pe care-l poate lua la un
moment dat un atribut pentru o anumită entitate distingem.

1. Atribute cu valoare unică care acceptă la un moment dat o singură


valoare pentru fiecare entitate.
2. Atribute multivaloare care acceptă la un moment dat un set de valori
pentru aceeaşi entitate.
Din punct de vedere al nivelului de structurare al unui atribut
distingem :
1. Atribute slab structurate –sunt caracteristice aplicaţiilor multimedia.
2. Atribute puternic structurate-sunt atribute care au o structură riguros
definită.
Între entităţi se stabilesc legături.Legătura între clase de entităţi pune în
corespondenţă entităţiile ce participă la realizarea legăturii a două sau mai
multe clase de entităţi reprezintă o submulţime a produsului cartezian al
entităţiilor.
Caracteristici generale ale legăturilor:
1. Orice legătură are un nume
2. Orice legătură are o semantică riguros definită
3. O legătură este bidirecţională
4. Pot fi definite legături între entităţile aceleiaşi clase de entităţi
5. Între aceleaşi clase de entităţi pot fi definite mai multe legături cu
semnificaţii diferite
6. Pot fi definite legături peste mai mult de două clase de entităţi
7. Legăturile pot avea atribute proprii ca şi entităţiile
Indiferent de semantica lor legăturile prezintă câteva proprietăţi deosebit
de importante a căror cunoaştere este esenţială pentru înţelegerea si
implementarea colecţiilor de date.
1. Gradul legăturii-indică numărul de clase de entităţi care participă la
realizarea legăturii tip .
2. Indicator de participare-este un indicator care specifică dacă pot exista
entităţi ale unei clase de entităţi care să nu participe obligatoriu la
realizarea legături tip analizate.
3. Indicator de conectivitate-indică numărul de entităţi ale unei clase care
pot fi puse în corespondenţă cu entităţi ce participă la realizarea unei
anumite legături.
Baze de date
Se numeşte bază de date o colecţie de date conectate logic
exhaustivă,neredundantă şi care suportă independenţa aplicaţiilor în raport cu
structura datelor.
Prin structura bazei de date se materializează de fapt informaţia conţinută
de date .Structura datelor nu este unică .Prin duplicarea datelor înţelegem că
aceleeaşi date sunt reprezentate în baza de date în aceeaşi formă sau în forme
apropriate.
Conexiunea logică a datelor presupune că în baza de date sunt introduse
numai date specifice unui anumit domeniu iar între ele pot fi puse în evidenţă
legături cu o semantică bine determinată.
Exhaustivitatea datelor se referă la cerinţa impusă de precizia
informaţiilor şi anume că pentru a obţine informaţii cât mai corecte într-un
anumit domeniu respectiv.
Prin cerere vom înţelege o solicitare abstractă sistemului informatic sub
forma unor comenzi într-un limbaj de programare în scopul obţineri unui
anumit rezultat cu ajutorul unor prelucrări elementare asupra datelor păstrate
în baza de date.
Prin aplicaţie se înţelege un grup de cereri concatenate semantic şi care
solicită aproximariv aceleaşi date pentru obţinerea rezultatelor. În concluzie
există un număr mare de elemente ale bazei de date a căror modificare nu
trebuie să afecteze aplicaţiile deja implementate. Printre acestea putem aminti:
1. utilizarea unor tipuri de dată diferite pentru valorile aceluiaşi atribut
2. formatul de reprezentare al datei calendaristice poate varia foarte
puternic în funcţie de aplicaţie,de preferinţele beneficiarului de
tranzacţie.
3. anumite date pot fi văzute distinct de către o aplicaţie şi concatenate de
către altă aplicatie.
4. diverse apilicaţii utilizează fiecare doar o parte a conţinutului bazei de
date.
5. dacă la un moment dat se hotărăşte extinderea bazei de date prin
adăugarea de noi categori de informaţii ,vechile aplicaţii care nu
utilizează aceste date nu trebuie să fie afectate.
6. având în vedere preţul de cost mare al implementări unei baze de date
şi a aplicaţiilor peste aceasta se poate decide implementarea bazei de
date în etape.
7. modificările în structura sistemului informatic pri achiziţia de
echipamente de calcul noi prin modificarea tipului suportului extern de
informaţie,prin redistribuirea fişierelor de date nu trbuie să afecteze
programele aplicative.
8. un program aplicativ poate fi utilizat în contexte diferite peste baze de
date cu structuri de date identice dar implementate pe sisteme de calcul
diferite.
Sistemul de gestiune a bazelor de date reprezintă un pachet de programme
care permit crearea, utilizarea si eliminarea obiectelor ce compun baza de date
în scopul creşteri randamentului global al utilizării bazelor de date si având ca
principal obiectiv reducerea dependenţei aplicaţiilor în raport cu structura
datelor. Principala noutate introdusă de SGBD a fost separarea descrierii
datelor de programul aplicativ. Descrierea datelor se face în mod unitar pentru
toate aplicaţiile cu ajutorul SGBD. SGBD-ul oferă mecanisme puternice de
acces la date fără să necesite cunoştinţe avansate privind structura datelor şi
sistemul de operare.
Introducerea SGBD-ului a permis crearea unei arhitecturi pe 3 nivele a
sistemului informatic:
Nivelul logic corespunde modului în care fiecare utilizator vede conţinutul
bazei de date.
Nivelul conceptual corespunde structurii întregii baze de date.Modelul
conceptual este o descriere a continutului bazei de date independentă atât de
aplicaţiile propriuzise cât şi de modelul de implementare al bazei de date.
Nivelul intern se referă la modul de implementare al bazei de date.
Modelul intern conţine descrierea structurii de date implementate,
descrierea fişierelor a tehnicilor de acces la date, lista utilizatorilor, drepturile
lor de acces.
Modelul relaţional este un model logig al bazei de date care sa impus
datorită naturaleţii sale şi simplităţii în înţelegerea şi manipularea structurilor
de date. Rrezentarea unei baze de date sub formă de relaţii se numeşte model
relaţional al bazei de date.
O relaţie este formată dintr-un tabel bidimensional în care coloanele
corespund atributelor iar fiecare linie corespunde unei entităţi.
Fiecare relaţie se identifică printr-un nume unic în cadrul unei baze de
date.
Fiecare atribut are un nume unic şi trebuie să sugereze semnificaţia
acestuia.
O linie a relaţiei se numeşte tuplu al relaţiei .Prin relaţie materializăm o
clasă de entităţi în care fiecare tuplu reprezintă o entitate.
CHEI
Noţiunea de cheie derivă din conceptul determinant .
Se numeşte determinant orice atribut simplu sau compus ale cărui valori
identifică în mod unic valorile altor atribute.
Se numeşte supercheie orice atribut simplu sau compus care identifică în
mod unic un tuplu.
Există o supercheie care apare în orice relaţie numită cheie trivială şi
anume o supercheie formată din toate atributele relaţiei.
Cheie candidat :
Se numeşte cheie candidat o supercheie minimală adică o supercheie din
care îndepărtând cel puţin un atribut se pierde caracterul de determinant.
Supercheile si cheile candidat rezultă în mod natural din semantica datelor.
Cheie primară :
Cheia primară este o cheie candidat aleasă de către proiectantul bazei de
date pentru identificarea tuplurilor intr-o relaţie. Specificarea cheii primare
este obligatorie în orice documentaţie privind baza de date. Alegerea cheii
primare se poate face pe baza unei analize profunde a semnificaţiei datelor şi
a modului în care acestea sunt utilizate în diverse aplicaţii sau pot fi fixate
arbitrar dintre cheile candidat. În cazul in care nu există nici o cheie candidat
sau cheile candidat naturale au un număr prea mare de atribute proiectantul
poate decide introducerea unor chei primare artificiale generate de către
SGBD.
Cheie alternantă : este o cheie candidat care nu a fost aleasă pentru postul
de cheie primară.
Cheie secundară :
Orice atribut sau grup de atribute prin ale căror valori se identifică o
mulţime de tupluri dintr-o relaţie.
Fie o relaţie având schema r(a1,a2,…,an),unde a1 este cheie primară a
relaţiei. Se numeşte domeniu primar al relaţiei domeniul corespunzător cheii
primare. Fie o altă relaţie s(b1,b2,…,bn),unde b1 este definit peste acelaşi
domeniu primar din relaţia r.În acest caz se spune că b1 este cheie externă
peste definită peste cheia primară din relaţia r.
Cheia externă reprezintă un mecanism fundamental pentru materializarea
legături între relaţiile r şi s. Cheile externe pot fi definite în practică peste chei
candidat în afara cheii primare.
Reguli de integritate
Regulile de integritate a datelor dintr-o bază de date relaţională
reprezintă restricţii impuse datelor cu scopul de a elimina redundanţa
datelor,inconsistenă a datelor şi erori de actualizare a datelor.
Există multe tipuri de integrităţi şi anume :
1. Integritatea domeniului-această restricţie presupune definirea
domeniului unui atribut astfel încât să reprezinte efectiv valorile
posibile ale unui atribut.
2. Integritatea cheilor-prin cheie vom înţelege toate cheile candidat puse
în evidenţă într-o relaţie.
3. Integritatea entităţii-prin definiţie cheia primară trbuie să identifice în
mod unic un tuplu al unei relaţii care în general este materializarea unei
entităţi. Pentru ca să-şi poată realiza rolul de identificator cheia primară
nu poate avea valori nule.
4. Integritatea referirii-această restricţie de integritate are ca scop să
elimine referirile în gol, adică cheia externă nu are voie să se refere la
un tuplu care nu există. Restricţia integrităţii referirii impune ca la un
moment dat valorile cheii externe fie să fie nule, fie să se afle printre
valorile deja înregistrate pentru cheia primară peste care este definită
cheia externă.
5. Restricţii de utilizator-în unele situaţii utilizatorul poate impune şi alte
restricţii decât cele impuse de regulile de integritate discutate anterior :
-unicitatea altor atribute decăt cheia primară
-valori nule
-diverse validări

Operatori ai algebrei relaţionale 

Operatorii algebrei relaţionale pot fi împărţi în două grupe:


1. Operatori clasici peste mulţimi
2. Operatori relaţionali specifici
Se spune că relaţiile r1 şi r2 sunt compatibile cu reuniunea dacă cele 2
relaţii au aceeaşi paritate şi atributele care ocupă aceeaşi paritate sunt definite
peste acelaşi domeniu chiar dacă au nume diferite.
Reuniunea :Fie r1 şi r2 două relaţii compatibile cu reuniunea .Se
numeşte reuniune relaţia r care conţine toate tuplurile celor 2 relaţii iniţiale
fără duplicate.
Intersecţia :Fie r1 şi r2 două relaţii compatibile cu reuniunea.Se
numeşte intersecţie relaţia r care conţine toate tuplurile comune lui r1 şi r2.
Diferenţa :Fie r1 şi r2 două relaţii compatibile cu reuniunea.Se numeşte
diferenţă relaţia r care conţine numai tuplurile din r1 care nu apar în r2.
Produsul cartezian :Fie r1 şi r2 două relaţii oarecare.Se numeşte
produs cartezian relaţia r opţinută prin concatenarea fiecărui tuplu din r1 cu
fiecare tuplu din r2.
Operatori relaţionali specifici :
Selecţia-Fie o relaţie r şi o expresie relatională aritmetică f numită
filtru.Se numeşte selecţie o relaţie formată din toate tuplurile relaţiei r pentru
care atributele iau valori care înlocuite în expresia f fac ca aceasta să aibă
valoarea adevărată true.
Proiecţia-Fie o relaţie r şi ai1,ai2,…,ain, un set de atribute ale acestei
relaţii.Se numeşte proiecţie o relaţie opţinută din relaţia r care conţine numai
atributele specificate.

Tipuri de limbaje utilizate în domeniul bazelor de date

1. Limbaje de descriere a bazei de date(LDBD)-permit descrierea


relaţiilor atributelor şi a unor restricţii de integritate,a unor vederi
asupra bazelor de date a unor utilizatori şi aprivilegiilor acordate
acestora.
2. Limbaje de manipularea bazelor de date(LMDB)-acestea cuprind
comenzi care permit :
-introducerea de noi date în baza de date
-modificare valorilor deja înscrise în baza de date
-eliminarea unor tupluri ale unei relaţii
3. Limbaje de interogare-au ca scop posibilitatea formulări unor cereri
de căutare a informaţiilor în baza de date.
4. Limbaje pentru generarea rapoartelor-sunt limbaje care permit o
formatare sofisticată a datelor care să prezinte informaţia intr-o formă
adecvată problemei rezolvate.

Normalizarea

Este un proces interativ şi reversibil prin care se înlocuieşte o colecţie


dată de relaţii prin colecţii succesive în care relaţiile au o structură din ce în ce
mai simplă şi mai regulată.
Obiectivele normalizării sunt :
1.Să permită reprezentarea oricărei relaţii în baza de date .
2.Să opţină algoritmii de căutare puternici bazaţi pe o colecţie de operatori
relaţionali .
3.Să elimine din relaţii anomaliile de inserţie ,modificare şi ştergere.
4.Să reducă necesitatea restructurării relaţiilor atunci cănd se introduce un
nou tip de date sau se modifică ipotezele de lucru.
5.Să facă colecţia de relaţii imună în raport cu cererile aleatoare a căror
semantică se modifică în timp.
Pot fi puse în evidenţă cinci forme de normalizare ce formează o structură
riguros ierarhizată care vor fi notate cu FN1-FN5.
Forma normală 1(FN1)
O relatie este în FN1 dacă fiecare atribut al relaţiei are un domeniu de
valori atomice.FN1 este cea mai slabă formă normală.În general relaţiile în
această formă prezintă numeroase anomalii la inserţie,modificare şi eliminare,
acestea fiind eliminate de celelalte forme normale.
Forma normală 2(FN2)
Fie X mulţimea tuturor atributelor relaţiei r(a1,a2,…,an),care nu
participă la formarea vreunei chei în r. Se spune că relaţia r este în FN2 dacă
şi numai dacă fiecare atribut din X este complet dependent funcţional de
oricare din cheile lui r.Un atribut este atribut prim dacă face parte din cel
puţin o cheie a relaţiei r.Un atribut este atribut nonprim dacă nu face parte
din cel puţin o cheie a relaţiei r.O relaţie este în FN2 dacă şi numai dacă orice
atribut nonprim din r este complet dependent funcţional de toate cheile din r.
Proprietate :
Dacă o relaţie nu este în FN2,există o descompunere a lui r într-un set
de proiecţii,fiecare în FN2. Descompunerea se poate realiza în aşa fel încât
aplicând joncea naturală între proiecţii se opţine conţinutul informaţional al
lui r fară pierdere de informaţie.
Forma normală 3(FN3)
O relaţie este în FN3 dacă şi numai dacă nici unul din atributele sale
nonprime nu este dependent tranzitiv de o cheie a relaţiei r.
Proprietăti :
1.Dacă o relaţie se află în FN3 ,ea este obligatoriu în FN2.
2.Există relaţii în FN2 care nu se află în FN3.
3.Dacă o relaţie r nu este în FN3,există o decompoziţie a lui r intr-un set de
proiecţii,toate în FN3. Această decompoziţie este astfel realizată încât
aplicând joncţiunea naturală între proiecţiile opţinute se reface relaţia iniţială
fără pierdere de informaţii.
Forma normală Boyce-Codd(FNBC)
Relaţia r(a1,a2,…,an) este în FNBC dacă şi numai dacă existenţa unei
dependenţe funcţionale netrivială X-Y ,unde X şi Y sunt seturi de atribute ale
lui r implică existenţa dependenţelor funcţionale X-a1,pentru i=1,2,…,n.
Această definiţie poate fi reformulată utilizând termenul determinant.
Se numaşte determinant orice atribut simplu sau compus care implică
funcţional alte atribute.
O relaţie este în FNBC dacă şi numai dacă orice determinant al relaţiei
este cheie candidat.
Proprietăţi :
1.Dacă o relaţie este în FNBC,ea este obligatoriu in FN3.
2.Există relaţii în FN3 care nu sunt în FNBC.
3.Dacă o relaţie nu este în FNBC,atunci această relaţie poate fi descompusă
într-un set de proiecţii FNBC astfel încât conţinutul relaţiei iniţiale să poată fi
refăcut fără pierdere de informaţie prin joncţiunea naturală a proiecţiilor.
Procesul de normalizare poate fi rezumat astfel :
N1.Se transformă tabelul iniţial într-unul sau mai multe tabele cu valori
atomice.
N2.Din relaţiile de la pasul precedent se elimină toate dependenţele
funcţionale parţiale opţinând relaţii FN2.
N3.Din relaţiile FN2 se elimină toate dependenţele funcţionale tranzitive de
atribute cheie.Se opţin relaţii FN3.
N4.Se aleg proiecţiile relaţiilor FN3 care elimină acele dependenţe
funcţionale în care determinantul nu este cheie candidat şi se opţin relaţii
FNBC.
N5.Se aduc relaţiile FNBC în FN4.
N6.Se aleg proiecţiile relaţiilor FN4 care elimină dependenţele joncţiune care
nu sunt implicate prin chei candidat .Rezultă relaţii FN5.
Cap.3 Limbajul SQL
SQL a fost conceput ca un limbaj standard de descriere a datelor si
acces la informatiile din baze de date, dezvoltindu-se ca o adevarata
tehnologie dedicata arhitecturilor client/server.
Utilizat initial de catre firma IBM pentru produsul DB2, limbajul de
interogare a bazelor de date relationale SQL (Structured Query Language)
a devenit la mijlocul deceniului trecut un standard in domeniu. De atunci si
pina in prezent au fost dezvoltate mai multe versiuni ale standardului SQL,
trei dintre ele apartinind Institutului National American de Standarde
( ANSI ), celelalte fiind concepute de firme de prestigiu ca IBM, Microsoft,
Borland. Din pacate, lipsa unui standard unic SQL are drept consecinte
cresterea costurilor programelor de gestiune a bazelor de date si ingreuneaza
intretinerea arhitecturilor client/server. Primul standard SQL a fost creat in
anul 1989 de catre ANSI, fiind cunoscut sub numele de ANSI-SQL ’89 si a
fost revizuit in 1992 sub noua denumire ANSI-SQL ’92. Proliferarea intre
timp a diferitelor implementari ale limbajului SQL, a determinat formarea
consortiului SAG, cu scopul de a concepe un set de standarde SQL, care sa
aiba la baza un subset al standardului ANSI-SQL ’89 si in plus sa rezolve
problemele legate de implementarea acestora in arhitecturi client/server cum
ar fi conectivitatea si interfetele cu utilizatorul ale programelor.
In anul 1992, firma Microsoft, in calitate de membru SAG a lansat pe
piata produsul ODBC ( Open Database Conectivity ), un standard API-SQL
ce are la baza un proiect de standard si defineste o interfata de programare a
aplicatiilor ( API ) pentru accesul la baze de date.
Interfata de programare cunoscuta in domeniu sub initialele API, ofera
o cale de comunicare intre programe si bazele de date prin apeluri de functii
care substituie instructiunile SQL. Astfel, standardele API se bazeaza pe
conectivitate, precum si schimbul de date si mesaje SQL.
SQL este un limbaj complet pentru baze de date, cuprinzind comenzi
pentru definirea datelor, actualizare si interogare. Deci, este atit un limbaj
pentru definirea datelor (DDL), cit si pentru manipularea datelor (DML). In
plus, are facilitati pentru definirea viziunilor, pentru crearea si stergerea
indecsilor si pentru incapsularea comenzilor SQL in limbaje de programare ca
C sau Pascal.
Comenzile SQL pentru definirea datelor sint CREATE, ALTER si
DROP.
Comenzile SQL pentru modificarea datelor sint INSERT, DELETE si
UPDATE.
SQL are o singura comanda pentru regasirea datelor din bazele de date,
SELECT .
Avind in vedere ca in ASP, accesul la bazele de date de tip Access se
realizeaza prin intermediul limbajului SQL, voi prezenta in continuare,
sintaxa comenzilor SQL in Microsoft Access.

Comanda SELECT

Permite returnarea unui set de inregistrari din baza de date. Are


urmatoarea sintaxa:
SELECT [predicate] { * | table.* | [table.]field1 [AS alias1]
[,table.]field2 [AS alias2] [, ...]]}

FROM tableexpression [, ...] [IN externaldatabase]

[WHERE... ]

[GROUP BY... ]

[ORDER BY... ]

Comanda SELECT are urmatoarele parti:


- Predicate – poate fi unul dintre urmatoarele predicate: ALL,
DISTINCT, DISTINCTROW, or TOP, care se utilizeaza pentru a
restrictiona numarul de inregistrari returnate. ( implicit este ALL).
- * - specifica selectarea tuturor cimpurilor din tabela sau tabelelor
selectate.

- table – specifica numele tabelei continind cimpurile din care se


selecteaza datele

- field1, field2 – reprezinta numele cimpurilor din care dorim regasirea


datelor.

- alias1, alias2 - reprezinta numele utilizate ca si titluri de coloane


in locul numelor coloanelor din tabela

- tableexpression – reprezinta numele tabelei sau tabelelor din care se


regases datele

- externaldatabase – reprezinta numele bazei de date externe, daca


tabelele nu sint in cea curenta

Observatii:

Pentru a executa aceasta operatie, motorul de baze de date Microsoft


Jet cauta tabela sau tabelele specificate, extrage coloanele alese, selecteaza
rindurile care satisfac criteriul si sorteaza sau grupeaza rindurile rezultate in
ordinea specificata.
Comanda SELECT nu modifica datele din baza de date.

Daca numele unui cimp apare in mai multe tabele din clauza FROM, el
trebuie precedat de numele tabelei si operatorul punct (.).

Clauza WHERE specifica inregistrarile din tabelele ce apar in clauza


FROM care vor fi afectate de comanda SELECT. Numai acele inregistari care
satisfac criteriul din aceasta clauza vor fi incluse in interogarea rezultat.
Observatii :

Daca nu se specifica clauza WHERE vor fi returnate toate rindurile din


tabele. Daca in interogare se specifica mai mult de o tabela si nu specifica
clauza WHERE sau JOIN, se efectueaza produsul cartezian al tabelelor,
operatie consumatoare de timp.

Clauza ORDER BY permite sortarea inregistrarilor dupa valorile din


cimpurile specificate, ascendent sau descendent.

Sintaxa acestei clauze este:

[ORDER BY field1 [ASC | DESC ][, field2 [ASC | DESC ]][, ...]]]
Observatii :

Clauza este optionala. Sortarea implicita este ascendenta, altfel trebuie


specificat DESC. In aceasta clauza nu pot apare cimpuri de tip OLE sau
Memo.

Clauza GROUP BY combina inregistrarile cu valori identice din lista


de cimpuri specificate, intr-o singura inregistrare.Daca in comanda SELECT
se specifica una dintre functiile agregat ( Sum, Count, Max ), atunci pentru
fiecare astfel de inregistrare se creaza apoi o valoare agregat.
Clauza are urmatoarea sintaxa:

[GROUP BY groupfieldlist]

- groupfieldlist – reprezinta numele a cel mult 10 cimpuri utilizate


pentru gruparea inregistrarilor. Ordinea acestor cimpuri in lista
determina nivelele de grupare de la cel mai inalt pina la cel mai de jos
Observatii:
Clauza este optionala. Valorile agregat sint omise daca in comanda SQL
nu se specifica nici o functie agregat. Nu se poate face grupare dupa cimpuri
de tip Ole sau Memo.

Jonctiunea interna ( INNER JOIN )

Se specifica cu urmatoare sintaxa:

FROM table1 INNER JOIN table2 ON table1.field1


compopr table2.field2

Operatia INNER JOIN are urmatoarele parti:

- table1, table2 - reprezinta numele tabelelor din care se combina


inregistrarile
- field1, field2 – reprezinta numele cimpurilor dupa care se face
jonctiunea. Daca ele nu sint numerice, trebuie sa fie de acelasi tip,
aceeasi dimensiune, dar nu trebuie sa aiba acelasi nume.
- compopr – reprezinta orice operator relational: "=," "<," ">," "<=,"
">=," sau "<>."

Observatii:

Acest tip de jonctiune este cel mai utilizat si se poate folosi in orice
clauza FROM. Combina inregistrarile din doua tabele, ori de cite ori exista
valori care isi corespund in cimpul comun din cele doua tabele.
Nu se poate face jonctiune pe tipuri de date OLE sau Memo.

Comanda UPDATE

Permite modificarea valorilor cimpurilor intr-o tabela specificata, pe baza


unui criteriu specificat. Are urmatoarea sintaxa:

UPDATE table
SET newvalue
WHERE criteria

Comanda UPDATE are urmatoarele parti:

- table – reprezinta numele tabelei ce contine datele ce vor fi


modificate.
- newvalue - este expresia care determina valoarea ce va fi memorata
intr-un anume cimp din inregistrarile care se actualizeaza.
- criteria – este expresia care determina inregistrarile ce vor fi
actualizate

Cap.4 Active Server Pages


4.1 Pagini ASP
O pagina ASP este un fisier stocat pe un server Web si care are extensia
.ASP. Aceasta extensie speciala face deosebirea dintre o pagina ASP si un
fisier HTML normal care are extensia .HTML sau .HTM.
Cind un utilizator viziteaza un site Web si cere un fisier HTML normal,
serverul preia pur si simplu fisierul de pe hard-discul sau din memoria
calculatorului si il trimite browserului utilizatorului. Browserul interpreteaza
continutul HTML al fisierului si vizitatorul va vedea pagina Web.
Cind cineva solicita o pagina HTML normala, serverul Web nu este
interesat de continutul fisierului. Rolul serverului Web se rezuma la preluarea
fisierului corect fara a-l prelucra. Toata munca de interpretare a continutului
fisierului este realizata de browserul utilizatorului.
Pe de alta parte, cind cineva solicita o pagina ASP, serverul Web va avea
un rol mult mai activ. Inainte ca fisierul sa fie trimis catre browserul
utilizatorului, el este mai intii prelucrat de catre serverul Web. Acesta din
urma interpreteaza si executa orice script-uri dintr-o pagina ASP, inainte ca
acesta sa fie trimis catre browserul utilizatorului. Datorita faptului ca o pagina
ASP este prelucrata de catre server in loc de browser, o astfel de pagina este
compatibila cu toate browserele Web.
Paginile ASP contin script-uri pe parte de server. Ca limbaj de generare a
script-urilor, se poate utiliza Microsoft Visual Basic Scripting Edition
(VBScript), sau Microsoft Jscript sau PerlScript. Firma Microsoft include
Jscript in tehnologia ASP. PerlScript nu este un produs Microsoft.
Limbajele de generare de script-uri, cum este VBScript, difera de
limbajele de programare complete, cum sunt Visual Basic si Java, prin
simplitatea regulilor si sintaxei lor. De exemplu, VBScript nu necesita
declararea variabilelor ca tipuri particulare de date.
Mai mult, spre deosebire de Visual Basic sau Java, o pagina ASP nu
trebuie compilata intr-un fisier separat inainte de a o putea executa. Cind
modificati o pagina ASP, aceasta este recompilata automat la urmatoarea
solicitare.
Avantajul utilizarii unui limbaj de generare de script-uri la construirea
paginilor Web este faptul ca acesta faciliteaza modificarea unui site Web
chiar si dupa ce a fost lansat in Internet. Daca se descopera o eroare in site, se
poate incarca rapid pagina respectiva in programul Notepad sau Wordpad
unde se va rezolva problema.
Nu trebuie trasa concluzia ca, daca o pagina ASP utilizeaza un limbaj de
generare de script-uri, atunci paginile Active Server sunt lente sau nu asigura
acoperirea necesara. Script-urile ASP ruleaza in acelasi proces ca si serverul
Web si poate fi divizat in fire de executie. Acest lucru permite unei pagini
ASP sa ofere simultan, in mod eficient, suport pentru un numar mare de
utilizatori.
O pagina ASP ar fi strict limitata daca nu ar putea contine decit script-uri.
S-ar putea afisa ora exacta sau alte mesaje interesante, dar nu ar exista
posibilitatea de a prelua informatii de la utilizatori, de a stoca date intr-o baza
de date sau de a crea fisiere pe server. Din fericire, o pagina ASP poate
contine componente pe parte de server.
O componenta este ceva care, de obicei, are metode, proprietati si colectii.
Metodele unei componente determina actiunile pe care le puteti efectua
cu un obiect.
Proprietatile unei componente pot fi citite sau stabilite pentru a preciza
starea componentei.
Colectiile unei componente sunt seturi de perechi cheie si valoare,
referitoare la componenta.
Paginile Active Server au doua tipuri de componente: obiecte incluse si
componente ce pot fi instalate.
Cele sase obiecte incluse in Active Server pages sunt:
 Applications - reprezinta informatia care poate fi partajata intre toti
utilizatorii unei aplicatii ASP.
 ObjectContext - acest obiect se utilizeaza la paginile ASP care se
ocupa de tranzactii
 Request - reprezinta toate informatiile trimise de browser catre server,
inclusiv variabile de forma si siruri interogare.
 Response - reprezinta toate informatiile trimise de la un server catre un
browser, inclusiv continutul HTML trimis de catre o pagina ASP.
 Server - permite folosirea pe server a diferite functii utilitare
 Session - reprezinta informatia referitoare la sesiunea de lucru
particulara a unui utilizator.
In paginile Active Server este inclus un set special de obiecte : ActiveX
Data, care permit accesarea unei baze de date dintr-o pagina ASP. Aceste
obiecte se utilizeaza pentru a insera, actualiza si sterge linii dintr-un tabel.
Aceste obiecte se pot folosi, de asemenea, pentru a prelua un set de
inregistrari dintr-o tabela si a le afisa intr-o pagina ASP.

4.2 Accesarea bazelor de date


ActiveX Data Objects ( ADO ) reprezinta o tehnologie extensibila si
usor de utilizat care permite accesul la baze de date din cadrul paginilor de
Web. ADO se poate utiliza pentru a scrie scripturi compacte si scalabile
pentru conectarea la baze de date prin intermediul ODBC ( Open Database
Connectivity ).
Inainte de a putea deschide o conexiune la o baza de date, va trebui sa
furnizam paginii ASP informatii despre localizarea fizica a bazei de date. Cu
alte cuvinte trebuie sa furnizam script-ului o metoda de gasire a bazei de date
pe unitatea de hard disc. O cale de a realiza acest lucru cu ajutorul numelui de
sursa de date ( Data Source name-DSN).
Se pot crea doua tipuri diferite de nume de sursa de date. In cazul in
care se creaza un nume de sursa fisier (File DSN), informatia despre
conectarea la baza de date va fi stocata intr-un fisier. In cazul in care se creaza
un nume de sursa de sistem, informatia despre conectarea la baza de date va fi
stocata in baza de date Registry a calculatorului.
Nu exista motive speciale care sa impuna utilizarea unuia sau celuilalt
tip de nume de sursa de date. Ambele tipuri functioneaza la fel de bine, dar eu
am utilizat in aplicatie un num,e de sursa de date sistem.
Pentru a crea un fisier DSN de tip System pentru o baza de date de tip
MS Access se procedeaza astfel:

1. Din meniul Start din Windows se alege optiunea Settings apoi


Control Panel
2. Dublu-click pe icoana ODBC ceea ce conduce la afisarea ferestrei
ODBC Data Source Administrator
3. Se selecteaza optiunea System DSN
2. Se selecteaza butonul Add pentru a alege driverul bazei de date si
apoi se apasa butonul Finish
3. Se introduce un nume pentru fisierul DSN in caseta Data Source
Name
4. Prin apasarea butonului Select se alege o baza de date de tip Access
( *.mdb ) existenta si apoi se apasa butonul OK.

Conectarea la o baza de date

Primul pas in vederea accesarii informatiilor dintr-o baza de date este


stabilirea unei conexiuni cu sursa datelor. In acest scop, ADO furnizeaza
obiectul Connection care permite stabilirea si administrarea conexiunilor
intre aplicatie si baza de date ODBC. Obiectul Connection are o mare
varietate de proprietati si metode care permit deschiderea si inchiderea
conexiunilor la baza de date, transmiterea interogarilor pentru selectarea si
actualizarea datelor.
Pentru a stabili o conexiune la baza de date trebuie creata o instanta a
obiectului Connection. Scriptul urmator creaza o instanta a obiectului
Connection si apoi deschide conexiunea :
<%' se creaza o instanta a obiectului Connection
Set cn=Server.CreateObject ("ADODB.Connection")
'se deschide conexiunea
cn.Open "accessDSN" %>

Obiectul Server furnizeaza accesul la metodele si proprietatile de pe


server. Multe dintre aceste metode si proprietati servesc ca si functii utilitare.
Sintaxa este :
Server. proprietate | metoda
Metodele sale sint : CreateObject, HTMLEncode, MapPath si
URLEncode, iar proprietatea sa este ScriptTimeout. In continuare se va
descrie metoda CreateObject care a fost folosita in aplicatie.

Metoda CreateObject creaza o instanta a unei componente server.


Sintaxa este :
Server.CreateObject ( progID)
Parametrul progID specifica tipul de obiect care se creaza.
Implicit, obiectele create cu aceasta metoda au ca scop pagina, ceea ce
inseamna ca sint distruse automat de catre server atunci cind acesta termina de
procesat pagina ASP curenta.
Un obiect se mai poate distruge fie prin setarea variabilei la Nothing,
fie prin setarea ei la o noua valoare.
Nu se poate crea o instanta a unui obiect avind acelasi nume ca si un
obiect bult-in. De exemplu,
<% Set Response = Server.CreateObject ("Response") %> va genera eroare.

Executarea interogarilor cu ajutorul obiectului Connection

Dupa deschiderea unei conexiuni cu ajutorul metodei Open a


obiectului Connection, se poate utiliza metoda Execute a aceluiasi obiect
pentru a transmite interogari SQL catre baza de date.Scriptul urmator
utilizeaza metoda Execute a obiectului Connection pentru a transmite bazei de
date o comanda SQL Update, care insereaza date intr-o anume tabela.
<%' se creaza o instanta a obiectului Connection
Set cn=Server.CreateObject ("ADODB.Connection")
'se deschide conexiunea
cn.Open "lucrare"
' se defineste comanda SQL
strSQL="INSERT INTO Clienti ( Nume, Prenume ) Values ('popescu',
'Ion')"
' se utilizeaza metoda Execute pentru a transmite aceasta comanda 'SQL
la baza de date
cn.Execute (strSQL)%>

In cazul in care utilizatorul doreste sa afiseze inregistrarile returnate de


o interogare Select, rezultatul executiei acestei interogari trebuie depus intr-un
obiect de tip Recordset, care se foloseste apoi la afisarea valorilor din
cimpurile inregistrarilor, ca in exemplul de mai jos:
<%' se creaza o instanta a obiectului Connection
Set cn=Server.CreateObject ("ADODB.Connection")
'se deschide conexiunea
cn.Open "lucrare"
' se defineste comanda SQL
strSQL="Select * from Clienti Order By den_client:
' se utilizeaza metoda Execute pentru a transmite aceasta comanda 'SQL
la baza de date, iar rezultatul executiei se depune in variabila 'obiect rs
de tip recordset
set rs=cn.Execute (strSQL)
' pentru afisarea inregistrarilor, setul rs se parcurge cu un ciclu
do while not rs.eof
%>
' se afiseaza valoarea din cimpul den_client
<%=rs.fields("den_client")%>
<%
'metoda movenext se utilizeaza pentru a trece la urmatoarea
'inregistrare
rs.movenext
loop %>

4.3 Obiectul Response

Intr-o pagina HTML normala exista continut static. De fiecare data cind
este solicitata o pagina HTML, continutul afisat de catre pagina este acelasi.
Insa, o pagina ASP are continut ce se modifica ori de cite ori este solicitata
pagina.
Dintr-o pagina ASP se poate trimite continut dinamic utilizind obiectul
Response, un obiect ASP inclus. Acest obiect reprezinta toata informatia
trimisa de serverul Web catre un browser Web.
Sintaxa este :
Response.colectie | proprietate|metoda
Singura colectie care poate fi utilizata este Cookies si permite setarea
valorilor pentru cookies.
Proprietatile obiectului Response sint : Buffer, cacheControl, Charset,
ContentType, Expires, ExpiresAbsolute, IsClientConnected, Pics si Status.
Metodele obiectului Response sint : AddHeader, AppendToLog,
BinaryWrite, Clear, End, Flush, Redirect si Write.

4.4 Obiectul Request

Daca obiectul Response reprezinta tot continutul trimis de serverul de


Web catre un browser Web, obiectul Request reprezinta tot continutul trimis
de un browser Web catre serverul Web. Ori de cite ori trebuie preluata
informatie de la un client, se utilizeaza obiectul Request.
Sintaxa este :
Request [.colectie | proprietate|metoda] (variabila)
Colectiile care pot fi utilizate sint : ClientCertificate, Cookies, Form,
QueryString si ServerVariables.
Singura proprietate a obiectului Request este TotalBytes, iar singura
metoda este BinaryRead.
Parametrul variabila este un sir care specifica articolul care se regaseste
dintr-o colectie, sau care va fi utilizat ca intrare pentru o metoda sau
proprietate.

Colectia Form

Pentru a prelua informatia introdusa de un client intr-un formular


HTML se utilizeaza colectia Form a obiectului Request.
Sintaxa este :
Request.Form (element) [(index)|.Count ]
Parametrul element reprezinta numele elementului de pe forma din care
colectia isi regaseste valorile.
Parametrul index reprezinta un parametru optional care permite
accesarea uneia dintre mai multe valori ale unui parametru. El poate lua valori
intre 1 si Request.Form ( parametru ).Count.
In exemplul urmator se creaza o forma in care utilizatorul trebuie sa
completeze doua cimpuri, si anume : cod si nume. In momentul in care se
apasa butonul "Cauta" aceste valori sint trimise catre programul Cauta.asp.

<FORM ACTION="Cauta.asp" METHOD="post">


<P> Cod : <INPUT NAME="COD" SIZE="50"></TD>
<P><TD>Nume:<INPUT NAME="Nume" SIZE="50"></TD>
<TD><INPUT TYPE="submit" value="Cauta"></TD></TR>
</FORM>
In programul Cauta.asp trebuie utilizat scriptul urmator, care permite
regasirea valorilor trimise de catre forma de mai sus. Cele doua valori sint
memorate in variabilele acod_produs si aden_produs.
<%acod_produs=request.form("cod")
aden_produs=request.form("nume")%>

Colectia QueryString

Colectia QueryString permite regasirea valorilor variabilelor dintr-un


sir interogare HTTP. Un sir interogare HTTP este specificat de valorile care
urmeaza semnului ?. Exista mai multe procese care genereaza un sir
interogare. De exemplu, tagul A HREF
<A HREF ="exemplu?sir=acesta este un sir"> sir exemplu</A>
genereaza o variabila cu numele sir care are valoarea "acesta este un
sir". Sirurile interogare sint generate si prin trimiterea unei forme, sau de catre
utilizator prin tastarea unei interogari in caseta de adrese a browser-ului.
Sintaxa este :
Request.QueryString ( varibila ) [ (index)|.Count ]
Parametrul variabila specifica numele variabilei care trebuie regasita in
sirul interogare.
Parametrul index reprezinta un parametru optional care permite
accesarea uneia dintre mai multe valori ale unui parametru. El poate lua valori
intre 1 si Request.QueryString ( variabila ).Count.
Exemplu :
<A HREF ="detaliu.asp?nume=popa&virsta=20"> Nume si virsta</A>
Programului detaliu.asp i se transmite urmatorul sir interogare:
nume=popa&virsta=20
Colectia QueryString va contine doi membri, adica nume si virsta.
Regasirea valorilor celor doi membri se face astfel :
<%
Vnume=request.QueryString("nume")
Vvirsta=request.QueryString("virsta")
In final, cele doua variabile, vnume si vvirsta vor contine valorile
"popa" si "20".
Cap.5 Descrierea aplicatiei

5.1 Structura bazei de date

Baza de date utilizata de aplicatie este realizata in MS Access 2000 si


se numeste bdcinema.mdb. In figura 1 apar tabelele ce compun aceasta baza
de date si legaturile stabilite intre acestea, rezultate in urma aplicarii teoriei
normalizarii relatiilor.

Figura 1 : Structura bazei de date  bdcinema.mdb


Tabela Orase contine un singur cimp den_oras de tip Text, si a fost
creata in scopul usurarii activitatii de programare, in continuare putind fi
imbogatita cu alte cimpuri asa incit sa poata contribui la publicitatea care se
poate face in jurul unui oras in scop turistic.
Tabela Cinematografe cu structura de mai jos permite memorarea unor
informatii legate de cinematografe:
- id_cinema (AutoNumber) PK
- cinema (Text)
- den_oras (Text) FK
- adresa (Text)
- telefon (Text)

Tabela Filme memoreaza datele necesare despre filmele care ruleaza in


cinematografe:
- id_film (AutoNumber) PK
- titlu (Text)
- titlu_original (Text)
- afis ( Text) – calea si numele fisierului care memoreaza poza cu
afisul filmului
- gen (text)
- roman_de (Text)
- durata (Number) in minute
- produs_de (Text) – casa producatoare
- muzica (Text)
- site (Text) – adresa site-ului oficial
- subiect (Memo)
- recomandat (Logic) –pentru filme de valoare care sunt
recomandate spre vizionare, capata valoarea true
- nou (Logic) –pentru filme noi, capata valoarea true
- regizor (Text)
- imagine (Text)
- producator (Text) – directorii filmului
- scenarist (Text)

Imaginile din filme sunt memorate intr-o tabela separata numita


Imagini care contine urmatoarele cimpuri:
- id_imagine (autonumber) PK
- id_film (Number) -FK
- cale_poza (Text) - calea fisierului imagine

Informatiile despre actori sunt grupate in cimpurile tabelei Actori:


- id_actor (AutonNmber) PK
- nume_actor (Text)
- locul_nasterii (Text)
- data_nast (Date/time)
- biografie (Memo)

Tabela Distributie dispune de structura:


- id (AutoNumber) PK
- id_film (Number) FK
- id_actor (Number) FK
- personaj (Text) numele personajului interpretat de actor in film

Tabela Saptamina memoreaza date despre saptamina curenta si cea


viitoare pentru care memoram datele:
- saptamina (Text) PK
- data1 (Date/time) – data de inceput a saptaminii
- data2 (Date/time – data de sfirsit a saptaminii

Tabela Programare memoreaza informatii despre orele la care ruleaza


filmele in diferitele cinematografe:
- id (Autonumber) PK
- saptamina (Text) - FK indica saptamina in care ruleaza filmul
(curenta sau viitoare)
- id_cinema (Number) FK
- id_film (Number) – FK
- program (Text) - zilele si orele la care ruleaza filmul

Tabela Utiliz este cea care memoreaza numele de utilizator si parola


pentru utilizatorii care vor primi drept de gestionare a bazei de date.

5.2 Legaturi intre tabele

In acest paragraf doresc sa explic legaturile pe care le-am stabilit intre


tabelele bazei de date.

Intre tabelele Orase si Cinematografe exista o legatura 1 :m deoarece


intr-un oras exista unul sau mai multe cinematografe.

Intre tabelele Filme si Imagini exista o legatura 1:m, deoarece pentru


un film putem memora una sau mai multe scene.

Intre tabelele Filme si Actori exista o legatura m:m, pentru ca intr-un


film joaca mai multi actori, iar un actor poate fi distribuit in mai multe filme.
Pentru ca in modelul relational nu se poate implementa direct o legatura m:m,
atunci a aparut cea de a treia tabela Distributie, care contine cheile primare
din cele doua tabele implicate in legatura m:m, precum si cimpuri
suplimentare.

Intre tabelele Cinematografe si Filme exista o legatura m:m, pentru ca


intr-un cinema pot rula unul sau mai multe filme in saptamina curenta sau
viitoare, iar acelasi film poate rula intr-unul sau mai multe cinematografe. Ca
urmare, a aparut tabela Programare.

Se observa ca aici mai exista o legatura 1:m intre tabelele Saptamina si


Programare, pentru ca atit pentru saptamina curenta, cit si pentru cea viitoare
exista mai multe programari de filme in diverse cinematografe.
5.3 Interfata cu utilizatorul

In acest paragraf voi prezenta aspectul si continutul paginilor site-ului


care face obiectul acestei lucrari.
5.4 Validari asupra datelor

Procedurile de validare sunt utile in partea de administrare a site-ului,


pentru ca acolo apar operatii de inserare sau actualizare asupra datelor.
Procedurile de validare ajuta la pastrarea consistentei datelor si pentru a evita
ca utilizatorul sa paraseasca pagina din cauza unei erori. Voi prezenta in
continuare citeva din validarile facute pe parcursul acestei lucrari.
La adaugarea unui nou cinematograf, este necesar ca denumirea
acestuia sa fie completat, adica cimpul cinema sa fie diferit de sirul vid.
Verificarea se face in fisierul .asp care implementeaza operatia de inserare sau
adaugare date. Daca valoarea din cimp este vida se afiseaza un mesaj de
eroare corespunzator, ar utilizatorul este trimis inapoi in pagina in care trebuie
sa repare gresala.
if cinema="" then
errorform "Cimpul Cinematograf trebuie completat !", backpage
end if

In aplicatie este utilizata procedura ErrorForm care are doi parametri


formali: errormsg si backpage. La apel, Errormsg va contine mesajul de
eroare care trebuie afisat, iar backpage numele fisierului .asp la care trebuie
intors utilizatorul.
<!-- #INCLUDE FILE="formFields.asp" -->
<%SUB errorform (errorMSG,backpage)%>
<HTML>
<HEAD><TITLE>Eroare</TITLE></HEAD>
<BR><BR><BR><BR>
<BODY bgcolor="black">
<CENTER><FONT SIZE=5 COLOR="White">
<%=errorMSG%>
</FONT>
<FORM ACTION="<%=backpage%>" METHOD ="POST">
<Input name="error" type="hidden" value="1">
<%formFields%>
<INPUT TYPE="Submit" VALUE="Inapoi">
</FORM></CENTER>
</BODY>
</HTML>
<%Response.End
END SUB%>

La gestionarea informatiei din tabela Filme trebuie verificat ca titlul


unui film nu este sirul vid. De asemenea, se verifica daca cimpul durata este
numeric, pentru ca altfel vom avea eroare la executia comenzilor Insert sau
Update. Aceasta ultima verificare se face cu functia IsNumeric().
if titlu="" then
errorform "Titlul filmului trebuie completat !", backpage
end if

if not isnumeric(durata) then


errorform "Durata este un cimp numeric !", backpage
end if

La introducerea sau actualizarea datelor despre actori, se verifica ca


numele actorului sa nu fie sirul vid, si de asemenea ca data lui de nastere sa
aiba formatul correct de data calendaristica. Pentru aceasta se foloseste
functia IsDate().
if nume_actor="" then
errorform "Numele actorului trebuie completat !", backpage
end if

if not isdate(data_nast) then


errorform "Data nasterii nu are format corect de data
calendaristica !", backpage
end if

La actualizarea datelor din tabela Saptamina, trebuie ca datele de


inceput si sfirsit ale saptaminii sa fie completate, si sa aiba format correct.
if data1="" then
errorform "Data inceput trebuie completata !", backpage
end if

if not isdate(data1) then


errorform "Data nu are format corect de data calendaristica !",
backpage
end if

if data2="" then
errorform "Data sfirsit trebuie completata !", backpage
end if

if not isdate(data2) then


errorform "Data nu are format corect de data calendaristica !",
backpage
end if
Mai jos apare un alt exemplu de validare, din pagina Utilizatori. Aici se
verifica in primul rind ca nume_utilizator sa fie diferit de sirul vid. Se verifica
apoi ca si cimpurile parola si confirma parola sa fie diferite de sirul vid si apoi
sa fie identice.
if nume_utilizator="" then
errorform "Cimpul Nume utilizator trebuie completat !", backpage
end if
if parola="" then
errorform "Cimpul Parola trebuie completat !", backpage
end if
if parola1="" then
errorform "Cimpul Confirma parola trebuie completat !", backpage
end if
if parola<>parola1 then
errorform "Cimpul Confirma parola difera de cimpul Parola!", backpage
end if

Pentru a avea acces la paginile de administrare, utilizatorul trebuie sa


furnizeze un nume de utilizator si o parola. Trebuie sa se verifice daca in
tabela Utilizator exista o inregistrare corespunzatoare acestuia. In cazul in
care nu exista, se afiseaza mesajul corespunzator, altfel, utilizatorul va fi lasat
sa mearga mai departe, dupa ce se seteaza in variabila cookie c datele de
identificare ale acestuia ( utilizator si parola). Valorile din aceste doua
cimpuri ale variabilei cookie c, vor fi verificate ca exista si sunt completate in
fiecare pagina a site-ului.
<%utilizator=request.form("utilizator")%>
<%parola=request.form("parola")%>
<%mydsn="DSN=bdcinema"
set con=server.createobject("adodb.connection")
con.open mydsn
sql="select * from utiliz where utilizator='" & utilizator & "' and
parola='" & parola & "'"
set rs=con.execute (sql)
if not rs.eof then
Response.cookies("c")("utilizator")=utilizator
Response.cookies("c")("parola")=parola
cuser =Request.Cookies ("c")("utilizator")
cpass =Request.Cookies ("c")("parola")%>
<%response.redirect "index.asp"
else%>
<BR><BR><BR><BR>
<CENTER><FONT SIZE=5 color="white">Nu am putut identifica
utilizatorul!</FONT>
<FORM ACTION="intra.asp" METHOD="POST">
<INPUT TYPE="Submit" VALUE="Inapoi">
</FORM>
</CENTER>
<%end if%>

Dupa intrarea unui utilizator in partea de administrare a site-ului, in


fiecare pagina are loc o verificare ca cea din script-ul de mai jos.
<%cuser =Request.Cookies ("c")("utilizator")
cpass =Request.Cookies ("c")("parola")
if cuser="" or cpass="" then
permis=false
else
permis=true
end if%>

Se regasesc valorile depuse in variabila cookie c ( utilizator si parola )


si se depun in variabilele cuser si cpass, folosind colectia Cookies a obiectului
Request. Se verifica apoi daca acestea sunt diferite de sirul vid. Daca da
variabila permis capata valoarea true altfel valoarea false. In continuare, in
pagina se verifica daca variabila permis este true, caz in care se afiseaza
informatia din acea pagina. In caz contrar, vizitatorul este refuzat, spunind ca
nu are drepturi.
Aceasta forma de validare in fiecare pagina a site-ului de administrare
impiedica intrarea in pagini ocolind partea de login unde trebuie furnizat
numele si parola de utilizator.

5.5 Tehnici de programare utilizate in partea de administrare

5.5.1 Conexiunea la baza de date

In fiecare pagina a site-ului care afiseaza informatii din baza de date


trebuie realizata conexiunea la baza de date. Dupa cum se observa conexiunea
la baza de date este realizata prin intermediul ODBC (Open Database
Connectivity). Pentru a realiza conexiunea la baza de date se creeaza o
instanta a obiectului Adodb.Connection folosind metoda Createobject a
obiectului Server. Obiectul de tip conexiune se numeste con. Aceasta
conexiune se deschide folosind metoda open si specificind numele sursei
datelor declarata in ODBC. Numele Bdcinema declarat in ODBC ( in System
DSN ) indica catre baza de date bdcinema.mdb care este folosita de paginile
site-ului.
<%mydsn="DSN=bdcinema"
set con=server.createobject("adodb.connection")
con.open mydsn%>

5.5.2 Inserarea si actualizarea datelor

In partea de administrare, lucrurile sunt programate sa se desfasoare


astfel: in partea de sus apare meniul principal cu principalele hiperlegaturi, se
afiseaza datele existente in tabela selectata, in dreptul fiecarei inregistrari se
afiseaza hiperlegaturile Actualizare si Stergere, iar mai jos butonul Adauga
care permite adaugarea unei noi inregistrari. Voi face exemplificare pe
gestiunea tabelei cinematografe. Pentru afisarea inregistrarilor existente in
aceasta tabela se executa comanda Select din variabila sqls. Dupa executia
comenzii, se obtine variabila recordset rss folosita apoi pentru afisarea
inregistrarilor. Se parcurg aceste inregistrari cu ajtorul unui iclu do while…
loop peste variabila rss, in prealabil verificindu-se daca recordset-ul nu este
vid. Se afiseaza datele despre cinematografe, adica valorile din cimpurile
cinema, adresa si telefon. Hiperlegatura Actualizeaza permite editarea
inregistrarii identificata in mod unic de valoarea id_cinema. Hiperlegatura ne
conduce in aceeasi pagina catre care se trimite variabila id_cinema si edit
pentru a sti ca este vorba de operatia de editare si pentru a sti ce inregistrare se
editeaza.
<%sqls="select * from Cinematografe order by den_oras"
set rss=con.execute (sqls)%>

<%if not rss.eof then%>


<CENTER><b>Cinematografe</b><br>
<TABLE BORDER=1 width=600 cellspacing=0>
<%do while not rss.eof%>
<%id_cinema=rss.fields("id_cinema")%>
<TR>
<TD><B><%=rss.fields("cinema")%><td><%=rss("den_oras")
%></B></TD>
<td><%=rss("adresa")%><td><%=rss("telefon")%>
<%leg1="stergec1.asp?id_cinema=" & id_cinema%>
<%leg2="c1.asp?edit=1&id_cinema=" & id_cinema%>
<TD><A HREF="<%=leg2%>">Actualizare</A>/<A HREF="<
%=leg1%>">Stergere</A></TD>
</TR>
<%rss.movenext
loop%>
</TABLE></CENTER><BR><BR>
<%end if%>

Daca variabila edit recuperata cu ajutorul colectiei Querystring a


obiectului Request are valoarea 1, trebuie efectuata operatia de editare a
inregistrarii obtinuta prin executia comenzii Select din variabila sir sql1 si
depusa in obiectul rs1.
<%edit=request.querystring("edit")%>
<%if edit=1 then
sql1="select * from Cinematografe where id_cinema=" & id_cinema
set rs1=con.execute (sql1)
end if%>

Butonul de adaugare o noua inregistrare este un buton submit amplasat


pe o forma care transfera controlul aceluiasi fisier, dar trimite variabila ad
egala cu 1 pentru a indica operatia de adaugare.
<FORM ACTION="c1.asp?ad=1" METHOD="POST" >
<TR><TD><INPUT TYPE="SUBMIT" VALUE="Adauga"></TD></TR>
</FORM>
In continuare, in functie de valorile variabilelor edit si ad se afiseaza
forma pentru editarea sau adaugarea datelor. Deci, se testeaza daca variabila
edit are valoarea 1, caz in care se afiseaza controalele populate cu valorile din
cimpurile inregistrarii de editat. Altfel, se testeaza daca variabila ad are
valoarea 1, caz in care se afiseaza forma cu controalele vide, pregatita pentru
primirea noilor date. Dupa completarea formei, controlul este redat unui alt
fisier in care se face, dupa caz inserare sau actualizare.
<%if ad=1 then%>
<CENTER><TABLE>
<FORM ACTION="admod1.asp?ad=1" METHOD="POST">
<TR><TD>Cinema:</TD>
<TD><INPUT TYPE="TEXT" NAME="cinema" VALUE="<%=cinema%>"
SIZE=50></TD></TR>
<TR><TD>Oras:</TD>
<TD>
<%
sqlo="Select * from Orase "
set rso=con.execute(sqlo)%>
<select name="den_oras">
<%if not rso.eof then%>
<%do while not rso.eof%>
<option value="<%=rso("den_oras")%>" <%if rso("den_oras")=den_oras then
%>selected<%end if%>><%=rso("den_oras")%>
<%rso.movenext%>
<%loop%>
<%end if%>
</select>
</TD></TR>
<TR><TD>Adresa:</TD>
<TD><INPUT TYPE="TEXT" NAME="adresa" VALUE="<%=adresa%>"
SIZE=50></TD></TR>
<TR><TD>Telefon:</TD>
<TD><INPUT TYPE="TEXT" NAME="telefon" VALUE="<%=telefon%>"
SIZE=20></TD></TR>
<TR><TD><INPUT TYPE="SUBMIT" VALUE="Salveaza"></TD>
</FORM>

<FORM ACTION="c1.asp?cancel=1" METHOD="POST">


<TD><INPUT TYPE="SUBMIT" VALUE="Abandon"></TD></TR>
</FORM>
</TABLE></CENTER>
<%else%>

<%if edit=1 then%>


<CENTER><TABLE>
<FORM ACTION="admod1.asp?edit=1" METHOD="POST" >
<INPUT TYPE=hidden NAME="id_cinema" VALUE="<%=rs1.fields("id_cinema")%>">
<TR><TD>Cinema:</TD>
<TD><INPUT TYPE="TEXT" NAME="cinema" VALUE="<%=rs1.fields("cinema")%>"
SIZE=50></TD></TR>
<TR><TD>Oras:</TD>
<TD>
<%
sqlo="Select * from Orase"
set rso=con.execute(sqlo)%>
<select name="den_oras">
<%if not rso.eof then%>
<%do while not rso.eof%>
<option value="<%=rso("den_oras")%>" <%if
rso("den_oras")=rs1("den_oras") then%>selected<%end if%>>
<%=rso("den_oras")%>
<%rso.movenext%>
<%loop%>
<%end if%>
</select>
</TD></TR>

<TR><TD>Adresa:</TD>
<TD><INPUT TYPE="TEXT" NAME="adresa" VALUE="<%=rs1.fields("adresa")%>"
SIZE=50></TD></TR>
<TR><TD>Telefon:</TD>
<TD><INPUT TYPE="TEXT" NAME="telefon" VALUE="<%=rs1.fields("telefon")%>"
SIZE=20></TD></TR>

<TR><TD><INPUT TYPE="SUBMIT" VALUE="Salveaza"></TD>


</FORM>

<FORM ACTION="c1.asp?cancel=1" METHOD="POST" >


<TD><INPUT TYPE="SUBMIT" VALUE="Abandon"></TD></TR>
</FORM>
</TABLE></CENTER>

<%end if%>
<%end if%>

In cazul exemplului nostru, actualizarea sau inserarea se face de catre


fisierul admod1.asp. Catre acesta se trimit variabilele ad sau edit care se
recupereaza folosind colectia Querystring a obiectului Request. Se obtin si
valorile variabilelor completate pe forma, dar folosind colectia Forms a
aceluiasi obiect Request. Se fac validarile asupra datelor. Daca acestea nu
sunt completate, sau sunt completate gresit, controlul este redat inapoi
fisierului pentru a corecta greselile. Daca toate lucrurile sunt bune, se trece la
executia comenzii SQL Insert daca variabila ad are valoarea 1, sau a comenzii
SQL Update daca variabila edit are valoarea 1. Executia acestor comenzi se
face cu ajutorul metodei Execute a obiectului conexiune la baza de date. In
final, controlul este redat fisierului anterior, folosind metoda Redirect a
obiectului Response.
<%mydsn="DSN=bdcinema"
set con=server.createobject("adodb.connection")
con.open mydsn

ad=request.querystring("ad")
edit=request.querystring("edit")%>

<%id_cinema=request.form("id_cinema")%>
<%cinema=request.form("cinema")%>
<%den_oras=request.form("den_oras")%>
<%adresa=request.form("adresa")%>
<%telefon=request.form("telefon")%>

<%if ad=1 then


backpage="c1.asp?ad=1"
else
backpage="c1.asp?edit=1&id_cinema=" & id_cinema
end if
if cinema="" then
errorform "Cimpul Cinematograf trebuie completat !", backpage
end if
if ad=1 then
sqlins="Insert into Cinematografe(cinema, den_oras, adresa, telefon)
Values('"
sqlins=sqlins & cinema & "','" & den_oras & "','" & adresa & "','" &
telefon & "')"
end if
if edit=1 then
sqlins="Update cinematografe Set cinema='" & cinema & "',"
sqlins=sqlins & "den_oras='" & den_oras & "',"
sqlins=sqlins & "adresa='" & adresa & "',"
sqlins=sqlins & "telefon='" & telefon & "' where id_cinema=" &
id_cinema
end if
con.execute (sqlins)
ad=0
edit=0%>
<BODY>
<%response.redirect "c1.asp"%>

5.5.3 Stergerea datelor

In ceea ce priveste stergerea unei inregistrari, trebuie urmata


hiperlegatura cu acelasi nume care ne conduce in fisierul .asp ce realizeaza
stergerea efectiva a acesteia. Catre acest fisier se trimite obligatoriu valoarea
cimpului cheie primara pentru a identifica in mod unic inregistrarea care se
sterge. N cazul administrarii tabelei Cinematografe, la stergere, controlul este
dat fisierului stergec1.asp catre care se trimite valoarea variabilei id_cinema.
<%leg1="stergec1.asp?id_cinema=" & id_cinema%>

In fisierul stergec1.asp, se afla valoarea variabilei id_cinema trimisa


sub forma unui sir interogare, se descide conexiunea la baza de date si se
executa comanda Delete cu clauza Where care identifica in mod unic
inregistrarea de sters. Dupa executia comenzii SQL delete controlul este redat
fisierului anterior cu aceeasi metoda Redirect a obiectului Response.
<%id_cinema=request.querystring("id_cinema")%>
<%mydsn="DSN=bdcinema"
set con=server.createobject("adodb.connection")
con.open mydsn
sqlins="Delete * from Cinematografe where id_cinema=" & id_cinema
con.execute (sqlins)%>
<%response.redirect "c1.asp"%>

In final, doresc sa precizez, ca in fiecare pagina de administrare a


datelor din tabele bazei de date, lucrurile decurg intr-o maniera asemanatoare.
5.6 Tehnici de programare utilizate in partea de client

5.6.1 Pagina Acasa

Afiseaza pe de o parte titlurile filmelor care au cimpul Nou setat la


True, precum si filmele recomandate care au cimpul Recomandat setat la
True. Pentru aceasta se selecteaza din tabela Filme inregistrarile care satisfac
conditia nou=True. Comanda Select memorata in variabila sql1, este trimisa
spre executie la SGBD, iar rezultatul este depus in variabila rs1, variabila
obiect de tip recordset. Exectia unei comenzi SQL se face cu metoda Execute
a obiectului conexiune la baza de date. Pentru a afisa titlurile filmelor noi se
parcurge obiectul recordset rs1 cu ajutorul unui ciclu do while…loop.
Trecerea la urmatoarea inregistrare se face cu metoda Movenext a obiectului
recordset rs1.
<%sql1="Select * from Filme where nou=true"
set rs1=conntemp.execute(sql1)%>
<%if not rs1.eof then%>
<h3>Filme noi</h3>
<%do while not rs1.eof%>
<table width=565>
<tr><td colspan=2>
<a href="./filme/filmed.asp?id_film=<%=rs1("id_film")%>">
<h3><%=rs1("titlu")%> ( <%=rs1("titlu_original")%> )</h3></a>
<tr><td valign="top">
<%afis="." & rs1("afis")%>
<img src="<%=afis%>">
<td><%=rs1("subiect")%>
<tr><td>&nbsp<td>&nbsp
</table>
<%rs1.movenext%>
<%loop%>
<%end if%>

Afisarea valorii dintr-un cimp al recordset-ului se face cu constructia <


%=recordset(“nume_cimp”)%>. De exemplu pentru a afisa titlul filmului se
scrie : <%=rs1("titlu")%>. Pe titlul filmului este amplasata o hiperlegatura
care ne trimite in pagina filmed.asp care afiseaza detalii despre film. Catre
aceasta pagina se trimite sub forma unui sir interogare variabila id_film setata
la valoarea cimpului id_film, care identifica in mod unic filmul despre care
vrem detalii.
Pentru afisarea informatiilor despre filmele recomandate, se procedeaza
asemanator, cu script-ul urmator:
<%sql1="Select * from Filme where recomandat=true and nou=false"
set rs1=conntemp.execute(sql1)%>
<%if not rs1.eof then%>
<h3>Va recomandam urmatoarele filme</h3>
<%do while not rs1.eof%>
<table width=565>
<tr><td colspan=2>
<a href="./filme/filmed.asp?id_film=<%=rs1("id_film")%>">
<h3><%=rs1("titlu")%> ( <%=rs1("titlu_original")%> )</h3></a>
<tr><td valign="top">
<%afis="." & rs1("afis")%>
<img src="<%=afis%>">
<td><%=rs1("subiect")%>
<tr><td>&nbsp<td>&nbsp
</table>
<%rs1.movenext%>
<%loop%>
<%end if%>

5.6.2 Pagina In cinematografe

Se afiseaza datele care incadreaza saptamina curenta. Pentru aceasta,


dupa ce ne conectam la baza de date selectam din tabela Saptamina
inregistrarea corespunzatoare saptaminii curente.

<%sql1="Select * from Saptamina where saptamina='curenta'"


set rs1=conntemp.execute(sql1)%>
<h3>Programul cinematografelor in saptamina <%=rs1("data1")%>-<
%=rs1("data2")%></h3>

Se afiseaza apoi o lista drop-down care contine numele oraselor din


tabela Orase ordonate alfabetic. Lista contine inregistrarile din tabela Orase
selectate cu comanda din variabila sql2. Lista drop-down este realizata
dinamic cu ajutorul obiectului recordset rs2, folosind tag-urile <Select> si
<Option>. Lista este inclusa intr-o forma HTML care la apasarea butonului de
tip Submit Alege ne va trimite in aceeasi pagina in_cinematografe.asp, pentru
ca dupa alegerea unui oras tot aici se vor afisa cinematografele si programele
lor corespunzatoare orasului ales.
<%sql2="Select * from orase order by den_oras"
set rs2=conntemp.execute(sql2)%>
<table>
<form method="post" action="in_cinematografe.asp">
<tr><td><select name="do1">
<%if not rs2.eof then%>
<%do while not rs2.eof%>
<option value="<%=rs2("den_oras")%>" <%if den_oras=rs2("den_oras")
then%>selected<%end if%>>
<%=rs2("den_oras")%></option>
<%rs2.movenext%>
<%loop%>
<%end if%>
</select>
<td><input type="submit" value="Alege">
<td>&nbsp
</form>

Obtinerea variabilei care indica orasul ales in formularul HTML, se


obtine folosind colectia Forms a obiectului Request. Variabila den_oras ne va
ajuta mai departe sa selectam doar informatia aferenta acestui oras.
<%den_oras=request.form("do1")

Se selecteaza doar cinematografele din orasul selectat si indicat de


varibila den_oras ( variabila sqlc). In rsc se depun aceste inregistrari. Acest
recordset este parcurs secvential pentru a afisa numele cinematografului,
adresa si telefonul sau. A fiecare pas al ciclului peste rsc, se executa
interogarea Select din variabila sqlfilme. Este o interogare complicata care
permite afisarea titlurilor filmelor ce ruleaza in sapatamina curenta la
cinematograful curent. Pentru a afisa titlurile acestor filme, se parcurge cu un
ciclu variabila recordset rsf in care sunt depuse aceste inregistrari. Pentru
fiecare titlu de film afisat, trebuie sa apara si programarile acestuia, ziua si
ora. Pentru aceasta trebuie executata interogarea din variabila sqlp care
selecteaza din tabela Programari toate inregistrarile pentru filmul current si la
cinematograful current. Ele sunt depuse in variabila recordset rsp care si ea
trebuie parcursa cu un ciclu pentru afisare.
Ca urmare in script-ul de mai jos apar trei cicluri imbricate: unul pentru
afisarea cinematografelor din orasul selectat, al doilea pentru filmele care
ruleaza in saptamina curenta la fiecare cinematograf si al treilea pentru
programarile fiecarui film la fiecare cinematograf.
<%if den_oras<>"" then%>
<%sqlc="Select * from cinematografe where den_oras='" & den_oras & "'"
set rsc=conntemp.execute(sqlc)%>
<%if not rsc.eof then%>
<table width=565>
<%do while not rsc.eof%>
<tr bgcolor="lightgrey"><td colspan=2><font color="black"><
%=rsc("cinema")%>
(<%=rsc("adresa")%> tel:<%=rsc("telefon")%>)</font>
<%sqlfilme="SELECT programare.id_cinema, programare.id_film, filme.titlu,
"
sqlfilme=sqlfilme & " filme.titlu_original, programare.saptamina FROM
filme INNER JOIN "
sqlfilme=sqlfilme & " programare ON filme.id_film = programare.id_film
GROUP BY "
sqlfilme=sqlfilme & " programare.id_cinema, programare.id_film,
filme.titlu, "
sqlfilme=sqlfilme & " filme.titlu_original, programare.saptamina "
sqlfilme=sqlfilme & " HAVING programare.id_cinema=" & rsc("id_cinema")
sqlfilme=sqlfilme & " AND programare.saptamina='curenta'"

set rsf=conntemp.execute(sqlfilme)%>
<%if not rsf.eof then%>
<%do while not rsf.eof %>
<tr><td valign="top">
<a href="film.asp?id_film=<%=rsf("id_film")%>&den_oras=<%=den_oras%>">
<%=rsf("titlu")%> (<%=rsf("titlu_original")%> )</a>
<td valign="top">
<%sqlp="SELECT [programare].[id_film], [programare].[program],
[programare].[saptamina], "
sqlp=sqlp & " [programare].[id_cinema] FROM programare WHERE "
sqlp=sqlp & " [programare].[saptamina]='curenta' And [programare].
[id_cinema]=" & rsc("id_cinema")
sqlp=sqlp & " and [programare].[id_film]=" & rsf("id_film")
set rsp=conntemp.execute(sqlp)%>
<%if not rsp.eof then%>
<%do while not rsp.eof%>
<%=rsp("program")%><br>
<%rsp.movenext%>
<%loop%>
<%end if%>
<tr bgcolor="lightblue"><td colspan=3>
<%rsf.movenext%>
<%loop%>
<%end if%>
<%rsc.movenext%>
<%loop%>
</table>
<%end if%>
<%end if%>

5.6.3 Pagina cu informatii detaliate despre un film

Asa cum am spus pe titlul filmului este pusa hiperlegatura la pagina cu


informatii detaliate despre film, catre care se trimite varibila id_film ce
identifica in mod unic filmul. Varibila, fiind trimisa ca sir interogare, se
obtine folosind colectia Querystring a obiectului Request.
id_film=request.querystring("id_film")

Pentru a afisa informatiile despre filmul identificat unic de id_film,


trebuie sa interogam tabela Filme si tabelele Distributie si Actori. Comenzile
Select se afla in sql1 si sql2.
<%sql1="Select * from Filme where id_film=" & id_film
set rs1=conntemp.execute(sql1)
sql2="SELECT distributie.id_film, distributie.id_actor,
distributie.personaj, "
sql2=sql2 & " actori.nume_actor FROM actori INNER JOIN distributie "
sql2=sql2 & " ON actori.id_actor = distributie.id_actor where
distributie.id_film=" & id_film
set rs2=conntemp.execute(sql2)%>

Folosind variabilele recordset rs1 si rs2 putem sa afisam toate


informtiile despre film: gen, productie, regizor, scenarist,s.a.m.d. Pentru ca
afisarea sa fie cit mai ordonata se folosesc tabele HTML.
<table width=565>
<tr><td bgcolor="lightgrey"><font color="black" size=4>
<%=rs1("titlu")%> (<%=rs1("titlu_original")%>)</font>
</table>
<table>
<%afis=".." & rs1("afis")%>
<tr><td valign="top"><img src="<%=afis%>">
<td><%=rs1("subiect")%>
</table>
<br><br>
<table width=450>
<tr><td>Gen:
<td><%=rs1("gen")%>
<tr><td>Dupa un roman de:
<td><%=rs1("roman_de")%>
<tr><td>Durata:
<td><%=rs1("durata")%> minute
<tr><td>Casa productie:
<td><%=rs1("produs_de")%>
<tr><td>Director film:
<td><%=rs1("producator")%>
<tr><td>Regie:
<td><%=rs1("regizor")%>
<tr><td>Scenariu:
<td><%=rs1("scenarist")%>
<tr><td>Imagine:
<td><%=rs1("imagine")%>
<tr><td>Muzica:
<td><%=rs1("muzica")%>
</table>

Pentru afisarea distributiei: nuem personaj si nume actor se parcurge


variabila recordset rs2, ca mai jos.
<%if not rs2.eof then%>
<table width=565>
<tr><td colspan=3 bgcolor="lightgrey"><font
color="black">Distributie</font>
<%do while not rs2.eof%>
<tr><td><%=rs2("personaj")%><td>...<td>
<a href="actor.asp?id_actor=<%=rs2("id_actor")%>" target="new"><
%=rs2("nume_actor")%><a href>
<%rs2.movenext%>
<%loop%>
</table>
<%end if%>

Filmele dispun, in general si de o colectie de imagini memorate in


tabela Imagini. Pentru afisarea lor se executa comanda Select din variabila
sql3, care selecteaza imaginile pentru filmul identificat de id_film. Pentru
afisare se parcurge variabila recordset rs3 si se foloseste tag-ul HTML <IMG
SRC>.
<%sql3="select * from Imagini where id_film=" & id_film
set rs3=conntemp.execute(sql3)%>

<%if not rs3.eof then%>


<table width=565>
<tr><td colspan=2 bgcolor="lightgrey"><font color="black">Imagini din
film</font>
<%do while not rs3.eof%>
<%p=".." & rs3("cale_poza")%>
<tr><td><img src="<%=p%>">
<%rs3.movenext%>
<%if not rs3.eof then%>

<%p=".." & rs3("cale_poza")%>


<td><img src="<%=p%>">
<%end if%>
<%if not rs3.eof then%>
<%rs3.movenext%>
<%end if%>
<%loop%>
</table>
<%end if%>

5.6.4 Pagina cu informatii detaliate despre un actor

La afisarea distributiei unui film, pe numele fiecarui actor este


amplasata o hiperlegatura care ne conduce in pagina actor.asp pentru a afla
date despre acesta.
Obtinerea variabilei id_actor trimisa sub forma unui sir interogare, se
face tot cu colectia Querystring a obiectului Request. Variabila ajuta la
identificarea unica a actorului. Datele despre acesta se obtin din tabela Actori
cu comanda Select din variabila sql1. Urmeaza apoi afisarea datelor ( nume,
data nasterii, locul nasterii, biografie) in forma tabelara cu ajutorul obiectului
Recordset rs1.
<%id_actor=request.querystring("id_actor")

mydsn="DSN=bdcinema"
Set conntemp = Server.CreateObject("ADODB.Connection")
conntemp.Open mydsn%>
<%sql1="Select * from Actori where id_actor=" & id_actor
set rs1=conntemp.execute(sql1)%>
<center>
<table width=565>
<tr><td bgcolor="lightgrey" colspan=2>
<font color="black" size=5><%=rs1("nume_actor")%></font>
<tr><td>Data nasterii:<td><%=rs1("data_nast")%>
<tr><td>Locul nasterii:<td><%=rs1("locul_nasterii")%>
<tr><td colspan=2><%=rs1("biografie")%>
</table>

5.6.5 Pagina Filme

In aceasta pagina se afiseaza titlurile tuturor filmelor care ruleaza


oriunde in tara in sapatamina curenta. Pentru fiecare film se afiseaza titlul,
afisul si descrierea subiectului. Pentru a face selectia inregistrarilor se executa
comanda Select din variabila sql1, rezultatul depunindu-se in variabila
recordset rs1. Informatiile detaliate se obtin urmind hiperlegatura amplasata
pe titlul filmului. Comanda Select foloseste optiunile Group By si Having.
<%mydsn="DSN=bdcinema"
Set conntemp = Server.CreateObject("ADODB.Connection")
conntemp.Open mydsn%>
<%sql1="SELECT filme.id_film, filme.titlu, filme.titlu_original,
filme.afis, "
sql1=sql1 & " filme.subiect, programare.saptamina FROM filme INNER JOIN
programare "
sql1=sql1 & " ON filme.id_film = programare.id_film GROUP BY
filme.id_film, filme.titlu, "
sql1=sql1 & " filme.titlu_original, filme.afis, filme.subiect,
programare.saptamina "
sql1=sql1 & " HAVING (((programare.saptamina)='curenta')) ORDER BY
filme.titlu"
set rs1=conntemp.execute(sql1)%>
<%if not rs1.eof then%>
<table width=565>
<%do while not rs1.eof%>
<tr><td colspan=2>
<a href="filmed.asp?id_film=<%=rs1("id_film")%>">
<h3><%=rs1("titlu")%> ( <%=rs1("titlu_original")%> )</h3></a>
<tr><td valign="top">
<%afis=".." & rs1("afis")%>
<img src="<%=afis%>">
<td><%=rs1("subiect")%>
<%rs1.movenext%>
<%loop%>
</table>
<%end if%>

5.6.6 Pagina Actori

Afiseaza lista alfabetica cu numele actorilor existenti in baza de date.


Afisarea se face pe doua coloane pentru a ocupa mai bine fereastra browser-
ului cu informatie. Se interogheaza tabela Actori. Inregistrarile sunt depuse in
variabila recordset rs1. Numele fiecarui actor este o hiperlegatura la aceeasi
pagina actori.asp catre care se trimite variabila id_actor. Asta inseamna ca
datele de detaliu despre actorul selectat se fac in aceeasi pagina sub lista cu
numele actorilor. Dupa obtinerea variabilei id_actor cu ajutorul colectiei
Querystring a obiectului Request se executa cea de a doua interogare din
script-ul de mai jos care selecteaza din tabela Actori numai inregistrarea
corespunzatoare actorului selectat.
<%mydsn="DSN=bdcinema"
Set conntemp = Server.CreateObject("ADODB.Connection")
conntemp.Open mydsn%>
<%sql1="Select * from Actori order by nume_actor"
set rs1=conntemp.execute(sql1)%>
<center>
<%if not rs1.eof then%>
<table width=565>
<%do while not rs1.eof%>
<tr><td><font size=4>
<a href="actori.asp?id_actor=<%=rs1("id_actor")%>">
<%=rs1("nume_actor")%></a></font>
<%rs1.movenext%>
<%if not rs1.eof then%>
<td><font size=4>
<a href="actori.asp?id_actor=<%=rs1("id_actor")%>">
<%=rs1("nume_actor")%></a></font>
<%end if%>
<%if not rs1.eof then%>
<%rs1.movenext%>
<%end if%>
<%loop%>
</table>
<%end if%>
</P>
<p>
<%id_actor=request.querystring("id_actor")%>
<%if id_actor<>"" then%>
<%sql1="Select * from Actori where id_actor=" & id_actor
set rs1=conntemp.execute(sql1)%>
<center>
<table width=565>
<tr><td bgcolor="lightgrey" colspan=2>
<font color="black" size=5><%=rs1("nume_actor")%></font>
<tr><td>Data nasterii:<td><%=rs1("data_nast")%>
<tr><td>Locul nasterii:<td><%=rs1("locul_nasterii")%>
<tr><td colspan=2><%=rs1("biografie")%>
</table>
<%end if%>

5.6.7 Pagina Arhiva filme

Afiseaza titlurile filmelor existente in arhiva, adica cele despre care


avem informatii in baza de date si care nu ruleaza in nici un cinematograf nici
in saptamina curenta nici in cea viitoare. Pntru a face selectia acestor filme
trebuie executata comanda Select memorat in variabila sql1 care contine si
subinterogare ( Select in Select). E selecteaza toate filmele din tabela cu
acelasi nume si care nu figureaza in tabela Programare folosind operatorul not
in. Afisarea se face in modalitatea stiuta. Fiecare titlu de film este o
hiperlegatura la pagina cu detalii.
<%mydsn="DSN=bdcinema"
Set conntemp = Server.CreateObject("ADODB.Connection")
conntemp.Open mydsn%>
<%sql1="SELECT * from Filme where id_film not in ( Select id_film from
Programare)"
set rs1=conntemp.execute(sql1)%>
<%if not rs1.eof then%>
<table width=565>
<%do while not rs1.eof%>
<tr><td colspan=2>
<a href="filmed.asp?id_film=<%=rs1("id_film")%>">
<h3><%=rs1("titlu")%> ( <%=rs1("titlu_original")%> )</h3></a>
<tr><td valign="top">
<%afis=".." & rs1("afis")%>
<img src="<%=afis%>">
<td><%=rs1("subiect")%>
<%rs1.movenext%>
<%loop%>
</table>
<%end if%>

In final doresc sa mentionez ca pagina in viitor are o realizare tehnica


asemanatoare cu cea intitulata In cinematografe.

Cap.6 Concluzii

Aplicatia intitulata “Gestiune si prezentare on-line a programelor


cinematografelor din Romania”, reprezinta o colectie de pagini web care
realizeaza doua functiuni importante:
1. pune la dispozitia publicului larg o serie de informatii despre filmele
are ruleaza in cinematografele din diverse orase
2. permite gestionarea informatiei din baza de date din care isi extrage
site-ul continutul.

Informatiile oferite de site sunt grupate sub titlurile : Acasa, In


cinematografe, In viitor, Filme, Actori, Arhiva.
Mentionez ca in partea de administrare, accesul se face numai pentru
utilizatorii autorizati, care se identifica printr-un nume si o parola. Este
impiedicat accesul utilizatorilor in diverse pagini daca acestia incearca sa
ocoleasca pagina de login. Asupra tabelelor din baza de date se
implementeaza operatiile traditionale pe baze de date: adaugare, modificare si
stergere, cu validarea datelor pentru a pastra consistenta informatiei si a
impiedica iesirea din aplicatie din cauza unei erori netratate.

Baza de date din spatele paginilor Web este implementata in MS


Access 2000, iar accesul se face prin intermediul ODBC. Avind in vedere ca
am construit un site dinamic, pentru realizarea aplicatiei am folosit HTMl
(HyperText Mark-up Language) si ASP (Active Server Pages).
Luind in considerare faptul ca baza de date MS Access nu permite decit
un numar de cinci utilizatori simultan o prima propunere de imbunatatire se
refera la implemetarea bazei de date in MS SQL Server, care ofera facilitati
suplimentare.
O alta propunere de imbunatatire a lucrarii ar fi completarea site-ului cu
o versiune in limba engleza, pentru a putea fi consultat si de catre persoane
din strainatate.
De asemenea, site-ul ar trebui sa dispuna pe viitor de operatii simple
sau mai avansate de cautare, avind in vedere ca baza de date poate atinge
dimensiuni medii. Cautarea ar putea sa se faca dupa numele unui actor,
regizor, dupa titlul filmului. De asemenea, cautarea ar trebui sa fie inexacta,
permitind regasirea unor informatii chiar daca utilizatorul nu stie numele
complet sau titlul complet si corect al filmului.
De asemenea, in partea de administrare ar mai putea fi adaugata o
optiune care sa permita si gestionarea utilizatorilor: adaugare sau stergere
utilizator de catre o persoana cu drepturi corespunzatoare, sau posibilitatea ca
fiecare utilizator sa-si modifice numele sau parola cu care se logheaza.

Bibliografie
1. Allen Browne, Alison Balter – Access 95 Editura Teora 1996

2. Jeff Perkins, Bryan Morgan – SQL fara profesor, in 14 zile,


Editura Teora 1998

3. Microsoft Access 2000, Editura Teora 2000

4. Sisteme de gestiune a bazelor de date si Proiectarea bazelor de


date – notite de curs

5. Comert electronic - notite de curs

6. Internet si Intranet – notite de curs

7. Burdescu Dumitru dan, Ionescu Augstin Iulian, Stanescu Liana –


Baze de date Access Indrumar de laborator Tipogafia
Universitatii din Craiova 2002

8. S.Walther, J.levine - Programarea in ASP pentru comert


electronic - Editura Teora 2000

9. www.cinema.ro

S-ar putea să vă placă și