18.04.2013 Views

SUPORT PENTRU LABORATOR - ULBS

SUPORT PENTRU LABORATOR - ULBS

SUPORT PENTRU LABORATOR - ULBS

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ă ş<br />

BAZE DE DATE<br />

<strong>SUPORT</strong> <strong>PENTRU</strong> <strong>LABORATOR</strong><br />

VISUAL FOXPRO<br />

Ş<br />

Edited by Foxit PDF Editor<br />

Copyright (c) by Foxit Software Company, 2004<br />

For Evaluation Only.<br />

Ş


Limbaje de programare şi baze de date 1<br />

SISTEMUL DE GESTIUNE A<br />

BAZELOR DE DATE<br />

Principalele obiective ale capitolului sunt:<br />

Concepte principale din teoria relaţională<br />

Cheia primară<br />

Cheia externă<br />

Sisteme de gestiune a bazelor de date<br />

Sistemul de gestiune a bazelor de date (SGBD) este<br />

componenta unui sistem de bază de date care are rolul de a permite<br />

descrierea şi manipularea conform unui model de date.<br />

În momentul actual, cea mai mare parte a SGBD-urilor care se<br />

utilizează sunt bazate pe modelul relaţional.<br />

VFP este un SGBD relaţional cu limbaj propriu, care suportă<br />

un nucleu extins din limbajul relaţional SQL (Structured Query<br />

Language).


2<br />

Suport pentru laborator<br />

PRINCIPALELE CONCEPTE DIN TEORIA RELAŢIONALĂ<br />

Domeniul - reprezintă un ansamblu de valori, caracterizat<br />

printr-un nume. Domeniul se poate defini explicit, prin enumerarea<br />

tuturor valorilor care aparţin acestuia (exemplu D1:{roşu, galben,<br />

albastru}), sau implicit prin precizarea proprietăţilor pe care le au<br />

valorile domeniului respectiv (exemplu: D2:{e/e∈ N }<br />

Relaţia - (tabela) reprezintă un subansamblu al produsului<br />

cartezian dintre mai multe domenii (D1xD2x…) caracterizat printr-un<br />

nume. Reprezentarea folosită pentru o relaţie (R) este tabloul<br />

bidimensional (tabela de date) de forma:<br />

Atributul este coloana unei relaţii caracterizate printr-un<br />

nume. Fiecare atribut îşi ia valorile dintr-un domeniu. Mai multe<br />

atribute pot lua valori din acelaşi domeniu.<br />

Tuplul este linia dintr-o relaţie şi nu are nume. Valorile dintr-un<br />

tuplu aparţin produsului cartezian dintre domeniile relaţiei (exemplu<br />

tuplul v1, v2, ...,vn, unde v1∈D1, v2∈D2,...,vn∈Dm, cu n ≥m numere<br />

întregi).<br />

Schema relaţiei este un ansamblu format din numele relaţiei<br />

(R) urmat între parantaze rotunde de lista atributelor (Ai), pentru<br />

fiecare atribut precizându-se domeniul asociat (Dj):<br />

R(A1:D1, A2:D2,...,An:Dm):<br />

unde n ≥m numere întregi.<br />

Cheia este un atribut sau un ansamblu de atribute cu ajutorul<br />

căruia se poate identifica un tuplu dintr-o relaţie.<br />

Cheia este primară dacă identificarea este unică, adică există<br />

un singur tuplu cu o anumită valoare pentru cheie.


Limbaje de programare şi baze de date 3<br />

Cheia este simplă, dacă este formată dintr-un singur atribut.<br />

Cheia este compusă dacă este formată dintr-un ansamblu de<br />

atribute.<br />

Cheia este externă într-o relaţie R1, dacă ansamblul de<br />

atribute care o defineşte ia valori din aceleaşi domenii ca şi cheia<br />

primară a unei relaţii R2 si dacă are rolul de a stabili o legătura<br />

(asociere) între cele două relaţii.<br />

Prezentare comparativă a noţiunilor privind organizarea<br />

datelor în memoria externă în fişiere, baze de date relaţionale (BDR)<br />

şi cele utilizate în VFP.<br />

Mem<br />

externă<br />

FISIER CÂMP - CHEIE - -<br />

BDR RELAŢIE ATRIBUT ASOCIERE CHEIE CHEIE DOMENIU<br />

PRIMARĂ EXTERNĂ<br />

VFP TABELĂ CÂMP ASOCIERE CHEIE CHEIE -<br />

(LEGATURA) PRIMARĂ<br />

Intrebări:<br />

1. Pentru tabelele FURNIZORI şi FACTURI<br />

(ANEXA 1) care sunt cheile?<br />

2. Daţi exemplu de un atribut şi de un tuplu<br />

pentru relaţia FACTURI (ANEXA 1)


4<br />

GENERALITĂŢI DESPRE<br />

APLICAŢIA VISUAL FOX PRO<br />

Suport pentru laborator<br />

Principalele obiective ale capitolului sunt:<br />

Prezentarea şi utilizare aplicaţia Visual Fox Pro<br />

Baze de date<br />

Crearea, consultarea şi actualizarea tabelelor<br />

Visual Fox Pro (VFP) este un limbaj specializat în prelucrarea<br />

datelor, grupate în baze de date, permiţând întregistrarea,<br />

păstrarea, regăsirea şi analiza cu uşurinţă a acestora. O bază de<br />

date reprezintă o colecţie de informaţii - de exemplu nume, adrese,<br />

produse, facturi – care pot fi gestionate cu ajutorul unor aplicaţii<br />

specifice, printre care şi Visual Fox Pro. Pentru o mai bună<br />

organizare a bazelor de date sau a celorlalte obiecte, acestea sunt<br />

grupate într-un proiect, care reprezintă de asemenea şi baza<br />

realizării formatului distribuibil (executabil).


Limbaje de programare şi baze de date 5<br />

UTILIZAREA APLICAŢIEI VISUAL FOX PRO<br />

1. Clic pe Start<br />

2. Activaţi opţiunea Programs<br />

3. Clic pe pictograma aplicaţiei Visual Fox Pro<br />

VFP dispune de o fereastră principală care cuprinde:<br />

Elementele ferestrei VFP<br />

Proiectele sunt formate din mai multe obiecte:<br />

Obiect Descriere<br />

bară de<br />

instrumente<br />

bară de meniu<br />

fereastră de comenzi<br />

Tabelele sunt formate din câmpuri (coloane) – care<br />

formează structura tabelei şi înregistrări (rânduri) –<br />

reprezentând conţinutul tabelei. În cadrul fiecărui câmp<br />

există mai multe valori.<br />

O bază de date trebuie să conţină cel puţin o tabelă.<br />

Interogări ale tabelelor sau bazelor de date, respectiv<br />

decuparea şi prezentarea datelor în funcţie de anumite<br />

condiţii.<br />

Formularele reprezintă ferestre personalizate care oferă un<br />

acces şi o vizualizare facilă a datelor dintr-o tabelă sau o<br />

interogare.<br />

Rapoartele prezintă datele dintr-o tabelă sau o interogare<br />

într-un format imprimabil.


6<br />

CREAREA UNUI PROIECT<br />

Suport pentru laborator<br />

Pentru realizarea unui proiect, se procedează astfel:<br />

1. Clic pe meniul File<br />

2. Se activează opţiunea New<br />

3. Se bifează opţiunea Project<br />

4. Clic pe butonul New File<br />

5. Se atribuie un nume proiectului şi se salvează în locaţia dorită.<br />

Crearea unui nou proiect<br />

VFP pune la dispoziţia utilizatorilor un coordonator al întregii<br />

activităţi denumit “Project Manager”, care dispune de o fereastră cu<br />

6 pagini ce grupează pe categorii elementele componente ale unui<br />

proiect şi o bară cu opţiuni dependentă de context.


Limbaje de programare şi baze de date 7<br />

Fereastra Project Manager – fără tabele sau baze de date<br />

În cazul în care fereastra Project Manager se închide,<br />

redeschiderea acesteia se realizează prin alegerea din meniul File a<br />

opţiunii Open şi apoi prin căutarea proiectului dorit în locaţia în care<br />

a fost salvat.<br />

CREAREA ŞI CONSULTAREA UNEI TABELE<br />

Crearea tabelelor se realizează în două etape:<br />

I. Crearea structurii tabelelor (creare câmpuri);<br />

II. Crearea conţinutului tabelei (încărcarea informţiilor).<br />

Pentru crearea structurii unei tabele se procedează astfel:<br />

1. Se deschide/crează un proiect.<br />

2. Din fereastra Project Manager se execută clic pe pagina Data.<br />

3. Se execută clic pe opţiunea Free Tables, apoi pe butonul New şi<br />

New Table.<br />

4. Se atribuie o denumire tabelei şi se allege locaţi în care va fi<br />

salvată. În urma acestei acţiuni rezultă o fereastră denumită<br />

Table Designer.<br />

În fereastra Table Designer există 3 pagini:


8<br />

• Fields<br />

(pagina de<br />

câmpuri);<br />

Pagina Fields cuprinde:<br />

• denumire câmp (name);<br />

• tip date (valori) aferente<br />

câmpului (type);<br />

• mărimea maximă a<br />

valorilor (width);<br />

Fereastra Table Designer<br />

• Indexes (pagina de<br />

indecşi);<br />

Suport pentru laborator<br />

• Table (tabele),<br />

cu informaţii<br />

despre tabelă.<br />

• opţiunea specifică tipului de<br />

date numeric (decimal);<br />

• indecşi (index);<br />

• indicatorul Null (dacă nu<br />

există momentan date).<br />

Datele sunt de mai multe tipuri: numeric (numeric, real, integer,<br />

currency, double); şiruri de caractere; logic; dată calendaristică;<br />

moment de timp; memo şi general.<br />

La acţionarea butonului OK utilizatorul este interogaţ dacă doreşte<br />

să introducă date în tabelă, iar la alegerea opţiunii YES se pot<br />

introduce informaţii.<br />

Fereastra de confirmare


Limbaje de programare şi baze de date 9<br />

La revenirea în Project Manager (PM) se observă la rubrica<br />

Free tables semnul + care arată faptul că au fost create tabele<br />

libere (neaparţinând unei bază de date).<br />

Feareastra Project Manager – cu o tabelă<br />

În partea din dreapta a ferestrei PM, în pagina Data se<br />

observă, există mai multe butoane pentru diverse opţiuni, astfel:<br />

• new – creare tabelă nouă;<br />

• add – adăugare tabelă<br />

creată anterior;<br />

• modify – modificare<br />

structură tabelă;<br />

• browse – vizualizare<br />

înregistrări tabelă;<br />

• remove –<br />

eliminare/ştergere tabelă<br />

din proiectul curent;<br />

• build.<br />

Consultarea conţinutului unei tabele se realizează astfel:<br />

1. În Project Manager, în pagina Data se selectează tabela<br />

dorită.<br />

2. Se execută clic pe butonul Browse.<br />

ACTUALIZAREA STRUCTURII UNEI TABELE<br />

Buton pentru<br />

acces la<br />

structura<br />

tabelei/bazei<br />

de date<br />

Buton<br />

pentru<br />

acces la<br />

conţinutul<br />

tabelei<br />

Actualizarea structurii unei tabele, similar cu actualizarea<br />

conţinutului, este marcată de trei operaţii: adăugare, modificare şi<br />

ştergere a înregistrărilor, toate implicând vizualizarea iniţială a<br />

structurii tabelei cu ajutorul butonului/comenzii Modify/Modify<br />

structure.


10<br />

Suport pentru laborator<br />

A. Adăugarea şi modificarea câmpurilor se realizează astfel:<br />

1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />

se alege denumirea tabelei care trebuie actualizată.<br />

2. Se execută clic pe butonul Modify.<br />

3. Se realizează direct acţiunea dorită.<br />

B. Ştergerea câmpurilor se realizează astfel:<br />

1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />

se alege denumirea tabelei care trebuie actualizată.<br />

2. Se execută clic pe butonul Modify.<br />

3. Se execută clic pe denumirea câmpului care se doreşte a fi şters<br />

şi apoi pe butonul Delete.<br />

ACTUALIZAREA CONŢINUTULUI UNEI TABELE<br />

Actualizarea conţinutului unei tabele este marcată de trei operaţii:<br />

adăugare, modificare şi ştergere a înregistrărilor, toate implicând<br />

vizualizarea iniţială a conţinutului tabelei cu ajutorul<br />

butonului/comenzii Browse.<br />

A. Adăugarea înregistrărilor se realizează astfel:<br />

Pentru a adăuga o singură înregistrare:<br />

1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />

se alege tabele care trebuie actualizată.<br />

2. Se execută clic pe butonul Browse.<br />

3. Din meniul Table se activează opţiunea Append New Record şi<br />

se adaugă o înregistrare.<br />

Pentru a adăuga mai multe înregistrări:<br />

1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />

se alege tabele care trebuie actualizată.<br />

2. Se execută clic pe butonul Browse.<br />

3. Din meniul View se activează opţiunea Append Mode şi se<br />

adugă, rând pe rând mai multe înregistrări.<br />

B. Modificarea înregistrărilor se realizează după cum urmează:<br />

Pentru a modifica independent înregistrările:


Limbaje de programare şi baze de date 11<br />

1. Din fereastra Project Manager se execută clic pe pagina Data şi<br />

apoi pe butonul Browse efectuându-se apoi modificasrea pentru<br />

înregistrarea dorită.<br />

Pentru a modifica înregistrările în funcţie de anumite criterii<br />

1. Din fereastra Project Manager se execută clic pe pagina Data<br />

şi apoi pe butonul Browse.<br />

2. Din meniul Table se activează opţiunea Replace Field.<br />

3. Rezultă o fereastră în care la opţiunea Field... With... (se alege<br />

câmpul în care va fi modificată cu informaţia) completând<br />

Replacement Criteria (domeniul înregistrărilor = totalitatea<br />

înregistrărilor afectate de execuţia unei comenzi).<br />

Vizualizarea conţinutului tabelei şi modificarea înregistrărilor<br />

Stabilirea domeniului înregistrărilor se face :<br />

b. static (independent de informaţiile conţinute în înregistrări),<br />

utilizând clauzele:<br />

• All – se referă la toate înregistrările;<br />

• Next – de exemplu următoarele 4 înregistrări începând<br />

cu înregistrarea curentă;<br />

• Rest – se referă la înregistrarea curenta şi la toate<br />

celelalte înregistrări până la sfârşitul tabelei;<br />

• Record – înregistrarea a patra, de exemplu.<br />

c. dinamic (în funcţie de informaţiile conţinute în înregistrări)<br />

utilizând:


12<br />

Suport pentru laborator<br />

• for se referă la toate înregistrările din tabelă<br />

pentru care condiţia este adevarată;<br />

• while se referă la înregistrările cuprinse între<br />

înregistrarea curentă şi prima înregistrare pentru care<br />

condiţia este falsă.<br />

C. Ştergerea înregistrărilor se realizează în două moduri<br />

a) Ştergere logică, acest tip de ştergere permiţând recuperarea<br />

înregistrărilor.<br />

1. Se vizulizează conţinutul tabelei.<br />

2. Se acţionează cu mouse-ul spaţiul de ştergere aflat în stânga<br />

înregistrării care se doreşte a fi ştearsă logic, moment în care<br />

înregistrarea va fi marcată. Înregistrarea poate fi recuperată<br />

executând un clic pe celaşi spaţiu.<br />

Ştergerea logică a înregistrărilor<br />

Pentru ştergerea unor înregistrări care îndeplinesc o anumită<br />

condiţie se utilizează din meniul Table opţiunea Delete Records. În<br />

fereastra rezultată se stabileşte domeniul înregistrărilor.<br />

b) Ştergere fizică, acest tip de ştergere nepermiţând recuperarea<br />

înregistrărilor.<br />

1. Se vizualizează conţinutul tabelei.<br />

2. Se şterg logic înregistrările dorite.<br />

3. Din meniul Table se alege opţiunea Remove Deleted Records<br />

apoi se execută clic pe butonul Yes.


Limbaje de programare şi baze de date 13<br />

APLICAŢIA 1<br />

Confirmarea ştergerii fizice a unei înregistrări<br />

Creaţi o tabelă următoarea structură:<br />

Intrebări:<br />

Care sunt componentele unei tabele?<br />

Cum se construieşte o tabelă în Visual Fox Pro?<br />

Ce înseamnă actualizarea conţinutului unei<br />

tabele? Cum se actualizează conţinutul unei<br />

tabele?<br />

Prezentatţi modul de vizualizare a conţinututlui<br />

unei tabele.<br />

Prezentaţi modul de actualizare a structurii unei<br />

tabele.<br />

Studiu individual<br />

Aplicaţia 1: Creare şi actualizare tabelă.<br />

Nume C 30<br />

Prenume C 30<br />

Cod N 3<br />

Oras C 20<br />

Medie N 6 ; 2<br />

Admis L


14<br />

şi cu următorul conţinut :<br />

Nume Prenume Cod Oras Medie Admis<br />

Ionescu Maria 1 Iasi 9.27<br />

Vlad Mirela 8 Deva 9.50<br />

Georgecu Ana 5 Cluj 8.85<br />

Popescu Denisa 4 Arad 9.33<br />

Rauta Andreea 6 Deva 9.50<br />

Stanciu Roxana 2 Deva 9.10<br />

Radulescu Ruxandra 3 Cluj 9.29<br />

Matei Iuliana 7 Ploiesti 9.60<br />

a) Să se adauge un nou câmp, denumit Admis.<br />

Suport pentru laborator<br />

b) Se presupune că doar candidatele cu medii peste 9.25 au fost<br />

admise. Să se completeze valorile corespunzătoare pentru<br />

câmpul Admis.<br />

c) Candidatele din Deva sunt de fapt din Bucureşti. Să se modifice<br />

valorile corespunzătoare din câmpul oraş, stabilind domeniul<br />

înregistrărilor cu for.<br />

d) Să se adauge înregistrarea:<br />

Cretulescu Alexandra 9 Orastie 8.00 F<br />

e) Să se şteargă logic înregistrările aferente candidatelor care au<br />

obţinut medie mai mică decât 9.10, utilizând opţiunea Delete<br />

Record şi stabilind domeniul înregistrărilor cu for.<br />

f) Să se şteargă fizic înregistrările şterse logic la punctul anterior.


Limbaje de programare şi baze de date 15<br />

Baze de date. Sortare. Indexare<br />

Principalele obiective ale capitolului sunt:<br />

Crearea unei baze de date<br />

Înţelegerea conceptelor de sortare şi indexare<br />

Înţelegerea noţiunii de index. Tipuri de indecşi<br />

Validare la nivel de câmp şi înregistrare<br />

CREAREA UNEI BAZE DE DATE<br />

O bază de date este formată din una sau mai multe tabele cu<br />

legături între ele şi eventual secvenţe de cod. Pentru crearea unei<br />

baze de date se parcurge următoarea succesiune de paşi:<br />

1. Se crează un nou proiect, rezultând pagina Project Manager.<br />

2. Din pagina Data se selectează opţiunea Databases, se execută<br />

clic pe butonul New şi se crează o baza de date, rezultând o<br />

fereastră denumită Database Designer.<br />

3. În fereastra Project Manager se execută click pe semnul ‘+’<br />

apărut în faţa denumirii bazei de date. Se selectează opţiunea<br />

Tables şi se execută clic pe butonul New.


16<br />

Fereastra Database Designer<br />

Suport pentru laborator<br />

Fereastra Project Manager cu o<br />

tabelă şi o bază de date<br />

SORTAREA ŞI INDEXAREA UNEI TABELE<br />

Sortarea reprezintă ordonarea fizică a înregistrărilor unei tabele. În<br />

urma sortării rezultă o noua tabelă în care înregistrările sunt<br />

aranjate într-o anumita ordine.<br />

Ordonarea fizică a înregistrărilor tabelei se realizează utilizând<br />

instrucţiunea:<br />

sort on to <br />

Aceasta va fi aşadar scrisă în fereastra de comenzi, urmată de<br />

apăsarea butonului Enter de la tastatură.<br />

Pentru a vizualiza conţinutul noii tabele, mai întâi aceasta se<br />

deschide, utilizând comanda use . Se<br />

execută comanda browse.<br />

Indexarea reprezintă ordonarea logică a înregistrărilor unei tabele.<br />

În urma indexării înregistrările tabelei sunt vizualizate într-o<br />

anumită ordine, dată de index.<br />

Se pot stabili mai mulţi indecşi dar numai unul este activ la un<br />

moment dat.<br />

Indexul poate fi :<br />

• Regular (normal)<br />

• Unique (unic), adică într-un câmp pot fi introduse valori egale,<br />

dar prin alegerea acestui tip de index doar prima în ordinea<br />

apariţiei va fi accesibilă


Limbaje de programare şi baze de date 17<br />

• Primary (primar), adică cel care asigură identificarea unică a<br />

înregistrărilor unei tabele. Acest tip de index poate fi stabilit<br />

doar dacă tabela face parte dintr-o bază de date. Pentru o<br />

tabelă se poate stabili un singur index primar. Indexul primar<br />

obligă ca toate valorile din câmpul ales să fie distincte.<br />

• Candidate (candidat), utilizat în cazul în care într-o tabela este<br />

nevoie de mai multe câmpuri cu valori distincte. Deoarece se<br />

poate stabili doar un singur index primar, pentru celelalte<br />

câmpuri în care sunt necesare valori distincte, se aleg indecşi<br />

de tip candidat.<br />

MODUL DE STABILIRE A INDECŞILOR<br />

a) Din fereastra Project Manager se selectează denumirea tabelei<br />

care face parte din baza de date.<br />

b) Se execută un clic pe butonul Modify.<br />

c) În fereastra care rezultă, denumită Table designer, în pagina<br />

Fields se execută un clic pe câmpul care va fi stabilit ca index.<br />

d) Din opţiunea Index se alege Ascending (crescător) sau<br />

Descending (descrescător), adcă valorile din câmpul respectiv vor fi<br />

ordonate crescător/descrescător.<br />

Fereastra Table Designer – opţiunile Ascending/Descending<br />

g) Din fereastra Table designer , pagina Indexes , optiunea Type<br />

se alege tipul de index dorit.


18<br />

Fereastra Table Designer – tipuri de indecşi<br />

MODUL DE ACTIVARE A INDECŞILOR<br />

Suport pentru laborator<br />

a) Se vizualizeaza conţinutul tabelei.<br />

b) Din meniul Table se selectează optiunea Properties. Din pagina<br />

Index order se alege denumirea câmpului care se doreşte a fi<br />

activat.<br />

c) Se execută clic pe butonul OK.<br />

Fereastra de activare unui index


Limbaje de programare şi baze de date 19<br />

Alte opţiuni aferente unei tabele dintr-o bază de date<br />

1. Se selecteaza denumirea tabelei din fereastra Project Manager,<br />

se executa Modify.<br />

2. În pafina Fields , în josul paginii există anumite opţiuni care vor fi<br />

utlizate după cum urmează:<br />

• Format: stabileşte un format de editare pentru valorile unui<br />

câmp, de exemplu formatul “a” permite introducerea numai a<br />

literelor şi a cifrelor.<br />

Cum se procedează ?<br />

Se executa clic pe câmpul dorit şi în opţiunea Format se scrie litera<br />

a.<br />

• Input mask : permite stabilirea unei “măşti de intrare”, de<br />

exemplu, stabilirea faptului că prima litera va fi majusculă<br />

Cum se procedeaza ?<br />

Se executa clic pe campul dorit şi în opţiunea Input mask se<br />

scrie : !aaaaaaaaaa.<br />

• Caption : permite stabilirea unei denumiri mai lungi pentru<br />

câmpuri<br />

Cum se procedează ?<br />

Se execută clic pe câmpul căruia se doreşte a se modifica<br />

denumirea şi în opţiunea Caption se scrie denumirea dorită, având<br />

un număr mai mare de caractere decât cel permis în mod uzual.<br />

• Field Validation : permite validarea la nivel de câmp, adică<br />

interzice ieşirea din acel câmp dacă informaţia introdusă nu a<br />

corespuns unei cerinţe.


20<br />

Suport pentru laborator<br />

Cum se procedează ?<br />

Se executa clic pe câmpul ales şi în opţiunea Rule se scrie condiţia,<br />

în opţiune Message existând posibilitatea scrierii unui measaj.<br />

Observaţie : mesajul va fi afişat când condiţia de validare la nivelul<br />

câmpului nu este respectată.<br />

În pagina Table există următoarele opţiuni :<br />

• Record Validation : se poate realiza validarea la nivel de<br />

înregistrare<br />

Cum se procedează ?<br />

În opţiunea Rule se scrie condiţia, în opţiune Message se va scrie<br />

un mesaj corespunzător, aferent încălcării condiţiei.<br />

Obs : mesajul va fi afişat când condiţia de validare la nivelul<br />

înregistrărilor nu este respectată.<br />

• Insert trigger : limitează introducerea de noi înregistrări<br />

Cum se procedează ?<br />

În opţiunea Insert trigger se scrie condiţia utilizând, de exemplu,<br />

RECNO()< sau > o valoare.<br />

• Update trigger : restricţionează modificarea denumirii oricărui<br />

câmp din tabelă.


Limbaje de programare şi baze de date 21<br />

Cum se procedează ?<br />

În opţiunea Update trigger se scrie .F.<br />

• Delete trigger : interzice ştergerea oricărei înregistrări din<br />

tabelă, de exemplu se interzice ştergerea unei înregistrări.<br />

Cum se procedează ?<br />

În opţiunea Delete trigger se scrie RECNO()#<br />

• Table comment: permite adăugarea unui comentariu referitor<br />

la înregistrările, structura sau utilitatea tabelei.<br />

Tot în cadrul acestei pagini se regăsesc şi informaţii despre locaţia<br />

pe hard disk unde se află tabela, precum şi numărul de înregistrări şi<br />

de câmpuri.<br />

Observaţie:<br />

• pentru a vizualiza data în ordine azi/luna/an, în fereastra de<br />

comenzi se execută comanda set date to dmy<br />

• pentru a vizualiza anul de forma ‘1998’ in loc de ‘98’ se execută<br />

comanda set century on<br />

Intrebări:<br />

Care este diferenţa dintre o tabelă şi o bază de<br />

date?<br />

Ce înseamnă sortarea? Dar indexarea?<br />

Care sunt diferenţele dintre cele două<br />

concepte?<br />

Ce semnifică noţiunile de validare la nivel de<br />

câmp şi validare la nivel de înregistrare?<br />

Studiu individual<br />

APLICAŢIA 2: Creare bază de date, creare<br />

tabelă, stabilire şi activare indecşi, utilizarea<br />

opţiunilor suplimentare privind tabelele (validare<br />

la nivel de câmp şi la nivel de înregistrare).


22<br />

APLICAŢIA 2<br />

Suport pentru laborator<br />

Să se creeze baza de date denumită STUDENT în care se<br />

află o tabelă cu următoarea structură:<br />

şi cu următorul conţinut :<br />

Marca N 4<br />

Nume C 30<br />

Prenume C 30<br />

Oras C 20<br />

Data_ang D 8<br />

Salariu N 10<br />

Marca Nume Prenume Oras Data_ang Salariu<br />

1 Ionescu Maria Iasi 11.01.00 500<br />

13 Vlad Mirela Deva 04.04.99 600<br />

134 Radu Andrei Cluj 12.07.03 350<br />

140 Stan Denisa Arad 03.11.01 380<br />

7 Rauta Andreea Deva 07.30.00 650<br />

18 Stanciu Alex Brasov 08.15.98 400<br />

39 Radulescu Ruxandra Cluj 09.16.00 260<br />

57 Matei Iuliana Ploiesti 10.10.02 390<br />

241 Cretulescu Alexandra Orastie 02.11.03 100<br />

114 Filip Carmen Oradea 03.01.02 850<br />

1. Să se sorteze tabela. Să se vizualizeze conţinutul tebelei<br />

rezultate.<br />

2. Să se stabilească următorii indecşi: marca – index de tip primar<br />

şi oraş – index de tip normal.<br />

3. Să se activeze pe rând indecşii stabiliţi la puncul anterior.<br />

4. Să se stabilească pentru câmpul oraş formatul a.<br />

5. să se stabilească faptul că pentru câmpul oraş prima literă va fi<br />

majusculă.<br />

6. Să se stabilească pentru câmpul oraş o denimre mai lungă,<br />

respectiv: Locul nasterii angajatului<br />

7. Regula de validare la nivelul câmpului marca nu permite valori<br />

mai mici decât 250. Să se stabilească acestă regulă şi, în cazul<br />

în care aceasta este încălcată să se afişeze mesajul: Marca<br />

trebuie sa fie mai mica decat 250.<br />

8. Introduceţi o nouă înregistrare în care valoarea din câmpul<br />

marca să încalce regula. Ce se întâmplă?


Limbaje de programare şi baze de date 23<br />

9. Regula de validare la nivelul înregistrărilor stabileşte ca salariul<br />

să nu fie mai mic decât 300. Să se stabilească acestă regulă şi,<br />

în cazul în care aceasta este încălcată să se afişeze mesajul:<br />

Salariul trebuie sa fie mai mare decat 300.<br />

10. Introduceţi o nouă înregistrare în care valoarea din câmpul<br />

salariu să încalce regula. Ce se întâmplă?<br />

11. Limitaţi introducerea de noi înregistrări la 14 şi apoi introduceţi o<br />

nouă înregistrare. Ce se întâmplă?<br />

12. Restricţionaţi modificarea denumirii oricărui câmp din tabelă.<br />

Verificaţi.<br />

13. Interziceţi ştergerea primei înregistrări. Verificaţi.<br />

14. Adăugaţi următorul comentariu referitor la tabelă: Aceasta tabela<br />

este utilizata pentru evidenta salaratilor firmei ALFA SRL, de la<br />

infiintare pana in prezent.


24<br />

Suport pentru laborator<br />

BAZE DE DATE. LEGĂTURI ÎNTRE TABELE<br />

Principalele obiective ale capitolului sunt:<br />

Prezentarea tipurilor de legături între tabelele<br />

aparţinând unei baze de date<br />

Între doua sau mai multe tabele aparţinând unei baze de date se<br />

pot stabili două tipuri de legături (relaţii):<br />

1. legături temporare : valabile în cadrul sesiunii de lucru curente<br />

2. legături permanente : valabile ori de câte ori se deschide baza<br />

de date, se construiesc o singură dată şi fac parte integrantă din<br />

baza de date<br />

La stabilirea unei relaţii între două tabele una dintre tabele are rol<br />

conducător, fiind denumită tabela-părinte şi cealaltă tabelă este<br />

condusă, fiind denumită tabela-fiu.<br />

Legăturile se stabilesc pe baza unui câmp comun celor două tabele,<br />

pentru valori egale aflate în acele câmpuri. Pentru tabela-părinte<br />

acest câmp se numeşte cheie primară, iar pentru tabela-fiu câmpul<br />

se numeşte cheie externă.


Limbaje de programare şi baze de date 25<br />

De asemenea se impune o precizare: cheia primară reprezintă un<br />

câmp ale cărui valori au rol unic de identificare a fiecărei<br />

înregistrări. De exemplu, CNP este cheie primară într-o tabelă cu<br />

informaţii despre populaţia unui oraş, deoarece fiecare cetăţean are<br />

un singur CNP, deci fiecere înregistrare va fi unică, nu pot exista<br />

două înregistrări cu aceeaşi valoare CNP.<br />

Stabilirea legăturilor temporare şi a legăturilor permanente<br />

presupune realizarea simultană a trei condiţii:<br />

a) existenţa unei baze de date cu cel puţin două tabele ;<br />

b) în tabela-părinte câmpul comun este index primar<br />

c) în tabela-fiu câmpul comun este stabilit ca fiind index – de<br />

obicei normal.<br />

LEGĂTURI TEMPORARE<br />

1. Se crează un nou proiect sau se deschide un proiect existent,<br />

conţinând o bază de date.<br />

2. Se verifică existenţa indecşilor sau se stabilesc indecşii în cazul<br />

în care nu sunt stabiliţi.<br />

3. Din meniul Window se alege opţiunea Data Session. Se<br />

execută clic pe butonul Open, pentru a deschide tabelele.<br />

4. Din fereastra obţinută astfel, denumită Open, se execută clic pe<br />

tabela care se doreşte a fi deschisă, bifând de semenea<br />

opţiunea Exclusive, apoi se execută clic pe butonul OK.<br />

Fereastra Data Session<br />

5. Se procedează similar pentru toate tabelele pentru care se<br />

doreşte stabilirea unor legături temporare.


26<br />

Suport pentru laborator<br />

6. Se execută clic pe denumirea tabelei-părinte. Se execută clic pe<br />

butonul Relations.<br />

7. În fereastra rezultantă, denumită denumită Set Index Order se<br />

execută OK, apoi în fereastra Expression Builder, în dreptul<br />

opţiunii SET RELATION se scrie denumirea câmpului comun, în<br />

cazul în care această denumire nu există deja.<br />

8. Se execută clic pe butonul OK. În acest moment între cele două<br />

tabele a fost realizată o legătură temporară de tip one-to-one.<br />

Fereastra Expression Builder<br />

9. În cazul în care se doreşte realizarea unei legături de tip one-tomany,<br />

se execută clic pe butonul 1 to many. Din fereastra<br />

rezultată, denumită Create One-To-Many Relationship se<br />

alege denumirea tabelei/tabelelor cu care se doreşte a se<br />

realiza legătura, se execută clic pe butonul Move şi apoi pe<br />

butonul OK.


Limbaje de programare şi baze de date 27<br />

Fereastra pentru crearea legăturilor de tip one-to-many<br />

10. Se vizualizează în paralel conţinutul tabelelor şi se execută un<br />

clic pe căte o înregistrare din tabela-părinte, în tabela-fiu fiind<br />

afişate doar înregistrările care conţin în index valoarea<br />

înregistrării curente din tabela-părinte.<br />

Corespondenţa în modul Browse a valorilor comune ale unui index<br />

Se constată că principalul avantaj al legăturii temporare este acela<br />

că în momentul în care în tabela-părinte cursorul este mutat pe o<br />

înregistrare, în tabela-fiu sunt afişate doar înregistrările care conţin<br />

valoarea din câmpul comun aferent înregistrării din tabela-părinte.<br />

LEGĂTURI PERMANENTE<br />

1. Se deschide fereastra Database Designer, executând un clic în<br />

fereastra Project Manager pe denumirea bazei de date şi apoi<br />

pe butonul Modify. În acest moment structura şi indexul fiecărei<br />

tabele pot fi vizualizate.


28<br />

Suport pentru laborator<br />

2. Se execută un clic pe denumirea indexului primar corespunzător<br />

din tabela-părinte şi, prin metoda drag-and-drop se plasează<br />

cursorul pe denumirea corespunzătoare a indexului din tabelafiu,<br />

eliberând cursorul. Se constată realizarea unei legături<br />

permamante.<br />

Realizarea unei legături permanente<br />

Stabilirea unei legături permanente permite stabilirea integrităţii<br />

referenţiale. O restricţie de integritate referenţială se referă la faptul<br />

că în tabela-fiu nu pot exista înregistrări în care în cheia externă să<br />

fie înregistrate valori care nu se află în mulţimea valorilor cheii<br />

primare din tabela-părinte.<br />

De exemplu, dacă se dau două tabele FACTURI [numar_factura,<br />

data_factura, cod_client] şi CLIENŢI [cod_client, nume_client,<br />

localitate], nu poate exista o înregistrare (numar_factura: 12,<br />

data_factura: 12/06/2005, cod_client: 111) dacă în tabela CLIENŢI<br />

nu există un client cu cod 111, altfel spus, nu poate exista o factură<br />

emisă de un client care nu există.<br />

Integritatea referenţială se stabileşte astfel.<br />

1. Se execută un clic dreapta pe legătura creată şi se alege<br />

opţiunea Edit Referential Integrity.<br />

2. În fereastra rezultată, se pot stabili trei tipuri de reguli referitoare<br />

la înregistrările din ambele tabele:<br />

• Rules for Updating – reguli pentru actualizare;<br />

• Rules for Deleting – reguli pentru ştergere;<br />

• Rules for Inserting – reguli pentru inserare.


Limbaje de programare şi baze de date 29<br />

Fereastra Referential Integrity Builder<br />

Pentru primele două opţiuni, există trei posibilităţi: cascade,<br />

restrict şi ignore.<br />

Cascade se referă la faptul că atunci când o înregistrare<br />

conţinând o valoare ale indexului primar din tabela-părinte este<br />

modificată/ştearsă, se realizează actualizarea/ştergerea automată a<br />

înregistrărilor din tabela-fiu care conţin acea valoare.<br />

Restrict se referă la faptul că nu este permisă<br />

modificarea/ştergerea unei înregistrări, şi implicit a unei valor a<br />

indexului primar, atunci când în tabela-fiu se regăsesc înregistrări<br />

care conţin acea valoarea.<br />

Ignore se referă la posibilitatea actualizării/ştergerii<br />

independente a înregistrărilor din cele două tabele în momentul<br />

modificării/ştergerii unei valori a indexului primar.<br />

Pentru opţiunea Rulea for Inserting există dor două posibilităţi:<br />

restrict şi ignore, referindu-se la faptul că nu este permisă/este<br />

permisă adăugarea unei noi înregistrări în tabela-fiu dacă valoarea<br />

înregistrată în index nu există în mulţimea valorilor indexului primar<br />

corespunzător tabelei-părinte.<br />

Studiu individual<br />

Aplicaţia 3: Creare legături temporare şi<br />

permamante între tabele aprţinând unei baze de<br />

date.


30<br />

APLICAŢIA 3<br />

Suport pentru laborator<br />

Să se realizeze un nou proiect. Să se realizeze o bază de<br />

date. Să se creeze următoarele tabele, aparţinând bazei de date:<br />

Structură<br />

Cod_client C 4<br />

Nume C 20<br />

Oras C 10<br />

Index primar, ascendent :<br />

cod_client<br />

Structură<br />

Nr_fact N 10<br />

Cod_client C 4<br />

Data D 8<br />

Index primar, ascendent :<br />

nr_fact<br />

Index normal, ascendent:<br />

cod_client<br />

Structură<br />

Cod_produs N 10<br />

Den_produs C 30<br />

PU N 10<br />

Cant N 10<br />

Nr_fact N 10<br />

Index primar,<br />

ascendent :<br />

cod_produs<br />

Index normal,<br />

ascendent: nr_fact<br />

Conţinut<br />

Conţinut<br />

Cod_client Nume Oras<br />

AMP Amep Brasov<br />

COR CorrImpex Galati<br />

DAV Daval Brasov<br />

ERG Energo Bucuresti<br />

HTR Hatrom Brasov<br />

Conţinut<br />

Nr_fact Cod_client Data<br />

23 AMP 05/11/05<br />

116 HTR 04/12/05<br />

315 COR 06/04/05<br />

117 DAV 12/03/04<br />

18 ERG 12/05/04<br />

56 ERG 11/07/05<br />

12 AMP 02/10/04<br />

Cod_<br />

produs<br />

Den_produs PU Cant Nr_fact<br />

1 Apa<br />

minerala<br />

2 500 56<br />

2 Biscuiti 1 55 116<br />

3 Cereale 4 15 315<br />

4 Portocale 5 10 116<br />

5 Servetele 1 150 117<br />

6 Ciocolata 3 40 116<br />

7 Compot 2 14 18<br />

8 Iaurt 3 12 23<br />

9 Paine 1 100 12


Limbaje de programare şi baze de date 31<br />

3. Să se stabilească legături temporare între cele trei tabele.<br />

4. Să se stabilească legături permamante între cele trei tabele.<br />

5. Să se stabilească următoarele restricţii de integritate<br />

referenţială: cascade pentru ştergere şi restrict pentru inserarea<br />

unei noi înregistrări.<br />

6. Să se verifice integritatea referenţială prin ştergerea unei<br />

înregistrări existente şi prin adăugarea unei noi înregistrări.


32<br />

Suport pentru laborator<br />

INSERAREA, MODIFICAREA ŞI ŞTERGEREA<br />

LINIILOR<br />

Principalele obiective ale capitolului sunt:<br />

ADĂUGAREA UNEI LINII<br />

Adăugarea unei linii într-o tabelă<br />

Editarea unor date dintr-o tabelă<br />

Ştergerea unor date dintr-o tabelă<br />

Comanda SQL de adăugare de noi linii este INSERT, care<br />

are, în modul de lucru cel mai puţin pretenţios următorul format:<br />

INSERT INTO TABELĂ [(ATRIBUT1, ATRIBUT2,... .)] VALUES<br />

(VALOARE_ATRIBUT1, VALOARE_ATRIBUT2,... .)<br />

În cazul tabelei ANGAJATI se poate introduce o nouă line<br />

astfel:<br />

Se dă tabela Angajaţi cu urmatoarele date:


Limbaje de programare şi baze de date 33<br />

INSERT INTO ANGAJATI VALUES (11, 'RADU', 'Info', 250)<br />

iar tabela va arăta astfel:<br />

STERGEREA LINIILOR<br />

Comanda SQL pentru ştergerea uneia sau mai multor linii<br />

dintr-o tabelă este DELETE<br />

DELETE FROM TABELA WHERE CONDITIE<br />

Dacă dorim să ştergem ultima înregistrare introdusă vom<br />

avea:<br />

DELETE FROM ANGAJATI WHERE NUME='RADU'


34<br />

Suport pentru laborator<br />

În cazul Visual FOXPRO este nevoie de comanda PACK ca<br />

ştergerea să fie efectivă, astfel:<br />

PACK<br />

Iar tabela va arăta astfel:<br />

MODIFICAREA VALORILOR UNOR ATRIBUTE<br />

Pentru a modifica valoarea unuia sau mai multor atribute sau<br />

mai multe linii dintr-o tabelă se foloseşte comanda UPDATE cu<br />

formatul general:<br />

UPDATE TABELA SET ATRIBUT1=EXPRESIE [,<br />

ATRIBUT2=EXPRESIE2.... .] WHERE PREDICAT


Limbaje de programare şi baze de date 35<br />

Modificarea se va produce pe toate liniile tabelei care<br />

îndeplinesc condiţia formulată prin predicat.<br />

În cazul tabelei ANGAJATI dacă dorim schimbarea salariului<br />

în 1000 pentru angajata GABRIELA vom avea:<br />

UPDATE ANGAJATI SET SAL_BRUT=1000 WHERE<br />

NUME='Gabriela'<br />

APLICAŢIA 4<br />

Studiu individual<br />

Aplicaţia 4: Introducere, ştergere şi modificarea<br />

unor date dintr-o tabelă<br />

1. Creaţi tabela FACTURI (ca în ANEXA 1)<br />

2. În tabela FACTURI (ANEXA 1) adăugaţi următoarele date:


36<br />

Suport pentru laborator<br />

3. În tabela FACTURI modificaţi VALOAREA la 75000 pentru toate<br />

facturile care au valoare mai mare de 10.000.<br />

4. Ştergeţi toate facturile pentru care cod_furn este c1.<br />

5. Modificati cod_furn în n99 pentru facturile a căror valoare este de<br />

cel puţin 8000.<br />

6. Ştergeti toate înregistrările pentru care nr_factură este mai mic de<br />

4000.<br />

7. Stergeti toate datele din tabela FACTURI.<br />

8. Introduceţi cinci facturi noi utilizând INSERT şi cinci facturi<br />

utilizând BROWSE.


Limbaje de programare şi baze de date 37<br />

NUCLEUL SQL ÎN VISUAL FOX PRO<br />

Principalele obiective ale capitolului sunt:<br />

Introducere în conceptul de interogare<br />

a bazelor de date<br />

Sintaxa şi utilizarea comenzii SELECT<br />

CONCEPTUL DE INTEROGARE ŞI COMANDA SELECT<br />

Extragerea informaţiilor din una sau mai multe tabele libere<br />

sau aparţinând unei baze de date, pe baza unor criterii definite de<br />

utilizator poartă denumirea de interogare.<br />

Visual Fox Pro include un set de comenzi ale limbajului SQL<br />

(Structured Query Language) care permite interogarea tabelelor şi<br />

furnizarea rezultatelor sub forma unor interogări, care pot fi<br />

depozitate la o destinaţie precizată. Prin intermediul unei interigări<br />

se construieşte o instrucţiune SELECT a acestui limbaj, care<br />

cuprinde întregul mecanism de interogare al VFP.<br />

Rezultatele interogărilor se pot obţine cu ajutorul unui<br />

generator denumit Query Designer, cu posibilitate de utilizare pe<br />

baza rubricii Queries din fereastra Project Manager, existând<br />

posibilitatea de a utiliza de asemenea şi ajutorul oferit de VFP prin<br />

intermediul Query Wizard.


38<br />

Suport pentru laborator<br />

O altă posibilitate de obţinere a rezultatelor interogărilor este<br />

utilizarea comenzii Select, reprezentată de o sintaxă specifică,<br />

comandă care va fi executată în fereastra de comenzi.<br />

Exemplificarea utilizării comenzii Select se va realiza utilizând o<br />

bază de date cu informaţii necesare organizării sesiunii studenţeşti.<br />

PRINCIPALELE CLAUZE ALE FRAZEI SELECT<br />

Orice frază de tip SELECT are trei clauze principale:<br />

SELECT<br />

FROM<br />

WHERE<br />

Dintre aceste trei clauze doar SELECT şi FROM sunt<br />

obligatorii în orice frază.<br />

SELECŢIA ŞI PROIECŢIA<br />

Clauza SELECT corespunde operatorului proiecţie din algebra<br />

relaţională, fiind utilizată pentru desemnarea listei de atribute<br />

(coloane) din rezultat. Clauza FROM este cea în care sunt<br />

enumerate relaţiile din care vor fi extrase informaţiile aferente<br />

consultării. Clauza WHERE desemnează predicatul selectiv al<br />

algebrei relaţionale (condiţia), relativ la atribute ale relaţiilor care<br />

apar în clauza FROM.<br />

La modul general, o consultare SQL poate fi prezentată sub<br />

forma:<br />

select c1,c2,...,cn<br />

from r1,r2,...,rm<br />

where p<br />

unde:<br />

cj - reprezintă coloanele rezultat;<br />

rj - reprezintă relaţiile ce trebuie parcurse;<br />

p - reprezintă predicatul, condiţia ce trebuie îndeplinită de<br />

tupluri (linii) pentru a fi incluse în rezultat.<br />

Predicatul poate fi simplu sau compus (din mai multe condiţii).<br />

Când clauza WHERE este omisă se consideră implicit că<br />

predicatul p are valoare logică ''adevărat'', astfel încât în rezultat vor


Limbaje de programare şi baze de date 39<br />

fi incluse toate liniile din tabelă sau produsul cartezian al tabelelor,<br />

enumerate în clauza FROM.<br />

Dacă în locul coloanelor c1,c2,...,cn apare simbolul *,<br />

rezultatul va fi alcătuit din toate coloanele relaţiilor specificate în<br />

clauza FROM.<br />

Atributele rezultatului preiau numele din tabela (tabelele)<br />

specificate în clauza FROM. Schimbarea numelui se realizează prin<br />

caluza AS.<br />

exemplu:<br />

select c1,c2 as NUME_NOU from r1<br />

unde numele coloanei c2 devine NUME_NOU;<br />

SQL nu elimină automat liniile identice din rezultat, deci pentru<br />

ca fiecare linie să apară o singură dată este necesara utilizarea<br />

opţiunii DISTINCT.<br />

exemplu:<br />

select distinct c1,c2 from r1<br />

În concluzie, o frază SELECT, corespunde:<br />

• unei selecţii algebrice (clauza WHERE p)<br />

• unei proiecţii (SELECT ci)<br />

• unui produs cartezian (FROM - r1 ⊗ r2 ⊗ ... ⊗ rm)<br />

şi conduce la obţinerea unui rezultat cu n coloane, fiecare coloană<br />

fiind: un atribut din r1,r2,...,rm sau expresie calculată pe baza unor<br />

atribute din r1,r2,...,rm.<br />

Execuţia unei fraze SELECT realizează un rezultat sub formă<br />

tabelară.<br />

Rezultatul poate fi:<br />

1. o listă (text)<br />

2. o tabelă propriu-zisă<br />

3. o tabelă temporară<br />

4. o tabelă derivată (imagine)<br />

5. o variabilă masiv (tablou)<br />

Exemplu:<br />

Utilizăm tabela ANGAJATI în care introducem următoarele<br />

date:


40<br />

Datele tabelei angajati.dbf<br />

1. Care sunt datele conţinute în tabela angajati?<br />

Suport pentru laborator<br />

select nr, nume, prenume, data_nasterii, sal_brut, cod_dep from<br />

angajati<br />

sau:<br />

select * from angajati<br />

Rezultatele exemplului 1.1<br />

2. Care sunt numele salariaţilor şi salariul brut?<br />

select nume, sal_brut from angajati


Limbaje de programare şi baze de date 41<br />

Rezultatele exemplului 1.2<br />

3. Care sunt numele salariaţilor şi salariul brut, dar pentru coloana<br />

sal_brut denumim coloana salariu_brut?<br />

select nume, sal_brut as salariu_brut from angajati<br />

Rezultatele exemplului 1.3<br />

4. Afişaţi numele angajatilor şi salariul brut, pentru salariaţii care au<br />

salariul brut mai mare de 700 lei<br />

select nume from angajati where sal_brut>700<br />

Rezultatele exemplului 1.4<br />

5. Care sunt datele salariaţilor care lucrează în departamentul<br />

informatic (cod_dep="info")?<br />

select * from angajati WHERE cod_dep="info"<br />

Rezultatele exemplului 1.5


42<br />

Suport pentru laborator<br />

6. Care sunt datele salariaţilor care lucrează în departamentul<br />

informatic (cod_dep="info") şi care au salariul brut mai mare de 700<br />

de lei?<br />

select * from angajati where cod_dep="info" and sal_brut>700<br />

Rezultatele exemplului 1.6<br />

7. Afişaţi numele salariaţilor şi codul departamentului pentru<br />

angajatii care sunt fie în departamentul informatic (cod_dep="info")<br />

fie în departamentul contabilitate (cod_dep="cont")<br />

select nume, cod_dep from angajati where cod_dep="info" or<br />

cod_dep="cont"<br />

Rezultatele exemplului 1.7<br />

8. Afişaţi numele angajaţilor şi data naşterii pentru angajaţii născuţi<br />

după 15-03-1980 (formatul pentru data este {^yyyy/mm/dd})<br />

select nume, data_nasterii from angajati where data_nasterii ><br />

{^1980/03/15}<br />

Rezultatele exemplului 1.8<br />

9. Afişaţi numele angajaţilor şi data naşterii pentru angajaţii născuţi<br />

între 15-03-1980 şi 20-05-1983


Limbaje de programare şi baze de date 43<br />

select nume, data_nasterii from angajati where data_nasterii ><br />

{^1980/03/15} and data_nasterii < {^1983/05/20}<br />

Rezultatele exemplului 1.9<br />

10. Care sunt codurile de departament din tabela angajati?<br />

select cod_dep from angajati<br />

Rezultatele exemplului 1.10<br />

11. Care sunt codurile de departament din tabela angajati, afişate o<br />

singură dată?<br />

select distinct cod_dep from angajati<br />

Rezultatele exemplului 1.11


44<br />

APLICAŢIA 5<br />

Intrebări:<br />

Suport pentru laborator<br />

1. Care sunt clauzele principale ale unei<br />

selecţii?<br />

2. Care sunt clauzele obligatorii ale unei<br />

selecţii?<br />

3. Câte tabele putem trece la clauza FROM?<br />

Studiu individual<br />

Aplicaţia 5: Introducere de date, selecţii simple<br />

şi utilizând condiţii simple şi compuse.<br />

1. Realizaţi o tabelă FURNIZORI cu structura tabelei FURNIZORI<br />

din ANEXA 1.<br />

2. Introduceti următoarele date:<br />

3. Care sunt furnizorii din Brasov?<br />

4. Care sunt furnizorii din Braşov sau Bucuresti?


Limbaje de programare şi baze de date 45<br />

5. Care sunt furnizorii care nu stau în Constanţa?<br />

6. Ştergeţi furnizorii care sunt din Bucureşti.<br />

7. Introduceţi trei furnizori noi utilizând INSERT.<br />

8. Modificaţi localitatea în Cluj pentru furnizorii din Constanta.


46<br />

Coloane, expresii<br />

Suport pentru laborator<br />

Principalele obiective ale capitolului sunt:<br />

Definirea unor coloane noi<br />

Realizarea de calcule pe baza unor date din baza de<br />

date.<br />

O facilitate importantă în multe interogări SQL ţine de<br />

definirea, pe lângă atributele tabelelor, a unor coloane noi, pe baza<br />

unor expresii. Clauza AS ermite denumirea coloanelor calculate sau<br />

redenumirea unor coloane ale tabelelor.<br />

De exemplu dacă dorim să aflăm care este TVA-ul aferent<br />

unei facturi, vom avea:<br />

In tabelă FACTURI avem introduse următoarele date:


Limbaje de programare şi baze de date 47<br />

Datele tabelei FACTURI<br />

Pentru a afişa valoarea tva-ului, precum şi valoarea cu TVA<br />

pentru fiecare factură vom avea selectul:<br />

select nr_factura, cod_furn, data_fact, valoare, valoare*19/100 as<br />

TVA, valoare*119/100 as val_totala from facturi<br />

şi vom obţine Query-ul:<br />

Rezultatele selecţiei<br />

Dacă stabilim că pentru fiecare factură pe care o facem<br />

termenul scadent pentru plată este de 2 luni vom calcula data<br />

scadentă astfel:<br />

select nr_factura, gomonth(data_fact,2) as data_scadenta from<br />

facturi


48<br />

Suport pentru laborator<br />

Obţinerea datei scadente pentru fiecare factură<br />

Funcţia GOMONTH (data, nr_luni) returnează o nouă dată<br />

plecând de la data introdusă la care adună un nr. de luni.<br />

Dacă stabilim că pentru fiecare factură pe care o facem<br />

termenul scadent pentru plată este de 60 de zile vom calcula data<br />

scadentă astfel:<br />

select nr_factura, gomonth(data_fact,0)+60 as data_scadenta<br />

from facturi<br />

Obţinerea datei scadente pentru fiecare factură<br />

Intrebări:<br />

1. Cum putem să denumim coloana din rezultat?<br />

2. Cum putem obţine o coloană nouă utilizând în<br />

selecţie o condiţie?


Limbaje de programare şi baze de date 49<br />

APLICAŢIA 6<br />

Studiu individual<br />

Aplicaţia 6: Calcularea amortizării lunare prin<br />

metoda liniară.<br />

1. Realizaţi tabela MF după structura tabelei MF din ANEXA 1.<br />

2. Introduceti următoarele date:<br />

3. Care sunt mijloacele fixe cu valoare mai mare de 30000?<br />

4. Dacă PER_AMORT reprezintă perioada de amortizare în ani,<br />

calculati care este valoarea amortizării lunare liniare.<br />

5. Denumiţi coloana cu amortizarea lunară liniară AM_LUN.<br />

6. Care sunt mijloacele fixe care au amortizarea lunară mai mare de<br />

1000?<br />

7. Modificati perioada de amortizare în 5 pentru mijloacele fixe cu<br />

codul 10004.<br />

8. Calculaţi care este amortizarea lunară pentru "masina 2"<br />

9. Calculaţi amortizarea lunară liniară pentru mijloacele fixe<br />

cumpărate de la furnizorul c1 sau c2.


50<br />

Funcţiile agregat: COUNT,<br />

SUM, AVG, MIN, MAX<br />

Suport pentru laborator<br />

Principalele obiective ale capitolului sunt:<br />

Utilizarea funcţiilor Count, sum, avg. min, max<br />

Realizarea unor noi coloane care să conţină date<br />

obţinute prin utilizarea funcţiilor de mai sus.<br />

Funcţia COUNT contorizează valorile neutre ale unei coloane<br />

sau numărul de linii dintr-un rezultat al unei interogări, altfel spus, în<br />

rezultatul unei consultări, COUNT numără câte vaşlori diferite de<br />

NULL are o coloană specificată sau câte linii sunt:<br />

De exemplu dacă dorim să aflăm căte facturi amvem în tabela<br />

FACTURI (câte linii sunt) avem:<br />

select count (*) from facturi


Limbaje de programare şi baze de date 51<br />

Numărul de facturi din tabela FACTURI<br />

Sau de exemplu dacă dorim să vedem câte facturi au valoarea<br />

peste 3000 vom avea:<br />

select count(*) from facturi WHERE valoare>3000<br />

Numărul de facturi din tabela FACTURI<br />

cu valoare mai mare de 3000<br />

Funcţia SUM este una dintre cele mai utilizate funcţii în<br />

aplicaţiile economice, deoarece datele financiar-contabile şi cele ale<br />

evidenţei tehnico-operative sunt preponderent cantitative.<br />

De exemplu dacă dorim să aflăm care este valoarea totală a<br />

facturilor din tabela FACTURI avem:<br />

select sum(valoare) from facturi<br />

Valoarea totală a facturilor din tabela FACTURI<br />

Sau de exemplu dacă dorim să aflăm care este valoarea totală<br />

a facturilor din tabela FACTURI a furnizorului cu cod_furm "c2"<br />

avem:<br />

select sum(valoare) from facturi where cod_furn="c2"<br />

Valoarea totală a facturilor din tabela FACTURI<br />

a furnizorului cu cod_furm "c2"


52<br />

Suport pentru laborator<br />

Funcţia AVG (AVERAGE) calculează media aritmetică a unei<br />

coloane prin divizarea sumei valorilor coloanei respective la numărul<br />

de valori nenule ale acesteia.<br />

De exemplu dacă dorim să aflăm care este valoarea medie a<br />

facturilor din tabela FACTURI avem:<br />

select avg(valoare) from facturi<br />

Valoarea medie a facturilor din tabela FACTURI<br />

Sau de exemplu dacă dorim să aflăm care este valoarea<br />

medie a facturilor din tabela FACTURI a furnizorului cu cod_furm<br />

"c1" avem:<br />

select avg(valoare) from facturi where cod_furn="c1"<br />

Valoarea medie a facturilor din tabela FACTURI<br />

a furnizorului cu cod_furm "c1"<br />

Deosebit de utile în diverse tipuri de analiză cele două funcţii<br />

MIN şi MAX determină valoarea minimă şi maximă pentru o<br />

coloană. Se pot folosi şi pentru atribute de tip şir de caractere, caz<br />

în care elementul de comparaţie este codul ASCII al caracterelor.<br />

De exemplu dacă dorim care este valoare minimă din tabela<br />

facturi vom avea:<br />

select min(valoare) from facturi<br />

Valoarea minimă din FACTURI


Limbaje de programare şi baze de date 53<br />

Sau de exemplu dacă dorim care este valoare maximă din<br />

tabela facturi vom avea:<br />

select max(valoare) from facturi<br />

Valoarea maximă din FACTURI<br />

Dacă dorim să aflăm care este din punct de vedere alfabetic<br />

cod_furn cu cea mai mare valoare vom avea:<br />

select max(cod_furn) from facturi<br />

APLICAŢIA 7<br />

Valoarea maximă a cod_furn din FACTURI<br />

Studiu individual<br />

APLICAŢIA 7: Utilizarea funcţiilor: AVG; MIN;<br />

MAX; SUM; COUNT<br />

1. Realizaţi tabela FACTURI cu structura tabelei FACTURI din<br />

ANEXA 1.<br />

2. Introduceţi în tabela FACTURI următoarele date:


54<br />

Suport pentru laborator<br />

3. Care este media valorii facturilor?<br />

4. Care este valoarea cea mai mare a unei facturi?<br />

5. Care este valoarea cea mai mică a unei facturi?<br />

6. Calculaţi valoarea medie a valorii facturilor dar nu cu AVG.<br />

7. Câte facturi avem în tabelă?<br />

8. Cate facturi avem în tabelă cu o valoare mai mare de 5000?<br />

9. Câte facturi avem în tabelă cu o valoare între 4000 şi 30000?<br />

(prin două metode)<br />

10. Care este valoare medie a facturilor cu nr. 3525 şi 3522?


Limbaje de programare şi baze de date 55<br />

Opţiunea ORDER BY<br />

Principalele obiective ale capitolului sunt:<br />

Ordonarea datelor unei tabele după unul sau mai<br />

multe atribute<br />

Una dintre caracteristicile modelului relaţional este că nici<br />

ordinea atributelor, nici ordinea liniilor în relaţii nu reprezintă<br />

importanţă din punctul de vedere al conţinutului informaţional.<br />

Însă în practică forma de prezentare a rezultatelor interogării<br />

est importantă. Spre exemplu o listă a localităţilor dintr-o tabelă este<br />

mai uşor citită în ordine alfabetică.<br />

De exemplu dacă dorim pentru tabela facturi să afişăm toate<br />

datele ordonate după câmpul cod_furn vom avea<br />

select * from facturi order by cod_furn


56<br />

Suport pentru laborator<br />

Datele obţinute în urma ordonării după câmpul cod_furn<br />

Aranjarea se poate face atât crescător (ASC) cât şi<br />

descrescător (DESC). În plus se pot specifica mai multe coloane<br />

care să servească drept criterii suplimentare de ordonare. Astfel, la<br />

valori egale ale primului atribut, intră în acţiune criteriul de "balotaj",<br />

care este al doilea atribut, etc.<br />

De exemplu dacă dorim să ordonăm datele din facturi întâi<br />

după cod_furn şi apoi după valoare (după acest criteriu<br />

descrescător) vom avea:<br />

select * from facturi order by cod_furn, valoare desc<br />

Obţinerea datelor ordonate după cod_furn şi apoi<br />

descrescător după valoare<br />

Intrebări:<br />

1. Care este diferenţa între ORDER şi SORT?<br />

2. După câte câmpuri putem ordona şi cum?


Limbaje de programare şi baze de date 57<br />

APLICAŢIA 8<br />

Studiu individual<br />

APLICAŢIA 8: Ordonarea rezultatelor unei<br />

interogări.<br />

1. Realizaţi tabela MF după structura tabelei MF din ANEXA 1.<br />

2. Introduceti următoarele date:<br />

3. Care sunt datele din tabela MF, ordonate alfabetic după<br />

denumire?<br />

4. Care sunt datele din tabela MF, ordonate alfabetic după denumire<br />

şi apoi după valoare?<br />

5. Care este amortizarea lunară liniară pentru fiecare mijloc fix,<br />

datele fiind ordonate după denumirea mijlocului fix?<br />

6. Afişaţi denimirea mijloacelor fixe, ordonată alfabetic pentru<br />

mijloacele fixe cu o valoare mai mare de 32000 inclusiv.<br />

7. Afişaţi alfabetic codurile furnizor - o singură dată.<br />

8. Care este valoarea cea mai mare unui mijloc fix?<br />

9. Care este valoare medie a amortizării lunare a mijloacelor fixe?<br />

10. Câte mijloace fixe avem?


58<br />

Suport pentru laborator<br />

OPERATORII BETWEEN, LIKE ŞI IN<br />

Principalele obiective ale capitolului sunt:<br />

Utilizarea operatorilor<br />

BETWEEN<br />

LIKE<br />

IN<br />

Pentru formularea predicatului de selecţie, SQL permite<br />

utilizarea, pe lângă >,=,


Limbaje de programare şi baze de date 59<br />

Date afişate utilizând condiţia BETWEEN<br />

Acelaşi rezultat il puteam obţine şi cu o condiţie dublă:<br />

select * from facturi where valoare >= 4000 and valoare


60<br />

Suport pentru laborator<br />

Furnizorii a căror cod_furn începe cu litera "c"<br />

De exemplu dacă dorim să afişăm care sunt toţi furnizorii a<br />

căror cod_client începe cu litera "m" vom avea:<br />

select * from facturi where cod_furn like "m%"<br />

Furnizorii a căror cod_furn începe cu litera "m"<br />

De exemplu dacă dorim să afişăm care sunt toţi furnizorii a<br />

căror cod_client are două caractere şi al doilea caracter este 5 vom<br />

avea:<br />

select * from facturi where cod_furn like "_5"<br />

Furnizorii a căror cod_furn are două caractere<br />

şi al doilea caracter este 5<br />

Atunci când se testează dacă valoarea unui atribut este<br />

încadrabilă într-o listă de valori dată, în locul folosirii abundente a<br />

operatorului OR este mai elegant să se apeleze la operatorul IN.<br />

De exemplu dacă dorim să afişăm facturile furnizorilor care au<br />

cod_furn c1, c3 şi c4 avem:<br />

select * from facturi where cod_furn in ("c1","c3","c4")


Limbaje de programare şi baze de date 61<br />

Facturile furnizorilor care au cod_furn c1, c3 şi c4<br />

Sau de exemplu dacă dorim să selectăm facturile care au<br />

valoare de 500, 600, 5000 vom avea:<br />

select * from facturi where valoare in (500, 600, 5000)<br />

APLICAŢIA 9<br />

Facturile care au valoare de 500, 600, 5000<br />

Intrebări:<br />

1. Care este diferenţa între operatorii<br />

BETWEEN şi IN?<br />

2. Cu ce poate fi substituit operatorul<br />

BETWEEN?<br />

Studiu individual<br />

APLCAŢIA 9: Utilizarea operatorilor BETWEEN;<br />

LIKE şi IN în calcularea unor date pe baza<br />

tabelei ANGAJATI.<br />

1. Realizaţi tabela SALARIATI pe baza structurii tabelei ANGAJATI<br />

din ANEXA 1.


62<br />

2. În tabelă introduceţi următoarele date:<br />

Suport pentru laborator<br />

3. Care sunt salariaţii care au salariu cuprins între 550 şi 1000?<br />

4. Care sunt angajaţii care au salariu 600, 1000, 750, sau 300?<br />

5. Câţi angajaţi avem?<br />

6. Care este salariul mediu?<br />

7. Care este numele salariatului cu salariul cel mai mare?<br />

8. Care sunt angajaţii a căror nume începe cu litera M sau I?<br />

9. Câţi angajaţi au prenumele din trei litere?<br />

10. Care sunt salariaţii care nu au prenumele ION sau IOANA?


Limbaje de programare şi baze de date 63<br />

REUNIUNE, PRODUS CARTEZIAN<br />

Principalele obiective ale capitolului sunt:<br />

Prezentarea operatorului UNION<br />

Realizarea produsului cartezian<br />

Primii trei operatori asamblişti prezintă operatori SQL dedicaţi:<br />

UNION, INTERSECT, MINUS (EXTRACT), în timp ce produsul<br />

cartezian se calculează automat prin simpla enumerare a celor fouă<br />

tabele din clauza FROM.<br />

La reuniunea a două tabele, SQL elimină automat liniile<br />

identice din rezultat. Dacă se doreşte prelucrarea tuturor liniilor celor<br />

două relaţii şi implicit apariţia de linii duplicate, se foloseşte caluza<br />

ALL (UNION ALL).<br />

De exemplu, după aceeaşi strctură a tabelei FURNIZORI<br />

creăm tabela FURNIZORI2.<br />

Tabela FURNIZORI2 conţine următoarele date:


64<br />

Datele tabelei FURNIZORI2<br />

Datele tabelei FURNIZORI<br />

Suport pentru laborator<br />

Dacă dorim să afişăm toate datele (utilizând reuniunea) din<br />

tabelele FURNIZORI şi FURNIZORI2 avem:<br />

select * from furnizori union select * from furnizori2


Limbaje de programare şi baze de date 65<br />

Toate datele (utilizând reuniunea) din tabelele FURNIZORI şi<br />

FURNIZORI2<br />

SQL nu pune la dispoziţie vreun operator special dedicat<br />

produsului cartezian.<br />

Produsul cartezian se realizează prein simpla enumerare a<br />

tabebelor în clauza FROM.<br />

De exemplu dacă dorim să realizăm produsul cartezian între<br />

tabelele FACTURI şi FURNIZORI avem:<br />

select * from facturi, furnizori


66<br />

Suport pentru laborator<br />

Produsul cartezian al tabelelor FACTURI şi FURNIZORI<br />

APLICAŢIA 10<br />

Intrebări:<br />

1. Ce reprezintă operatorul UNION?<br />

2. Cum se realizează produsul cartezian?<br />

Studiu individual<br />

APLICAŢIA 10: Evidenţa mijloacelor fixe ale<br />

unei întreprinderi<br />

1. Realizaţi tabela MF1 şi MF2 după structura tabelei MF din<br />

ANEXA 1.


Limbaje de programare şi baze de date 67<br />

2. Introduceti următoarele date:<br />

Datele tabelei MF1<br />

Datele tabelei MF2<br />

3. Care sunt datele din tabela MF1, ordonate alfabetic după<br />

denumire?<br />

4. Care sunt datele din tabela MF2, ordonate alfabetic după<br />

denumire şi apoi după valoare?<br />

5. Afişaţi datele celor două tabele într-un query<br />

6. Care sunt mijloacele fixe ce se găsesc în MF1 şi nu se găsesc în<br />

MF2?<br />

7. Care sunt mijloacele fixe ce se găsesc şi în MF1 şi în MF2?<br />

8. Care este valoarea medie a mijloacelor fixe din MF1?<br />

9. Care este valoarea medie a mijloacelor fixe din MF2 a căror nume<br />

începe cu litera C?


68<br />

Suport pentru laborator<br />

10. Care sunt mijloacele fixe din tabela MF2 furnizate de furnizorii cu<br />

codurile: c1, c2, c4, c5,c8?


Limbaje de programare şi baze de date 69<br />

THETA ŞI ECHI-JONCŢIUNEA<br />

Principalele obiective ale capitolului sunt:<br />

Realizarea unei legături între două sau mai multe<br />

tabele<br />

Utilizarea condiţiilor în echi-joncţiune<br />

SQL nu prezintă clauze sau operatori speciali pentru joncţiune,<br />

joncţiunea fiind o combinaţie între produs cartezian şi selecţie.<br />

Deci pentru theta-joncţiunea dintre două relaţii R1 şi R2 avem:<br />

unde:<br />

select * from R1, R2 where R1.A>=R2.E<br />

R1<br />

A B C<br />

20 XYZ 30<br />

30 XXZ 20<br />

40 YYX 25<br />

iar pentru echi-joncţiune avem:<br />

R2<br />

C D E<br />

25 XYZ 30<br />

40 YYX 25<br />

30 XXZ 40


70<br />

respectiv<br />

select * from R1, R2 where R1.A=R2.E<br />

Varianta cu INNER JOIN (joncţiune internă) este:<br />

select * from R1 inner join R2 on R1.A>=R2.E<br />

select * from R1 inner join R2 on R1.A=R2.E<br />

Suport pentru laborator<br />

Pentru următorul exemplu utilizăm următoarele tabele:<br />

FURNIZORI, FACTURI cu următoarele date:<br />

Se cere să de afişeze pentru fiecare factură numele<br />

furnizorului.


Limbaje de programare şi baze de date 71<br />

select facturi.*, furnizori.nume_furn from facturi, furnizori where<br />

facturi.cod_furn=furnizori.cod_furn<br />

Numele furnizorului pentru fiecare factură<br />

Acelaşi rezultat se poate obţine utilizând INNER JOIN:<br />

select facturi.*, furnizori.nume_furn from facturi inner join furnizori<br />

ON facturi.cod_furn=furnizori.cod_furn<br />

Numele furnizorului pentru fiecare factură<br />

Dacă dorim să afişăm numele furnizorului pentru fiecare<br />

factură numai pentru furnizorul cu cod_furn "c1" vom avea:<br />

select facturi.*, furnizori.nume_furn from facturi, furnizori where<br />

facturi.cod_furn=furnizori.cod_furn and facturi.cod_furn="c1"


72<br />

APLICAŢIA 11<br />

Numele furnizorului pentru fiecare factură<br />

numai pentru furnizorul cu cod_furn "c1"<br />

Intrebări:<br />

Suport pentru laborator<br />

1. De ce două tabele sunt legate logic prin<br />

valori?<br />

2. Care este condiţia necesară pentru echijoncţiune?<br />

Studiu individual<br />

APLICAŢIA 11: Evidenţa salariaţilor dintr-o firmă<br />

1. Să se realizeze tabelele ANGAJATI şi DEPARTAMENTE după<br />

structura tabelelor ANGAJATI şi DEPARTAMENTE din ANEXA 1<br />

2. Introduceţi în tabele următoarele date:


Limbaje de programare şi baze de date 73<br />

3. Afişaţi şeful pentru fiecare angajat.<br />

4. Care sunt angajaţii care lucrează în Braşov?<br />

5. Câţi angajaţi lucrează în Bucureşti?<br />

6. Care este numele angajatului cu salariul maxim?<br />

7. Care este fondul de salarii pentru fiecare cod_dep?<br />

8. Care sunt angajatii angajaţi dupa 01/01/1980?<br />

9. Care sunt angajaţii care lucrează la departamentul marketing?<br />

10. Câţi subalterni are Vlad?<br />

11. Care este salariul mediu pentru departamentul management?<br />

12. Care sunt angajaţii a căror şef începe cu litera "A"?<br />

13. Care sunt angajaţii care lucrează în Braşov sau Bucureşti?


74<br />

Suport pentru laborator<br />

GRUPAREA TUPLURILOR: GROUP BY ŞI<br />

HAVING<br />

Principalele obiective ale capitolului sunt:<br />

Utilizarea grupurilor<br />

Utilizarea condiţiilor pentru grupuri<br />

Clauza GROUP BY formează grupe (grupuri) de tupluri ale<br />

unei relaţii, pe baza valorilor comune ale unui atribut. În frazele<br />

SELECT formulate până în acest paragraf, prin intermediul WHERE<br />

au fost selectate tupluri ale tabelei. Prin asocierea unei clauze<br />

HAVING la GROUP BY este posibilă selectare anumitor grupuri de<br />

tupluri ce îndeplinesc un criteriu, valabil numai la nivel de grup (nu şi<br />

la nivel de linie).<br />

Clauza unei fraze SELECT ce conţine această clauză se<br />

obţine prin regruparea tuturor liniilor din tabelele eumerate în FROM,<br />

extrăgându-se câte o apariţie pentru fiecare valoare distinctă a<br />

coloanei/grupului de coloane.<br />

Formatul general este:


Limbaje de programare şi baze de date 75<br />

select coloană1, coloană2,...,coloană m from tabelă group by<br />

coloană_de_regrupare<br />

De exemplu dacă dorim să vedem care este valoarea totală a<br />

facturilor pentru fiecare cod_furn vom avea:<br />

select cod_furn, sum(valoare) from facturi group by cod_furn<br />

Valoarea totală a facturilor pentru fiecare cod_furn<br />

Cea mai simplă definiţie a clauzei HAVING este: clauza<br />

HAVING este WHERE-ul ce operează la nivel de grupuri. Dacă<br />

WHERE acţionează la nivel de tuplu, selectând acele linii care<br />

îndeplinesc o condiţie specificată, HAVING permite specificarea<br />

unor condiţii de selecţie care se aplică rupurilor de linii create prin<br />

GROUP BY.<br />

Din rezultat sunt eliminate toate grupurile care nu satisfac<br />

condiţia specificată.<br />

De exemplu dacă dorim să vedem care este valoarea totală a<br />

facturilor pentru cod_furn egal cu "c1" vom avea:<br />

select cod_furn, sum(valoare) from facturi group by cod_furn having<br />

cod_furn="c1"<br />

Valoarea totală a facturilor pentru<br />

cod_furn egal cu "c1"


76<br />

APLICAŢIA 12<br />

Intrebări:<br />

Suport pentru laborator<br />

Când se utilizează GROUP BY?<br />

Care este definiţia condiţiei HAVING?<br />

Studiu individual<br />

APLICAŢIA 12: Situaţii de grup la nivelul<br />

salariaţilor<br />

1. Să se realizeze tabelele ANGAJATI şi DEPARTAMENTE după<br />

structura tabelelor ANGAJATI şi DEPARTAMENTE din ANEXA 1<br />

2. Introduceţi în tabele următoarele date:


Limbaje de programare şi baze de date 77<br />

3. Afişaţi şeful pentru fiecare angajat.<br />

4. Care este salariul total pentru fiecare departament?<br />

5. Care este salariul total pentru departamentul MANAGEMENT?<br />

6. Care este suma totală a salariilor din departamentele<br />

management şi contabilitate?<br />

7. Care este numărul de salariaţi din fiecare departament?<br />

8. Care este departamentul cu angajaţii cei mai mulţi?<br />

9. Care este şeful departamentului cu cei mai mulţi angajaţi?<br />

10. Câţi angajaţi are Vlad?


78<br />

Suport pentru laborator<br />

FUNCŢII DE CALCUL ÎN VISUAL FOX PRO<br />

Principalele obiective ale capitolului sunt:<br />

Utilizarea funcţiilor de calcul în Visual Fox Pro<br />

Visual Fox Pro permite utilizarea unor instrucţiuni specifice,<br />

executate în fereastra de comenzi, pentru calcule statistice, dar şi<br />

funcţii statistice şi financiare.<br />

Instrucţiunile cel mai des utilizate pentru calcule statistice sunt:<br />

average to <br />

Instrucţiunea furnizează media aritmetică a valorilor numerice din<br />

câmpul specificat.<br />

count to <br />

Instrucţiunea furnizează numărul de înregistrări din tabelă care<br />

respectă condiţiile impuse în domeniul înregistrărilor.


Limbaje de programare şi baze de date 79<br />

sum to <br />

Instrucţiunea furnizează suma (pe coloană) valorilor din câmpul<br />

specificat.<br />

Unde: denumire câmp reprezintă câmpul pe baza valorilor căruia se<br />

va realiza suma;<br />

domeniul înregistrărilor reprezintă de obicei o condiţie de<br />

filtrare a valorilor care intră în sumă;<br />

denumire variabilă reprezintă o variabilă nouă în care va fi<br />

depozitat rezultatul însumării valorilor.<br />

Pentru afişarea rezultatelor acestor operaţii se srie în fereastra de<br />

comenzi:<br />

?[mesaj], <br />

Exemple de instrucţiuni pentru calcule statistice<br />

Principalele funcţii statistice: AVG( ), COUNT( ), SUM( ) având<br />

efecte similare cu instrucţiunile menţionate mai sus, se utilizează în<br />

cadrul unor instrucţiuni cum ar fi CALCULATE sau SELECT.<br />

Funcţiile financiare cel mai des utilizate sunt:<br />

• PAYMENT (valoare împrumut, rata dobânzii, perioada) –<br />

determină rata periodică – de regulă lunară – care trebuie


80<br />

Suport pentru laborator<br />

achitată pentru a stinge o datorie, un împrumut într-o<br />

perioadă de timp dată, la o anumită rată a dobânzii.<br />

• FV (rata lunară, rata dobânzii, număr de perioade) –<br />

determină valoarea actualizată a unei investiţii cu plăţi<br />

periodice egale, pentru un număr cunoscut de perioade<br />

egale de timp, la o anumită valoare a ratei dobânzii.<br />

• PV (rata lunară, rata dobânzii, număr de perioade) –<br />

determină valoarea prezentă a unei investiţii realizate în<br />

viitor, în condiţiile achitării unor plăţi periodice constante, pe<br />

o anumită perioadă, la o rată a dobânzii constantă.<br />

Observaţie: rata dobânzii se raportează la 12 în toate cele trei<br />

cazuri, caz în care numărul de perioade reprezintă numărul de luni.<br />

Aceste funcţii se utilizează în cadrul unor comenzi de tip<br />

browse. În fereastra de comenzi se va scrie:<br />

browse fields , ,...,<br />

=(parametri<br />

corespunzători)<br />

Denumirile câmpurilor afişate prin comanda browse, strâns<br />

legate de parametrii funcţiei, se utilizează pentru a oferi o imagine<br />

completă asupra situaţiei analizate, alternativ existând posibilitatea<br />

afişării doar a rezultatului obnţinut prin utilizarea funcţiei financiare.<br />

APLICAŢIA 13<br />

Studiu individual<br />

Aplicaţie 13: Utilizare funcţii statistice şi<br />

financiare.<br />

Să se construiască un nou proiect. Să se construiască o tabelă<br />

având următoarea structură:<br />

Cod_firma C 4<br />

Credit N 20<br />

Rata N 20<br />

Rata_dob_c N 6 ;2


Limbaje de programare şi baze de date 81<br />

şi cu următorul conţinut :<br />

Rata_dob_d N 6 ;2<br />

Perioada N 3<br />

Cod_firma Credit Rata Rata_dob_c Rata_dob_d Perioada<br />

AMP 10000 100 0.2 0.1 15<br />

COR 15000 145 0.21 0.11 20<br />

DAV 12000 250 0.23 0.12 36<br />

ERG 45000 500 0.22 0.1 48<br />

HTR 21500 350 0.21 0.14 18<br />

COM 50000 220 0.23 0.11 15<br />

SEP 35000 750 0.23 0.13 24<br />

MAN 15500 600 0.21 0.1 12<br />

RAR 75000 840 0.2 0.12 72<br />

a) Să se determine rata periodică, lunară, care trebuie plătită pentru<br />

creditul contractat, de către fiecare societate comercială, utilizând<br />

funcţia PAYMENT.<br />

b) Valorile înscrise în câmpul rata, reprezintă sume lunare egale<br />

care vor fi depuse de fiecare firmă, la începutul fiecărei luni, în<br />

conturi de depozit. Care este valoarea viitoare a sumei obţinute in<br />

cursul ultimei luni în care firmele vor depune bani în cont? (Utilizaţi<br />

funcţia FV)<br />

c) Câte firme au contactat credite cu o valoare peste 25000 lei?<br />

d) Care este suma totală a creditelor acordate de bănci tuturor<br />

firmelor?<br />

e) Care este media sumelor depuse lunar de firmele al căror cod<br />

începe cu litera “C”?


82<br />

Bibliografie:<br />

Suport pentru laborator<br />

1. Marin Fotache, SQL - Dialecte DB2, Oracle, Visual FoxPro,<br />

Editura Polirom, 2001, Bucureşti<br />

2. Mihaela Muntean, Dezvoltarea aplicaţiilor cu baze de date în<br />

Visual FoxPro, Editura All, 2001, Bucureşti<br />

3. Manualul de utilizare - Visual FoxPro 8.0<br />

4. Grupul BDASEIG, Baze de date. Fundamente teoretice şi<br />

practice, Infomega, 2002<br />

5. Manole Velicanu, Constanţa Bodea, Ion Lungu, Cristina Ioniţă,<br />

Georgeta Bădescu - Sisteme de Gestiune a Bazelor de Date,<br />

Petrion


Limbaje de programare şi baze de date 83<br />

Anexa 1<br />

Tabele utilizate<br />

unde: nr - număr; sal_brut - salariu brut; cod_dep - cod departament<br />

unde: cod_dep - cod departament; den-denumire<br />

unde: nr_factură-număr factură; data_fact - data facturii


84<br />

Suport pentru laborator<br />

unde: cod_furn - cod furnizor; nume_furn - nume furnizor<br />

unde: cod_mf - codul mijlocului fix, per_amort - perioada de<br />

amortizare, cod_furn - codul furnizorului

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!