Sunteți pe pagina 1din 85

Radu Lixăndroiu Dana Lupşa

LIMBAJE DE PROGRAMARE ŞI
BAZE DE DATE

SUPORT PENTRU LABORATOR

BRAŞOV - 2006
Limbaje de programare şi baze de date 1

SISTEMUL DE GESTIUNE A
BAZELOR DE DATE

Principalele obiective ale capitolului sunt:

Concepte principale din teoria relaţională


Cheia primară
Cheia externă
Sisteme de gestiune a bazelor de date

Sistemul de gestiune a bazelor de date (SGBD) este


componenta unui sistem de bază de date care are rolul de a permite
descrierea şi manipularea conform unui model de date.
În momentul actual, cea mai mare parte a SGBD-urilor care se
utilizează sunt bazate pe modelul relaţional.
VFP este un SGBD relaţional cu limbaj propriu, care suportă
un nucleu extins din limbajul relaţional SQL (Structured Query
Language).
2 Suport pentru laborator

PRINCIPALELE CONCEPTE DIN TEORIA RELAŢIONALĂ

Domeniul - reprezintă un ansamblu de valori, caracterizat


printr-un nume. Domeniul se poate defini explicit, prin enumerarea
tuturor valorilor care aparţin acestuia (exemplu D1:{roşu, galben,
albastru}), sau implicit prin precizarea proprietăţilor pe care le au
valorile domeniului respectiv (exemplu: D2:{e/e ∈ N }
Relaţia - (tabela) reprezintă un subansamblu al produsului
cartezian dintre mai multe domenii (D1xD2x…) caracterizat printr-un
nume. Reprezentarea folosită pentru o relaţie (R) este tabloul
bidimensional (tabela de date) de forma:

Atributul este coloana unei relaţii caracterizate printr-un


nume. Fiecare atribut îşi ia valorile dintr-un domeniu. Mai multe
atribute pot lua valori din acelaşi domeniu.
Tuplul este linia dintr-o relaţie şi nu are nume. Valorile dintr-un
tuplu aparţin produsului cartezian dintre domeniile relaţiei (exemplu
tuplul v1, v2, ...,vn, unde v1∈ D1, v2 ∈ D2,...,vn ∈ Dm, cu n ≥ m numere
întregi).
Schema relaţiei este un ansamblu format din numele relaţiei
(R) urmat între parantaze rotunde de lista atributelor (Ai), pentru
fiecare atribut precizându-se domeniul asociat (Dj):
R(A1:D1, A2:D2,...,An:Dm):
unde n ≥ m numere întregi.
Cheia este un atribut sau un ansamblu de atribute cu ajutorul
căruia se poate identifica un tuplu dintr-o relaţie.
Cheia este primară dacă identificarea este unică, adică există
un singur tuplu cu o anumită valoare pentru cheie.
Limbaje de programare şi baze de date 3

Cheia este simplă, dacă este formată dintr-un singur atribut.


Cheia este compusă dacă este formată dintr-un ansamblu de
atribute.
Cheia este externă într-o relaţie R1, dacă ansamblul de
atribute care o defineşte ia valori din aceleaşi domenii ca şi cheia
primară a unei relaţii R2 si dacă are rolul de a stabili o legătura
(asociere) între cele două relaţii.

Prezentare comparativă a noţiunilor privind organizarea


datelor în memoria externă în fişiere, baze de date relaţionale (BDR)
şi cele utilizate în VFP.
Mem FISIER CÂMP - CHEIE - -
externă
BDR RELAŢIE ATRIBUT ASOCIERE CHEIE CHEIE DOMENIU
PRIMARĂ EXTERNĂ
VFP TABELĂ CÂMP ASOCIERE CHEIE CHEIE -
(LEGATURA) PRIMARĂ

Intrebări:

1. Pentru tabelele FURNIZORI şi FACTURI


(ANEXA 1) care sunt cheile?
2. Daţi exemplu de un atribut şi de un tuplu
pentru relaţia FACTURI (ANEXA 1)
4 Suport pentru laborator

GENERALITĂŢI DESPRE
APLICAŢIA VISUAL FOX PRO

Principalele obiective ale capitolului sunt:

Prezentarea şi utilizare aplicaţia Visual Fox Pro


Baze de date
Crearea, consultarea şi actualizarea tabelelor

Visual Fox Pro (VFP) este un limbaj specializat în prelucrarea


datelor, grupate în baze de date, permiţând întregistrarea,
păstrarea, regăsirea şi analiza cu uşurinţă a acestora. O bază de
date reprezintă o colecţie de informaţii - de exemplu nume, adrese,
produse, facturi – care pot fi gestionate cu ajutorul unor aplicaţii
specifice, printre care şi Visual Fox Pro. Pentru o mai bună
organizare a bazelor de date sau a celorlalte obiecte, acestea sunt
grupate într-un proiect, care reprezintă de asemenea şi baza
realizării formatului distribuibil (executabil).
Limbaje de programare şi baze de date 5

UTILIZAREA APLICAŢIEI VISUAL FOX PRO

1. Clic pe Start
2. Activaţi opţiunea Programs
3. Clic pe pictograma aplicaţiei Visual Fox Pro

VFP dispune de o fereastră principală care cuprinde:

bară de
instrumente

bară de meniu

fereastră de comenzi
Elementele ferestrei VFP

Proiectele sunt formate din mai multe obiecte:


Obiect Descriere
Tabelele sunt formate din câmpuri (coloane) – care
formează structura tabelei şi înregistrări (rânduri) –
reprezentând conţinutul tabelei. În cadrul fiecărui câmp
există mai multe valori.
O bază de date trebuie să conţină cel puţin o tabelă.

Interogări ale tabelelor sau bazelor de date, respectiv


decuparea şi prezentarea datelor în funcţie de anumite
condiţii.
Formularele reprezintă ferestre personalizate care oferă un
acces şi o vizualizare facilă a datelor dintr-o tabelă sau o
interogare.
Rapoartele prezintă datele dintr-o tabelă sau o interogare
într-un format imprimabil.
6 Suport pentru laborator

CREAREA UNUI PROIECT

Pentru realizarea unui proiect, se procedează astfel:


1. Clic pe meniul File
2. Se activează opţiunea New
3. Se bifează opţiunea Project
4. Clic pe butonul New File
5. Se atribuie un nume proiectului şi se salvează în locaţia dorită.

Crearea unui nou proiect

VFP pune la dispoziţia utilizatorilor un coordonator al întregii


activităţi denumit “Project Manager”, care dispune de o fereastră cu
6 pagini ce grupează pe categorii elementele componente ale unui
proiect şi o bară cu opţiuni dependentă de context.
Limbaje de programare şi baze de date 7

Fereastra Project Manager – fără tabele sau baze de date

În cazul în care fereastra Project Manager se închide,


redeschiderea acesteia se realizează prin alegerea din meniul File a
opţiunii Open şi apoi prin căutarea proiectului dorit în locaţia în care
a fost salvat.

CREAREA ŞI CONSULTAREA UNEI TABELE

Crearea tabelelor se realizează în două etape:


I. Crearea structurii tabelelor (creare câmpuri);
II. Crearea conţinutului tabelei (încărcarea informţiilor).

Pentru crearea structurii unei tabele se procedează astfel:


1. Se deschide/crează un proiect.
2. Din fereastra Project Manager se execută clic pe pagina Data.
3. Se execută clic pe opţiunea Free Tables, apoi pe butonul New şi
New Table.
4. Se atribuie o denumire tabelei şi se allege locaţi în care va fi
salvată. În urma acestei acţiuni rezultă o fereastră denumită
Table Designer.

În fereastra Table Designer există 3 pagini:


8 Suport pentru laborator

Fereastra Table Designer

• Fields • Indexes (pagina de • Table (tabele),


(pagina de indecşi); cu informaţii
câmpuri); despre tabelă.

Pagina Fields cuprinde:

• denumire câmp (name); • opţiunea specifică tipului de


• tip date (valori) aferente date numeric (decimal);
câmpului (type); • indecşi (index);
• mărimea maximă a • indicatorul Null (dacă nu
valorilor (width); există momentan date).

Datele sunt de mai multe tipuri: numeric (numeric, real, integer,


currency, double); şiruri de caractere; logic; dată calendaristică;
moment de timp; memo şi general.

La acţionarea butonului OK utilizatorul este interogaţ dacă doreşte


să introducă date în tabelă, iar la alegerea opţiunii YES se pot
introduce informaţii.

Fereastra de confirmare
Limbaje de programare şi baze de date 9

La revenirea în Project Manager (PM) se observă la rubrica


Free tables semnul + care arată faptul că au fost create tabele
libere (neaparţinând unei bază de date).
Buton pentru
acces la
structura
tabelei/bazei
de date

Buton
pentru
acces la
conţinutul
tabelei
Feareastra Project Manager – cu o tabelă

În partea din dreapta a ferestrei PM, în pagina Data se


observă, există mai multe butoane pentru diverse opţiuni, astfel:

• new – creare tabelă nouă; • browse – vizualizare


• add – adăugare tabelă înregistrări tabelă;
creată anterior; • remove –
• modify – modificare eliminare/ştergere tabelă
structură tabelă; din proiectul curent;
• build.

Consultarea conţinutului unei tabele se realizează astfel:


1. În Project Manager, în pagina Data se selectează tabela
dorită.
2. Se execută clic pe butonul Browse.

ACTUALIZAREA STRUCTURII UNEI TABELE

Actualizarea structurii unei tabele, similar cu actualizarea


conţinutului, este marcată de trei operaţii: adăugare, modificare şi
ştergere a înregistrărilor, toate implicând vizualizarea iniţială a
structurii tabelei cu ajutorul butonului/comenzii Modify/Modify
structure.
10 Suport pentru laborator

A. Adăugarea şi modificarea câmpurilor se realizează astfel:

1. Din fereastra Project Manager se execută clic pe pagina Data şi


se alege denumirea tabelei care trebuie actualizată.
2. Se execută clic pe butonul Modify.
3. Se realizează direct acţiunea dorită.

B. Ştergerea câmpurilor se realizează astfel:


1. Din fereastra Project Manager se execută clic pe pagina Data şi
se alege denumirea tabelei care trebuie actualizată.
2. Se execută clic pe butonul Modify.
3. Se execută clic pe denumirea câmpului care se doreşte a fi şters
şi apoi pe butonul Delete.

ACTUALIZAREA CONŢINUTULUI UNEI TABELE

Actualizarea conţinutului unei tabele este marcată de trei operaţii:


adăugare, modificare şi ştergere a înregistrărilor, toate implicând
vizualizarea iniţială a conţinutului tabelei cu ajutorul
butonului/comenzii Browse.

A. Adăugarea înregistrărilor se realizează astfel:

Pentru a adăuga o singură înregistrare:


1. Din fereastra Project Manager se execută clic pe pagina Data şi
se alege tabele care trebuie actualizată.
2. Se execută clic pe butonul Browse.
3. Din meniul Table se activează opţiunea Append New Record şi
se adaugă o înregistrare.

Pentru a adăuga mai multe înregistrări:


1. Din fereastra Project Manager se execută clic pe pagina Data şi
se alege tabele care trebuie actualizată.
2. Se execută clic pe butonul Browse.
3. Din meniul View se activează opţiunea Append Mode şi se
adugă, rând pe rând mai multe înregistrări.

B. Modificarea înregistrărilor se realizează după cum urmează:

Pentru a modifica independent înregistrările:


Limbaje de programare şi baze de date 11

1. Din fereastra Project Manager se execută clic pe pagina Data şi


apoi pe butonul Browse efectuându-se apoi modificasrea pentru
înregistrarea dorită.

Pentru a modifica înregistrările în funcţie de anumite criterii


1. Din fereastra Project Manager se execută clic pe pagina Data
şi apoi pe butonul Browse.
2. Din meniul Table se activează opţiunea Replace Field.
3. Rezultă o fereastră în care la opţiunea Field... With... (se alege
câmpul în care va fi modificată cu informaţia) completând
Replacement Criteria (domeniul înregistrărilor = totalitatea
înregistrărilor afectate de execuţia unei comenzi).

Vizualizarea conţinutului tabelei şi modificarea înregistrărilor

Stabilirea domeniului înregistrărilor se face :


b. static (independent de informaţiile conţinute în înregistrări),
utilizând clauzele:
• All – se referă la toate înregistrările;
• Next – de exemplu următoarele 4 înregistrări începând
cu înregistrarea curentă;
• Rest – se referă la înregistrarea curenta şi la toate
celelalte înregistrări până la sfârşitul tabelei;
• Record – înregistrarea a patra, de exemplu.
c. dinamic (în funcţie de informaţiile conţinute în înregistrări)
utilizând:
12 Suport pentru laborator

• for <condiţie> se referă la toate înregistrările din tabelă


pentru care condiţia este adevarată;
• while <condiţie> se referă la înregistrările cuprinse între
înregistrarea curentă şi prima înregistrare pentru care
condiţia este falsă.

C. Ştergerea înregistrărilor se realizează în două moduri

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


înregistrărilor.
1. Se vizulizează conţinutul tabelei.
2. Se acţionează cu mouse-ul spaţiul de ştergere aflat în stânga
înregistrării care se doreşte a fi ştearsă logic, moment în care
înregistrarea va fi marcată. Înregistrarea poate fi recuperată
executând un clic pe celaşi spaţiu.

Ştergerea logică a înregistrărilor

Pentru ştergerea unor înregistrări care îndeplinesc o anumită


condiţie se utilizează din meniul Table opţiunea Delete Records. În
fereastra rezultată se stabileşte domeniul înregistrărilor.

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


înregistrărilor.
1. Se vizualizează conţinutul tabelei.
2. Se şterg logic înregistrările dorite.
3. Din meniul Table se alege opţiunea Remove Deleted Records
apoi se execută clic pe butonul Yes.
Limbaje de programare şi baze de date 13

Confirmarea ştergerii fizice a unei înregistrări

Intrebări:

Care sunt componentele unei tabele?


Cum se construieşte o tabelă în Visual Fox Pro?
Ce înseamnă actualizarea conţinutului unei
tabele? Cum se actualizează conţinutul unei
tabele?
Prezentatţi modul de vizualizare a conţinututlui
unei tabele.
Prezentaţi modul de actualizare a structurii unei
tabele.

Studiu individual

Aplicaţia 1: Creare şi actualizare tabelă.

APLICAŢIA 1

Creaţi o tabelă următoarea structură:

Nume C 30
Prenume C 30
Cod N 3
Oras C 20
Medie N 6;2
Admis L
14 Suport pentru laborator

şi cu următorul conţinut :
Nume Prenume Cod Oras Medie Admis
Ionescu Maria 1 Iasi 9.27
Vlad Mirela 8 Deva 9.50
Georgecu Ana 5 Cluj 8.85
Popescu Denisa 4 Arad 9.33
Rauta Andreea 6 Deva 9.50
Stanciu Roxana 2 Deva 9.10
Radulescu Ruxandra 3 Cluj 9.29
Matei Iuliana 7 Ploiesti 9.60

a) Să se adauge un nou câmp, denumit Admis.

b) Se presupune că doar candidatele cu medii peste 9.25 au fost


admise. Să se completeze valorile corespunzătoare pentru
câmpul Admis.

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


valorile corespunzătoare din câmpul oraş, stabilind domeniul
înregistrărilor cu for.

d) Să se adauge înregistrarea:

Cretulescu Alexandra 9 Orastie 8.00 F

e) Să se şteargă logic înregistrările aferente candidatelor care au


obţinut medie mai mică decât 9.10, utilizând opţiunea Delete
Record şi stabilind domeniul înregistrărilor cu for.

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


Limbaje de programare şi baze de date 15

Baze de date. Sortare. Indexare

Principalele obiective ale capitolului sunt:

Crearea unei baze de date


Înţelegerea conceptelor de sortare şi indexare
Înţelegerea noţiunii de index. Tipuri de indecşi
Validare la nivel de câmp şi înregistrare

CREAREA UNEI BAZE DE DATE

O bază de date este formată din una sau mai multe tabele cu
legături între ele şi eventual secvenţe de cod. Pentru crearea unei
baze de date se parcurge următoarea succesiune de paşi:
1. Se crează un nou proiect, rezultând pagina Project Manager.
2. Din pagina Data se selectează opţiunea Databases, se execută
clic pe butonul New şi se crează o baza de date, rezultând o
fereastră denumită Database Designer.
3. În fereastra Project Manager se execută click pe semnul ‘+’
apărut în faţa denumirii bazei de date. Se selectează opţiunea
Tables şi se execută clic pe butonul New.
16 Suport pentru laborator

Fereastra Database Designer Fereastra Project Manager cu o


tabelă şi o bază de date

SORTAREA ŞI INDEXAREA UNEI TABELE

Sortarea reprezintă ordonarea fizică a înregistrărilor unei tabele. În


urma sortării rezultă o noua tabelă în care înregistrările sunt
aranjate într-o anumita ordine.
Ordonarea fizică a înregistrărilor tabelei se realizează utilizând
instrucţiunea:
sort on <denumire câmp> to <denumire fisier nou>
Aceasta va fi aşadar scrisă în fereastra de comenzi, urmată de
apăsarea butonului Enter de la tastatură.
Pentru a vizualiza conţinutul noii tabele, mai întâi aceasta se
deschide, utilizând comanda use <denumire fişier nou>. Se
execută comanda browse.

Indexarea reprezintă ordonarea logică a înregistrărilor unei tabele.


În urma indexării înregistrările tabelei sunt vizualizate într-o
anumită ordine, dată de index.
Se pot stabili mai mulţi indecşi dar numai unul este activ la un
moment dat.
Indexul poate fi :
• Regular (normal)
• Unique (unic), adică într-un câmp pot fi introduse valori egale,
dar prin alegerea acestui tip de index doar prima în ordinea
apariţiei va fi accesibilă
Limbaje de programare şi baze de date 17

• Primary (primar), adică cel care asigură identificarea unică a


înregistrărilor unei tabele. Acest tip de index poate fi stabilit
doar dacă tabela face parte dintr-o bază de date. Pentru o
tabelă se poate stabili un singur index primar. Indexul primar
obligă ca toate valorile din câmpul ales să fie distincte.
• Candidate (candidat), utilizat în cazul în care într-o tabela este
nevoie de mai multe câmpuri cu valori distincte. Deoarece se
poate stabili doar un singur index primar, pentru celelalte
câmpuri în care sunt necesare valori distincte, se aleg indecşi
de tip candidat.

MODUL DE STABILIRE A INDECŞILOR

a) Din fereastra Project Manager se selectează denumirea tabelei


care face parte din baza de date.
b) Se execută un clic pe butonul Modify.
c) În fereastra care rezultă, denumită Table designer, în pagina
Fields se execută un clic pe câmpul care va fi stabilit ca index.
d) Din opţiunea Index se alege Ascending (crescător) sau
Descending (descrescător), adcă valorile din câmpul respectiv vor fi
ordonate crescător/descrescător.

Fereastra Table Designer – opţiunile Ascending/Descending

g) Din fereastra Table designer , pagina Indexes , optiunea Type


se alege tipul de index dorit.
18 Suport pentru laborator

Fereastra Table Designer – tipuri de indecşi

MODUL DE ACTIVARE A INDECŞILOR

a) Se vizualizeaza conţinutul tabelei.


b) Din meniul Table se selectează optiunea Properties. Din pagina
Index order se alege denumirea câmpului care se doreşte a fi
activat.
c) Se execută clic pe butonul OK.

Fereastra de activare unui index


Limbaje de programare şi baze de date 19

Alte opţiuni aferente unei tabele dintr-o bază de date

1. Se selecteaza denumirea tabelei din fereastra Project Manager,


se executa Modify.
2. În pafina Fields , în josul paginii există anumite opţiuni care vor fi
utlizate după cum urmează:

• Format: stabileşte un format de editare pentru valorile unui


câmp, de exemplu formatul “a” permite introducerea numai a
literelor şi a cifrelor.
Cum se procedează ?
Se executa clic pe câmpul dorit şi în opţiunea Format se scrie litera
a.

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


exemplu, stabilirea faptului că prima litera va fi majusculă
Cum se procedeaza ?
Se executa clic pe campul dorit şi în opţiunea Input mask se
scrie : !aaaaaaaaaa.

• Caption : permite stabilirea unei denumiri mai lungi pentru


câmpuri
Cum se procedează ?
Se execută clic pe câmpul căruia se doreşte a se modifica
denumirea şi în opţiunea Caption se scrie denumirea dorită, având
un număr mai mare de caractere decât cel permis în mod uzual.

• Field Validation : permite validarea la nivel de câmp, adică


interzice ieşirea din acel câmp dacă informaţia introdusă nu a
corespuns unei cerinţe.
20 Suport pentru laborator

Cum se procedează ?
Se executa clic pe câmpul ales şi în opţiunea Rule se scrie condiţia,
în opţiune Message existând posibilitatea scrierii unui measaj.
Observaţie : mesajul va fi afişat când condiţia de validare la nivelul
câmpului nu este respectată.

În pagina Table există următoarele opţiuni :

• Record Validation : se poate realiza validarea la nivel de


înregistrare
Cum se procedează ?
În opţiunea Rule se scrie condiţia, în opţiune Message se va scrie
un mesaj corespunzător, aferent încălcării condiţiei.
Obs : mesajul va fi afişat când condiţia de validare la nivelul
înregistrărilor nu este respectată.

• Insert trigger : limitează introducerea de noi înregistrări


Cum se procedează ?
În opţiunea Insert trigger se scrie condiţia utilizând, de exemplu,
RECNO()< sau > o valoare.

• Update trigger : restricţionează modificarea denumirii oricărui


câmp din tabelă.
Limbaje de programare şi baze de date 21

Cum se procedează ?
În opţiunea Update trigger se scrie .F.

• Delete trigger : interzice ştergerea oricărei înregistrări din


tabelă, de exemplu se interzice ştergerea unei înregistrări.
Cum se procedează ?
În opţiunea Delete trigger se scrie RECNO()#<număr înregistrare>

• Table comment: permite adăugarea unui comentariu referitor


la înregistrările, structura sau utilitatea tabelei.
Tot în cadrul acestei pagini se regăsesc şi informaţii despre locaţia
pe hard disk unde se află tabela, precum şi numărul de înregistrări şi
de câmpuri.

Observaţie:
• pentru a vizualiza data în ordine azi/luna/an, în fereastra de
comenzi se execută comanda set date to dmy
• pentru a vizualiza anul de forma ‘1998’ in loc de ‘98’ se execută
comanda set century on

Intrebări:

Care este diferenţa dintre o tabelă şi o bază de


date?
Ce înseamnă sortarea? Dar indexarea?
Care sunt diferenţele dintre cele două
concepte?
Ce semnifică noţiunile de validare la nivel de
câmp şi validare la nivel de înregistrare?

Studiu individual

APLICAŢIA 2: Creare bază de date, creare


tabelă, stabilire şi activare indecşi, utilizarea
opţiunilor suplimentare privind tabelele (validare
la nivel de câmp şi la nivel de înregistrare).
22 Suport pentru laborator

APLICAŢIA 2

Să se creeze baza de date denumită STUDENT în care se


află o tabelă cu următoarea structură:

Marca N 4
Nume C 30
Prenume C 30
Oras C 20
Data_ang D 8
Salariu N 10

şi cu următorul conţinut :

Marca Nume Prenume Oras Data_ang Salariu


1 Ionescu Maria Iasi 11.01.00 500
13 Vlad Mirela Deva 04.04.99 600
134 Radu Andrei Cluj 12.07.03 350
140 Stan Denisa Arad 03.11.01 380
7 Rauta Andreea Deva 07.30.00 650
18 Stanciu Alex Brasov 08.15.98 400
39 Radulescu Ruxandra Cluj 09.16.00 260
57 Matei Iuliana Ploiesti 10.10.02 390
241 Cretulescu Alexandra Orastie 02.11.03 100
114 Filip Carmen Oradea 03.01.02 850

1. Să se sorteze tabela. Să se vizualizeze conţinutul tebelei


rezultate.
2. Să se stabilească următorii indecşi: marca – index de tip primar
şi oraş – index de tip normal.
3. Să se activeze pe rând indecşii stabiliţi la puncul anterior.
4. Să se stabilească pentru câmpul oraş formatul a.
5. să se stabilească faptul că pentru câmpul oraş prima literă va fi
majusculă.
6. Să se stabilească pentru câmpul oraş o denimre mai lungă,
respectiv: Locul nasterii angajatului
7. Regula de validare la nivelul câmpului marca nu permite valori
mai mici decât 250. Să se stabilească acestă regulă şi, în cazul
în care aceasta este încălcată să se afişeze mesajul: Marca
trebuie sa fie mai mica decat 250.
8. Introduceţi o nouă înregistrare în care valoarea din câmpul
marca să încalce regula. Ce se întâmplă?
Limbaje de programare şi baze de date 23

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


să nu fie mai mic decât 300. Să se stabilească acestă regulă şi,
în cazul în care aceasta este încălcată să se afişeze mesajul:
Salariul trebuie sa fie mai mare decat 300.
10. Introduceţi o nouă înregistrare în care valoarea din câmpul
salariu să încalce regula. Ce se întâmplă?
11. Limitaţi introducerea de noi înregistrări la 14 şi apoi introduceţi o
nouă înregistrare. Ce se întâmplă?
12. Restricţionaţi modificarea denumirii oricărui câmp din tabelă.
Verificaţi.
13. Interziceţi ştergerea primei înregistrări. Verificaţi.
14. Adăugaţi următorul comentariu referitor la tabelă: Aceasta tabela
este utilizata pentru evidenta salaratilor firmei ALFA SRL, de la
infiintare pana in prezent.
24 Suport pentru laborator

BAZE DE DATE. LEGĂTURI ÎNTRE TABELE

Principalele obiective ale capitolului sunt:

Prezentarea tipurilor de legături între tabelele


aparţinând unei baze de date

Între doua sau mai multe tabele aparţinând unei baze de date se
pot stabili două tipuri de legături (relaţii):
1. legături temporare : valabile în cadrul sesiunii de lucru curente
2. legături permanente : valabile ori de câte ori se deschide baza
de date, se construiesc o singură dată şi fac parte integrantă din
baza de date
La stabilirea unei relaţii între două tabele una dintre tabele are rol
conducător, fiind denumită tabela-părinte şi cealaltă tabelă este
condusă, fiind denumită tabela-fiu.

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


pentru valori egale aflate în acele câmpuri. Pentru tabela-părinte
acest câmp se numeşte cheie primară, iar pentru tabela-fiu câmpul
se numeşte cheie externă.
Limbaje de programare şi baze de date 25

De asemenea se impune o precizare: cheia primară reprezintă un


câmp ale cărui valori au rol unic de identificare a fiecărei
înregistrări. De exemplu, CNP este cheie primară într-o tabelă cu
informaţii despre populaţia unui oraş, deoarece fiecare cetăţean are
un singur CNP, deci fiecere înregistrare va fi unică, nu pot exista
două înregistrări cu aceeaşi valoare CNP.

Stabilirea legăturilor temporare şi a legăturilor permanente


presupune realizarea simultană a trei condiţii:
a) existenţa unei baze de date cu cel puţin două tabele ;
b) în tabela-părinte câmpul comun este index primar
c) în tabela-fiu câmpul comun este stabilit ca fiind index – de
obicei normal.

LEGĂTURI TEMPORARE

1. Se crează un nou proiect sau se deschide un proiect existent,


conţinând o bază de date.
2. Se verifică existenţa indecşilor sau se stabilesc indecşii în cazul
în care nu sunt stabiliţi.
3. Din meniul Window se alege opţiunea Data Session. Se
execută clic pe butonul Open, pentru a deschide tabelele.
4. Din fereastra obţinută astfel, denumită Open, se execută clic pe
tabela care se doreşte a fi deschisă, bifând de semenea
opţiunea Exclusive, apoi se execută clic pe butonul OK.

Fereastra Data Session

5. Se procedează similar pentru toate tabelele pentru care se


doreşte stabilirea unor legături temporare.
26 Suport pentru laborator

6. Se execută clic pe denumirea tabelei-părinte. Se execută clic pe


butonul Relations.
7. În fereastra rezultantă, denumită denumită Set Index Order se
execută OK, apoi în fereastra Expression Builder, în dreptul
opţiunii SET RELATION se scrie denumirea câmpului comun, în
cazul în care această denumire nu există deja.
8. Se execută clic pe butonul OK. În acest moment între cele două
tabele a fost realizată o legătură temporară de tip one-to-one.

Fereastra Expression Builder

9. În cazul în care se doreşte realizarea unei legături de tip one-to-


many, se execută clic pe butonul 1 to many. Din fereastra
rezultată, denumită Create One-To-Many Relationship se
alege denumirea tabelei/tabelelor cu care se doreşte a se
realiza legătura, se execută clic pe butonul Move şi apoi pe
butonul OK.
Limbaje de programare şi baze de date 27

Fereastra pentru crearea legăturilor de tip one-to-many

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


clic pe căte o înregistrare din tabela-părinte, în tabela-fiu fiind
afişate doar înregistrările care conţin în index valoarea
înregistrării curente din tabela-părinte.

Corespondenţa în modul Browse a valorilor comune ale unui index

Se constată că principalul avantaj al legăturii temporare este acela


că în momentul în care în tabela-părinte cursorul este mutat pe o
înregistrare, în tabela-fiu sunt afişate doar înregistrările care conţin
valoarea din câmpul comun aferent înregistrării din tabela-părinte.

LEGĂTURI PERMANENTE

1. Se deschide fereastra Database Designer, executând un clic în


fereastra Project Manager pe denumirea bazei de date şi apoi
pe butonul Modify. În acest moment structura şi indexul fiecărei
tabele pot fi vizualizate.
28 Suport pentru laborator

2. Se execută un clic pe denumirea indexului primar corespunzător


din tabela-părinte şi, prin metoda drag-and-drop se plasează
cursorul pe denumirea corespunzătoare a indexului din tabela-
fiu, eliberând cursorul. Se constată realizarea unei legături
permamante.

Realizarea unei legături permanente

Stabilirea unei legături permanente permite stabilirea integrităţii


referenţiale. O restricţie de integritate referenţială se referă la faptul
că în tabela-fiu nu pot exista înregistrări în care în cheia externă să
fie înregistrate valori care nu se află în mulţimea valorilor cheii
primare din tabela-părinte.

De exemplu, dacă se dau două tabele FACTURI [numar_factura,


data_factura, cod_client] şi CLIENŢI [cod_client, nume_client,
localitate], nu poate exista o înregistrare (numar_factura: 12,
data_factura: 12/06/2005, cod_client: 111) dacă în tabela CLIENŢI
nu există un client cu cod 111, altfel spus, nu poate exista o factură
emisă de un client care nu există.

Integritatea referenţială se stabileşte astfel.


1. Se execută un clic dreapta pe legătura creată şi se alege
opţiunea Edit Referential Integrity.
2. În fereastra rezultată, se pot stabili trei tipuri de reguli referitoare
la înregistrările din ambele tabele:
• Rules for Updating – reguli pentru actualizare;
• Rules for Deleting – reguli pentru ştergere;
• Rules for Inserting – reguli pentru inserare.
Limbaje de programare şi baze de date 29

Fereastra Referential Integrity Builder

Pentru primele două opţiuni, există trei posibilităţi: cascade,


restrict şi ignore.
Cascade se referă la faptul că atunci când o înregistrare
conţinând o valoare ale indexului primar din tabela-părinte este
modificată/ştearsă, se realizează actualizarea/ştergerea automată a
înregistrărilor din tabela-fiu care conţin acea valoare.
Restrict se referă la faptul că nu este permisă
modificarea/ştergerea unei înregistrări, şi implicit a unei valor a
indexului primar, atunci când în tabela-fiu se regăsesc înregistrări
care conţin acea valoarea.
Ignore se referă la posibilitatea actualizării/ştergerii
independente a înregistrărilor din cele două tabele în momentul
modificării/ştergerii unei valori a indexului primar.
Pentru opţiunea Rulea for Inserting există dor două posibilităţi:
restrict şi ignore, referindu-se la faptul că nu este permisă/este
permisă adăugarea unei noi înregistrări în tabela-fiu dacă valoarea
înregistrată în index nu există în mulţimea valorilor indexului primar
corespunzător tabelei-părinte.

Studiu individual

Aplicaţia 3: Creare legături temporare şi


permamante între tabele aprţinând unei baze de
date.
30 Suport pentru laborator

APLICAŢIA 3

Să se realizeze un nou proiect. Să se realizeze o bază de


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

Structură Conţinut

Cod_client C 4 Cod_client Nume Oras


Nume C 20 AMP Amep Brasov
Oras C 10 COR CorrImpex Galati
DAV Daval Brasov
Index primar, ascendent : ERG Energo Bucuresti
cod_client HTR Hatrom Brasov

Structură Conţinut

Nr_fact N 10 Nr_fact Cod_client Data


Cod_client C 4 23 AMP 05/11/05
Data D 8 116 HTR 04/12/05
315 COR 06/04/05
117 DAV 12/03/04
Index primar, ascendent : 18 ERG 12/05/04
nr_fact 56 ERG 11/07/05
Index normal, ascendent: 12 AMP 02/10/04
cod_client

Structură Conţinut

Cod_produs N 10 Cod_ Den_produs PU Cant Nr_fact


Den_produs C 30 produs
PU N 10 1 Apa 2 500 56
Cant N 10 minerala
Nr_fact N 10 2 Biscuiti 1 55 116
3 Cereale 4 15 315
Index primar, 4 Portocale 5 10 116
ascendent : 5 Servetele 1 150 117
cod_produs 6 Ciocolata 3 40 116
Index normal, 7 Compot 2 14 18
ascendent: nr_fact 8 Iaurt 3 12 23
9 Paine 1 100 12
Limbaje de programare şi baze de date 31

3. Să se stabilească legături temporare între cele trei tabele.


4. Să se stabilească legături permamante între cele trei tabele.
5. Să se stabilească următoarele restricţii de integritate
referenţială: cascade pentru ştergere şi restrict pentru inserarea
unei noi înregistrări.
6. Să se verifice integritatea referenţială prin ştergerea unei
înregistrări existente şi prin adăugarea unei noi înregistrări.
32 Suport pentru laborator

INSERAREA, MODIFICAREA ŞI ŞTERGEREA


LINIILOR

Principalele obiective ale capitolului sunt:

Adăugarea unei linii într-o tabelă


Editarea unor date dintr-o tabelă
Ştergerea unor date dintr-o tabelă

ADĂUGAREA UNEI LINII

Comanda SQL de adăugare de noi linii este INSERT, care


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

INSERT INTO TABELĂ [(ATRIBUT1, ATRIBUT2,... .)] VALUES


(VALOARE_ATRIBUT1, VALOARE_ATRIBUT2,... .)

În cazul tabelei ANGAJATI se poate introduce o nouă line


astfel:

Se dă tabela Angajaţi cu urmatoarele date:


Limbaje de programare şi baze de date 33

INSERT INTO ANGAJATI VALUES (11, 'RADU', 'Info', 250)

iar tabela va arăta astfel:

STERGEREA LINIILOR

Comanda SQL pentru ştergerea uneia sau mai multor linii


dintr-o tabelă este DELETE

DELETE FROM TABELA WHERE CONDITIE

Dacă dorim să ştergem ultima înregistrare introdusă vom


avea:

DELETE FROM ANGAJATI WHERE NUME='RADU'


34 Suport pentru laborator

În cazul Visual FOXPRO este nevoie de comanda PACK ca


ştergerea să fie efectivă, astfel:
PACK
Iar tabela va arăta astfel:

MODIFICAREA VALORILOR UNOR ATRIBUTE

Pentru a modifica valoarea unuia sau mai multor atribute sau


mai multe linii dintr-o tabelă se foloseşte comanda UPDATE cu
formatul general:

UPDATE TABELA SET ATRIBUT1=EXPRESIE [,


ATRIBUT2=EXPRESIE2.... .] WHERE PREDICAT
Limbaje de programare şi baze de date 35

Modificarea se va produce pe toate liniile tabelei care


îndeplinesc condiţia formulată prin predicat.

În cazul tabelei ANGAJATI dacă dorim schimbarea salariului


în 1000 pentru angajata GABRIELA vom avea:

UPDATE ANGAJATI SET SAL_BRUT=1000 WHERE


NUME='Gabriela'

Studiu individual

Aplicaţia 4: Introducere, ştergere şi modificarea


unor date dintr-o tabelă

APLICAŢIA 4

1. Creaţi tabela FACTURI (ca în ANEXA 1)


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

3. În tabela FACTURI modificaţi VALOAREA la 75000 pentru toate


facturile care au valoare mai mare de 10.000.
4. Ştergeţi toate facturile pentru care cod_furn este c1.
5. Modificati cod_furn în n99 pentru facturile a căror valoare este de
cel puţin 8000.
6. Ştergeti toate înregistrările pentru care nr_factură este mai mic de
4000.
7. Stergeti toate datele din tabela FACTURI.
8. Introduceţi cinci facturi noi utilizând INSERT şi cinci facturi
utilizând BROWSE.
Limbaje de programare şi baze de date 37

NUCLEUL SQL ÎN VISUAL FOX PRO

Principalele obiective ale capitolului sunt:

Introducere în conceptul de interogare


a bazelor de date
Sintaxa şi utilizarea comenzii SELECT

CONCEPTUL DE INTEROGARE ŞI COMANDA SELECT

Extragerea informaţiilor din una sau mai multe tabele libere


sau aparţinând unei baze de date, pe baza unor criterii definite de
utilizator poartă denumirea de interogare.
Visual Fox Pro include un set de comenzi ale limbajului SQL
(Structured Query Language) care permite interogarea tabelelor şi
furnizarea rezultatelor sub forma unor interogări, care pot fi
depozitate la o destinaţie precizată. Prin intermediul unei interigări
se construieşte o instrucţiune SELECT a acestui limbaj, care
cuprinde întregul mecanism de interogare al VFP.
Rezultatele interogărilor se pot obţine cu ajutorul unui
generator denumit Query Designer, cu posibilitate de utilizare pe
baza rubricii Queries din fereastra Project Manager, existând
posibilitatea de a utiliza de asemenea şi ajutorul oferit de VFP prin
intermediul Query Wizard.
38 Suport pentru laborator

O altă posibilitate de obţinere a rezultatelor interogărilor este


utilizarea comenzii Select, reprezentată de o sintaxă specifică,
comandă care va fi executată în fereastra de comenzi.
Exemplificarea utilizării comenzii Select se va realiza utilizând o
bază de date cu informaţii necesare organizării sesiunii studenţeşti.

PRINCIPALELE CLAUZE ALE FRAZEI SELECT

Orice frază de tip SELECT are trei clauze principale:


SELECT
FROM
WHERE
Dintre aceste trei clauze doar SELECT şi FROM sunt
obligatorii în orice frază.

SELECŢIA ŞI PROIECŢIA

Clauza SELECT corespunde operatorului proiecţie din algebra


relaţională, fiind utilizată pentru desemnarea listei de atribute
(coloane) din rezultat. Clauza FROM este cea în care sunt
enumerate relaţiile din care vor fi extrase informaţiile aferente
consultării. Clauza WHERE desemnează predicatul selectiv al
algebrei relaţionale (condiţia), relativ la atribute ale relaţiilor care
apar în clauza FROM.
La modul general, o consultare SQL poate fi prezentată sub
forma:
select c1,c2,...,cn
from r1,r2,...,rm
where p

unde:
cj - reprezintă coloanele rezultat;
rj - reprezintă relaţiile ce trebuie parcurse;
p - reprezintă predicatul, condiţia ce trebuie îndeplinită de
tupluri (linii) pentru a fi incluse în rezultat.

Predicatul poate fi simplu sau compus (din mai multe condiţii).


Când clauza WHERE este omisă se consideră implicit că
predicatul p are valoare logică ''adevărat'', astfel încât în rezultat vor
Limbaje de programare şi baze de date 39

fi incluse toate liniile din tabelă sau produsul cartezian al tabelelor,


enumerate în clauza FROM.
Dacă în locul coloanelor c1,c2,...,cn apare simbolul *,
rezultatul va fi alcătuit din toate coloanele relaţiilor specificate în
clauza FROM.
Atributele rezultatului preiau numele din tabela (tabelele)
specificate în clauza FROM. Schimbarea numelui se realizează prin
caluza AS.

exemplu:
select c1,c2 as NUME_NOU from r1

unde numele coloanei c2 devine NUME_NOU;

SQL nu elimină automat liniile identice din rezultat, deci pentru


ca fiecare linie să apară o singură dată este necesara utilizarea
opţiunii DISTINCT.

exemplu:
select distinct c1,c2 from r1

În concluzie, o frază SELECT, corespunde:


• unei selecţii algebrice (clauza WHERE p)
• unei proiecţii (SELECT ci)
• unui produs cartezian (FROM - r1 ⊗ r2 ⊗ ... ⊗ rm)

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


fiind: un atribut din r1,r2,...,rm sau expresie calculată pe baza unor
atribute din r1,r2,...,rm.

Execuţia unei fraze SELECT realizează un rezultat sub formă


tabelară.
Rezultatul poate fi:
1. o listă (text)
2. o tabelă propriu-zisă
3. o tabelă temporară
4. o tabelă derivată (imagine)
5. o variabilă masiv (tablou)

Exemplu:
Utilizăm tabela ANGAJATI în care introducem următoarele
date:
40 Suport pentru laborator

Datele tabelei angajati.dbf

1. Care sunt datele conţinute în tabela angajati?

select nr, nume, prenume, data_nasterii, sal_brut, cod_dep from


angajati
sau:
select * from angajati

Rezultatele exemplului 1.1

2. Care sunt numele salariaţilor şi salariul brut?

select nume, sal_brut from angajati


Limbaje de programare şi baze de date 41

Rezultatele exemplului 1.2

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


sal_brut denumim coloana salariu_brut?

select nume, sal_brut as salariu_brut from angajati

Rezultatele exemplului 1.3

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


salariul brut mai mare de 700 lei

select nume from angajati where sal_brut>700

Rezultatele exemplului 1.4

5. Care sunt datele salariaţilor care lucrează în departamentul


informatic (cod_dep="info")?

select * from angajati WHERE cod_dep="info"

Rezultatele exemplului 1.5


42 Suport pentru laborator

6. Care sunt datele salariaţilor care lucrează în departamentul


informatic (cod_dep="info") şi care au salariul brut mai mare de 700
de lei?

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

Rezultatele exemplului 1.6

7. Afişaţi numele salariaţilor şi codul departamentului pentru


angajatii care sunt fie în departamentul informatic (cod_dep="info")
fie în departamentul contabilitate (cod_dep="cont")

select nume, cod_dep from angajati where cod_dep="info" or


cod_dep="cont"

Rezultatele exemplului 1.7

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


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

select nume, data_nasterii from angajati where data_nasterii >


{^1980/03/15}

Rezultatele exemplului 1.8

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


între 15-03-1980 şi 20-05-1983
Limbaje de programare şi baze de date 43

select nume, data_nasterii from angajati where data_nasterii >


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

Rezultatele exemplului 1.9

10. Care sunt codurile de departament din tabela angajati?

select cod_dep from angajati

Rezultatele exemplului 1.10

11. Care sunt codurile de departament din tabela angajati, afişate o


singură dată?

select distinct cod_dep from angajati

Rezultatele exemplului 1.11


44 Suport pentru laborator

Intrebări:

1. Care sunt clauzele principale ale unei


selecţii?
2. Care sunt clauzele obligatorii ale unei
selecţii?
3. Câte tabele putem trece la clauza FROM?

Studiu individual

Aplicaţia 5: Introducere de date, selecţii simple


şi utilizând condiţii simple şi compuse.

APLICAŢIA 5

1. Realizaţi o tabelă FURNIZORI cu structura tabelei FURNIZORI


din ANEXA 1.
2. Introduceti următoarele date:

3. Care sunt furnizorii din Brasov?


4. Care sunt furnizorii din Braşov sau Bucuresti?
Limbaje de programare şi baze de date 45

5. Care sunt furnizorii care nu stau în Constanţa?


6. Ştergeţi furnizorii care sunt din Bucureşti.
7. Introduceţi trei furnizori noi utilizând INSERT.
8. Modificaţi localitatea în Cluj pentru furnizorii din Constanta.
46 Suport pentru laborator

Coloane, expresii

Principalele obiective ale capitolului sunt:

Definirea unor coloane noi


Realizarea de calcule pe baza unor date din baza de
date.

O facilitate importantă în multe interogări SQL ţine de


definirea, pe lângă atributele tabelelor, a unor coloane noi, pe baza
unor expresii. Clauza AS ermite denumirea coloanelor calculate sau
redenumirea unor coloane ale tabelelor.
De exemplu dacă dorim să aflăm care este TVA-ul aferent
unei facturi, vom avea:

In tabelă FACTURI avem introduse următoarele date:


Limbaje de programare şi baze de date 47

Datele tabelei FACTURI

Pentru a afişa valoarea tva-ului, precum şi valoarea cu TVA


pentru fiecare factură vom avea selectul:

select nr_factura, cod_furn, data_fact, valoare, valoare*19/100 as


TVA, valoare*119/100 as val_totala from facturi

şi vom obţine Query-ul:

Rezultatele selecţiei

Dacă stabilim că pentru fiecare factură pe care o facem


termenul scadent pentru plată este de 2 luni vom calcula data
scadentă astfel:

select nr_factura, gomonth(data_fact,2) as data_scadenta from


facturi
48 Suport pentru laborator

Obţinerea datei scadente pentru fiecare factură

Funcţia GOMONTH (data, nr_luni) returnează o nouă dată


plecând de la data introdusă la care adună un nr. de luni.

Dacă stabilim că pentru fiecare factură pe care o facem


termenul scadent pentru plată este de 60 de zile vom calcula data
scadentă astfel:

select nr_factura, gomonth(data_fact,0)+60 as data_scadenta


from facturi

Obţinerea datei scadente pentru fiecare factură

Intrebări:

1. Cum putem să denumim coloana din rezultat?


2. Cum putem obţine o coloană nouă utilizând în
selecţie o condiţie?
Limbaje de programare şi baze de date 49

Studiu individual

Aplicaţia 6: Calcularea amortizării lunare prin


metoda liniară.

APLICAŢIA 6

1. Realizaţi tabela MF după structura tabelei MF din ANEXA 1.


2. Introduceti următoarele date:

3. Care sunt mijloacele fixe cu valoare mai mare de 30000?


4. Dacă PER_AMORT reprezintă perioada de amortizare în ani,
calculati care este valoarea amortizării lunare liniare.
5. Denumiţi coloana cu amortizarea lunară liniară AM_LUN.
6. Care sunt mijloacele fixe care au amortizarea lunară mai mare de
1000?
7. Modificati perioada de amortizare în 5 pentru mijloacele fixe cu
codul 10004.
8. Calculaţi care este amortizarea lunară pentru "masina 2"
9. Calculaţi amortizarea lunară liniară pentru mijloacele fixe
cumpărate de la furnizorul c1 sau c2.
50 Suport pentru laborator

Funcţiile agregat: COUNT,


SUM, AVG, MIN, MAX

Principalele obiective ale capitolului sunt:

Utilizarea funcţiilor Count, sum, avg. min, max


Realizarea unor noi coloane care să conţină date
obţinute prin utilizarea funcţiilor de mai sus.

Funcţia COUNT contorizează valorile neutre ale unei coloane


sau numărul de linii dintr-un rezultat al unei interogări, altfel spus, în
rezultatul unei consultări, COUNT numără câte vaşlori diferite de
NULL are o coloană specificată sau câte linii sunt:

De exemplu dacă dorim să aflăm căte facturi amvem în tabela


FACTURI (câte linii sunt) avem:

select count (*) from facturi


Limbaje de programare şi baze de date 51

Numărul de facturi din tabela FACTURI

Sau de exemplu dacă dorim să vedem câte facturi au valoarea


peste 3000 vom avea:

select count(*) from facturi WHERE valoare>3000

Numărul de facturi din tabela FACTURI


cu valoare mai mare de 3000

Funcţia SUM este una dintre cele mai utilizate funcţii în


aplicaţiile economice, deoarece datele financiar-contabile şi cele ale
evidenţei tehnico-operative sunt preponderent cantitative.

De exemplu dacă dorim să aflăm care este valoarea totală a


facturilor din tabela FACTURI avem:

select sum(valoare) from facturi

Valoarea totală a facturilor din tabela FACTURI

Sau de exemplu dacă dorim să aflăm care este valoarea totală


a facturilor din tabela FACTURI a furnizorului cu cod_furm "c2"
avem:

select sum(valoare) from facturi where cod_furn="c2"

Valoarea totală a facturilor din tabela FACTURI


a furnizorului cu cod_furm "c2"
52 Suport pentru laborator

Funcţia AVG (AVERAGE) calculează media aritmetică a unei


coloane prin divizarea sumei valorilor coloanei respective la numărul
de valori nenule ale acesteia.

De exemplu dacă dorim să aflăm care este valoarea medie a


facturilor din tabela FACTURI avem:

select avg(valoare) from facturi

Valoarea medie a facturilor din tabela FACTURI

Sau de exemplu dacă dorim să aflăm care este valoarea


medie a facturilor din tabela FACTURI a furnizorului cu cod_furm
"c1" avem:

select avg(valoare) from facturi where cod_furn="c1"

Valoarea medie a facturilor din tabela FACTURI


a furnizorului cu cod_furm "c1"

Deosebit de utile în diverse tipuri de analiză cele două funcţii


MIN şi MAX determină valoarea minimă şi maximă pentru o
coloană. Se pot folosi şi pentru atribute de tip şir de caractere, caz
în care elementul de comparaţie este codul ASCII al caracterelor.

De exemplu dacă dorim care este valoare minimă din tabela


facturi vom avea:

select min(valoare) from facturi

Valoarea minimă din FACTURI


Limbaje de programare şi baze de date 53

Sau de exemplu dacă dorim care este valoare maximă din


tabela facturi vom avea:

select max(valoare) from facturi

Valoarea maximă din FACTURI

Dacă dorim să aflăm care este din punct de vedere alfabetic


cod_furn cu cea mai mare valoare vom avea:

select max(cod_furn) from facturi

Valoarea maximă a cod_furn din FACTURI

Studiu individual

APLICAŢIA 7: Utilizarea funcţiilor: AVG; MIN;


MAX; SUM; COUNT

APLICAŢIA 7

1. Realizaţi tabela FACTURI cu structura tabelei FACTURI din


ANEXA 1.
2. Introduceţi în tabela FACTURI următoarele date:
54 Suport pentru laborator

3. Care este media valorii facturilor?


4. Care este valoarea cea mai mare a unei facturi?
5. Care este valoarea cea mai mică a unei facturi?
6. Calculaţi valoarea medie a valorii facturilor dar nu cu AVG.
7. Câte facturi avem în tabelă?
8. Cate facturi avem în tabelă cu o valoare mai mare de 5000?
9. Câte facturi avem în tabelă cu o valoare între 4000 şi 30000?
(prin două metode)
10. Care este valoare medie a facturilor cu nr. 3525 şi 3522?
Limbaje de programare şi baze de date 55

Opţiunea ORDER BY

Principalele obiective ale capitolului sunt:

Ordonarea datelor unei tabele după unul sau mai


multe atribute

Una dintre caracteristicile modelului relaţional este că nici


ordinea atributelor, nici ordinea liniilor în relaţii nu reprezintă
importanţă din punctul de vedere al conţinutului informaţional.
Însă în practică forma de prezentare a rezultatelor interogării
est importantă. Spre exemplu o listă a localităţilor dintr-o tabelă este
mai uşor citită în ordine alfabetică.

De exemplu dacă dorim pentru tabela facturi să afişăm toate


datele ordonate după câmpul cod_furn vom avea

select * from facturi order by cod_furn


56 Suport pentru laborator

Datele obţinute în urma ordonării după câmpul cod_furn

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


descrescător (DESC). În plus se pot specifica mai multe coloane
care să servească drept criterii suplimentare de ordonare. Astfel, la
valori egale ale primului atribut, intră în acţiune criteriul de "balotaj",
care este al doilea atribut, etc.

De exemplu dacă dorim să ordonăm datele din facturi întâi


după cod_furn şi apoi după valoare (după acest criteriu
descrescător) vom avea:

select * from facturi order by cod_furn, valoare desc

Obţinerea datelor ordonate după cod_furn şi apoi


descrescător după valoare

Intrebări:

1. Care este diferenţa între ORDER şi SORT?


2. După câte câmpuri putem ordona şi cum?
Limbaje de programare şi baze de date 57

Studiu individual

APLICAŢIA 8: Ordonarea rezultatelor unei


interogări.

APLICAŢIA 8

1. Realizaţi tabela MF după structura tabelei MF din ANEXA 1.


2. Introduceti următoarele date:

3. Care sunt datele din tabela MF, ordonate alfabetic după


denumire?
4. Care sunt datele din tabela MF, ordonate alfabetic după denumire
şi apoi după valoare?
5. Care este amortizarea lunară liniară pentru fiecare mijloc fix,
datele fiind ordonate după denumirea mijlocului fix?
6. Afişaţi denimirea mijloacelor fixe, ordonată alfabetic pentru
mijloacele fixe cu o valoare mai mare de 32000 inclusiv.
7. Afişaţi alfabetic codurile furnizor - o singură dată.
8. Care este valoarea cea mai mare unui mijloc fix?
9. Care este valoare medie a amortizării lunare a mijloacelor fixe?
10. Câte mijloace fixe avem?
58 Suport pentru laborator

OPERATORII BETWEEN, LIKE ŞI IN

Principalele obiective ale capitolului sunt:

Utilizarea operatorilor
BETWEEN
LIKE
IN

Pentru formularea predicatului de selecţie, SQL permite


utilizarea, pe lângă >,<, >=,<=,= şi a altor operatori, dintre care ve
vom opri la BETWEEN (cuprins între), LIKE (ca şi), IN (în), la care
se adaugă IS NULL.
Operatorul BETWEEN este util pentru definirea intervalelor de
valori.

De exemplu dacă dorim să afişăm doar facturile care au valori


între 4000 şi 8000 vom avea:

select * from facturi where valoare between 4000 and 8000


Limbaje de programare şi baze de date 59

Date afişate utilizând condiţia BETWEEN

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

select * from facturi where valoare >= 4000 and valoare <=8000

Date afişate utilizând condiţia dublă

Operatorul LIKE permite compararea unui atribut (expresii) cu


un literal utilizând o "mască" construită cu ajutorul specificatorilor
multiplii % şi _ . Simbolurile procent şi underscore sunt denumite
jokeri. Procentul substituie un şir de lungime variabilă, 0-n caractere,
în timp ce underscore substituie un singur caracter.

Pentru exemplificare mai introducem două facturi cu


următoarele date:

Introducerea suplimentară a 2 facturi

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


căror cod_client începe cu litera "c" vom avea:

select * from facturi where cod_furn like "c%"


60 Suport pentru laborator

Furnizorii a căror cod_furn începe cu litera "c"

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


căror cod_client începe cu litera "m" vom avea:

select * from facturi where cod_furn like "m%"

Furnizorii a căror cod_furn începe cu litera "m"

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


căror cod_client are două caractere şi al doilea caracter este 5 vom
avea:

select * from facturi where cod_furn like "_5"

Furnizorii a căror cod_furn are două caractere


şi al doilea caracter este 5

Atunci când se testează dacă valoarea unui atribut este


încadrabilă într-o listă de valori dată, în locul folosirii abundente a
operatorului OR este mai elegant să se apeleze la operatorul IN.

De exemplu dacă dorim să afişăm facturile furnizorilor care au


cod_furn c1, c3 şi c4 avem:

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


Limbaje de programare şi baze de date 61

Facturile furnizorilor care au cod_furn c1, c3 şi c4

Sau de exemplu dacă dorim să selectăm facturile care au


valoare de 500, 600, 5000 vom avea:

select * from facturi where valoare in (500, 600, 5000)

Facturile care au valoare de 500, 600, 5000

Intrebări:

1. Care este diferenţa între operatorii


BETWEEN şi IN?
2. Cu ce poate fi substituit operatorul
BETWEEN?

Studiu individual

APLCAŢIA 9: Utilizarea operatorilor BETWEEN;


LIKE şi IN în calcularea unor date pe baza
tabelei ANGAJATI.

APLICAŢIA 9

1. Realizaţi tabela SALARIATI pe baza structurii tabelei ANGAJATI


din ANEXA 1.
62 Suport pentru laborator

2. În tabelă introduceţi următoarele date:

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


4. Care sunt angajaţii care au salariu 600, 1000, 750, sau 300?
5. Câţi angajaţi avem?
6. Care este salariul mediu?
7. Care este numele salariatului cu salariul cel mai mare?
8. Care sunt angajaţii a căror nume începe cu litera M sau I?
9. Câţi angajaţi au prenumele din trei litere?
10. Care sunt salariaţii care nu au prenumele ION sau IOANA?
Limbaje de programare şi baze de date 63

REUNIUNE, PRODUS CARTEZIAN

Principalele obiective ale capitolului sunt:

Prezentarea operatorului UNION


Realizarea produsului cartezian

Primii trei operatori asamblişti prezintă operatori SQL dedicaţi:


UNION, INTERSECT, MINUS (EXTRACT), în timp ce produsul
cartezian se calculează automat prin simpla enumerare a celor fouă
tabele din clauza FROM.

La reuniunea a două tabele, SQL elimină automat liniile


identice din rezultat. Dacă se doreşte prelucrarea tuturor liniilor celor
două relaţii şi implicit apariţia de linii duplicate, se foloseşte caluza
ALL (UNION ALL).

De exemplu, după aceeaşi strctură a tabelei FURNIZORI


creăm tabela FURNIZORI2.
Tabela FURNIZORI2 conţine următoarele date:
64 Suport pentru laborator

Datele tabelei FURNIZORI2

Datele tabelei FURNIZORI

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


tabelele FURNIZORI şi FURNIZORI2 avem:

select * from furnizori union select * from furnizori2


Limbaje de programare şi baze de date 65

Toate datele (utilizând reuniunea) din tabelele FURNIZORI şi


FURNIZORI2

SQL nu pune la dispoziţie vreun operator special dedicat


produsului cartezian.
Produsul cartezian se realizează prein simpla enumerare a
tabebelor în clauza FROM.

De exemplu dacă dorim să realizăm produsul cartezian între


tabelele FACTURI şi FURNIZORI avem:

select * from facturi, furnizori


66 Suport pentru laborator

Produsul cartezian al tabelelor FACTURI şi FURNIZORI

Intrebări:

1. Ce reprezintă operatorul UNION?


2. Cum se realizează produsul cartezian?

Studiu individual

APLICAŢIA 10: Evidenţa mijloacelor fixe ale


unei întreprinderi

APLICAŢIA 10

1. Realizaţi tabela MF1 şi MF2 după structura tabelei MF din


ANEXA 1.
Limbaje de programare şi baze de date 67

2. Introduceti următoarele date:

Datele tabelei MF1

Datele tabelei MF2

3. Care sunt datele din tabela MF1, ordonate alfabetic după


denumire?
4. Care sunt datele din tabela MF2, ordonate alfabetic după
denumire şi apoi după valoare?
5. Afişaţi datele celor două tabele într-un query
6. Care sunt mijloacele fixe ce se găsesc în MF1 şi nu se găsesc în
MF2?
7. Care sunt mijloacele fixe ce se găsesc şi în MF1 şi în MF2?
8. Care este valoarea medie a mijloacelor fixe din MF1?
9. Care este valoarea medie a mijloacelor fixe din MF2 a căror nume
începe cu litera C?
68 Suport pentru laborator

10. Care sunt mijloacele fixe din tabela MF2 furnizate de furnizorii cu
codurile: c1, c2, c4, c5,c8?
Limbaje de programare şi baze de date 69

THETA ŞI ECHI-JONCŢIUNEA

Principalele obiective ale capitolului sunt:

Realizarea unei legături între două sau mai multe


tabele
Utilizarea condiţiilor în echi-joncţiune

SQL nu prezintă clauze sau operatori speciali pentru joncţiune,


joncţiunea fiind o combinaţie între produs cartezian şi selecţie.
Deci pentru theta-joncţiunea dintre două relaţii R1 şi R2 avem:

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

unde:

R1 R2
A B C C D E
20 XYZ 30 25 XYZ 30
30 XXZ 20 40 YYX 25
40 YYX 25 30 XXZ 40

iar pentru echi-joncţiune avem:


70 Suport pentru laborator

select * from R1, R2 where R1.A=R2.E

Varianta cu INNER JOIN (joncţiune internă) este:

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

respectiv

select * from R1 inner join R2 on R1.A=R2.E

Pentru următorul exemplu utilizăm următoarele tabele:


FURNIZORI, FACTURI cu următoarele date:

Se cere să de afişeze pentru fiecare factură numele


furnizorului.
Limbaje de programare şi baze de date 71

select facturi.*, furnizori.nume_furn from facturi, furnizori where


facturi.cod_furn=furnizori.cod_furn

Numele furnizorului pentru fiecare factură

Acelaşi rezultat se poate obţine utilizând INNER JOIN:

select facturi.*, furnizori.nume_furn from facturi inner join furnizori


ON facturi.cod_furn=furnizori.cod_furn

Numele furnizorului pentru fiecare factură

Dacă dorim să afişăm numele furnizorului pentru fiecare


factură numai pentru furnizorul cu cod_furn "c1" vom avea:

select facturi.*, furnizori.nume_furn from facturi, furnizori where


facturi.cod_furn=furnizori.cod_furn and facturi.cod_furn="c1"
72 Suport pentru laborator

Numele furnizorului pentru fiecare factură


numai pentru furnizorul cu cod_furn "c1"

Intrebări:

1. De ce două tabele sunt legate logic prin


valori?
2. Care este condiţia necesară pentru echi-
joncţiune?

Studiu individual

APLICAŢIA 11: Evidenţa salariaţilor dintr-o firmă

APLICAŢIA 11

1. Să se realizeze tabelele ANGAJATI şi DEPARTAMENTE după


structura tabelelor ANGAJATI şi DEPARTAMENTE din ANEXA 1
2. Introduceţi în tabele următoarele date:
Limbaje de programare şi baze de date 73

3. Afişaţi şeful pentru fiecare angajat.


4. Care sunt angajaţii care lucrează în Braşov?
5. Câţi angajaţi lucrează în Bucureşti?
6. Care este numele angajatului cu salariul maxim?
7. Care este fondul de salarii pentru fiecare cod_dep?
8. Care sunt angajatii angajaţi dupa 01/01/1980?
9. Care sunt angajaţii care lucrează la departamentul marketing?
10. Câţi subalterni are Vlad?
11. Care este salariul mediu pentru departamentul management?
12. Care sunt angajaţii a căror şef începe cu litera "A"?
13. Care sunt angajaţii care lucrează în Braşov sau Bucureşti?
74 Suport pentru laborator

GRUPAREA TUPLURILOR: GROUP BY ŞI


HAVING

Principalele obiective ale capitolului sunt:

Utilizarea grupurilor
Utilizarea condiţiilor pentru grupuri

Clauza GROUP BY formează grupe (grupuri) de tupluri ale


unei relaţii, pe baza valorilor comune ale unui atribut. În frazele
SELECT formulate până în acest paragraf, prin intermediul WHERE
au fost selectate tupluri ale tabelei. Prin asocierea unei clauze
HAVING la GROUP BY este posibilă selectare anumitor grupuri de
tupluri ce îndeplinesc un criteriu, valabil numai la nivel de grup (nu şi
la nivel de linie).
Clauza unei fraze SELECT ce conţine această clauză se
obţine prin regruparea tuturor liniilor din tabelele eumerate în FROM,
extrăgându-se câte o apariţie pentru fiecare valoare distinctă a
coloanei/grupului de coloane.

Formatul general este:


Limbaje de programare şi baze de date 75

select coloană1, coloană2,...,coloană m from tabelă group by


coloană_de_regrupare

De exemplu dacă dorim să vedem care este valoarea totală a


facturilor pentru fiecare cod_furn vom avea:

select cod_furn, sum(valoare) from facturi group by cod_furn

Valoarea totală a facturilor pentru fiecare cod_furn

Cea mai simplă definiţie a clauzei HAVING este: clauza


HAVING este WHERE-ul ce operează la nivel de grupuri. Dacă
WHERE acţionează la nivel de tuplu, selectând acele linii care
îndeplinesc o condiţie specificată, HAVING permite specificarea
unor condiţii de selecţie care se aplică rupurilor de linii create prin
GROUP BY.
Din rezultat sunt eliminate toate grupurile care nu satisfac
condiţia specificată.

De exemplu dacă dorim să vedem care este valoarea totală a


facturilor pentru cod_furn egal cu "c1" vom avea:

select cod_furn, sum(valoare) from facturi group by cod_furn having


cod_furn="c1"

Valoarea totală a facturilor pentru


cod_furn egal cu "c1"
76 Suport pentru laborator

Intrebări:

Când se utilizează GROUP BY?


Care este definiţia condiţiei HAVING?

Studiu individual

APLICAŢIA 12: Situaţii de grup la nivelul


salariaţilor

APLICAŢIA 12

1. Să se realizeze tabelele ANGAJATI şi DEPARTAMENTE după


structura tabelelor ANGAJATI şi DEPARTAMENTE din ANEXA 1
2. Introduceţi în tabele următoarele date:
Limbaje de programare şi baze de date 77

3. Afişaţi şeful pentru fiecare angajat.


4. Care este salariul total pentru fiecare departament?
5. Care este salariul total pentru departamentul MANAGEMENT?
6. Care este suma totală a salariilor din departamentele
management şi contabilitate?
7. Care este numărul de salariaţi din fiecare departament?
8. Care este departamentul cu angajaţii cei mai mulţi?
9. Care este şeful departamentului cu cei mai mulţi angajaţi?
10. Câţi angajaţi are Vlad?
78 Suport pentru laborator

FUNCŢII DE CALCUL ÎN VISUAL FOX PRO

Principalele obiective ale capitolului sunt:

Utilizarea funcţiilor de calcul în Visual Fox Pro

Visual Fox Pro permite utilizarea unor instrucţiuni specifice,


executate în fereastra de comenzi, pentru calcule statistice, dar şi
funcţii statistice şi financiare.

Instrucţiunile cel mai des utilizate pentru calcule statistice sunt:

average <denumire câmp> <domeniul înregistrărilor> to <denumire


variabila>
Instrucţiunea furnizează media aritmetică a valorilor numerice din
câmpul specificat.

count <domeniul înregistrărilor> to <denumire variabila>


Instrucţiunea furnizează numărul de înregistrări din tabelă care
respectă condiţiile impuse în domeniul înregistrărilor.
Limbaje de programare şi baze de date 79

sum <denumire câmp> <domeniul înregistrărilor> to <denumire


variabilă>
Instrucţiunea furnizează suma (pe coloană) valorilor din câmpul
specificat.

Unde: denumire câmp reprezintă câmpul pe baza valorilor căruia se


va realiza suma;
domeniul înregistrărilor reprezintă de obicei o condiţie de
filtrare a valorilor care intră în sumă;
denumire variabilă reprezintă o variabilă nouă în care va fi
depozitat rezultatul însumării valorilor.

Pentru afişarea rezultatelor acestor operaţii se srie în fereastra de


comenzi:
?[mesaj], <denumire variabilă>

Exemple de instrucţiuni pentru calcule statistice

Principalele funcţii statistice: AVG( ), COUNT( ), SUM( ) având


efecte similare cu instrucţiunile menţionate mai sus, se utilizează în
cadrul unor instrucţiuni cum ar fi CALCULATE sau SELECT.

Funcţiile financiare cel mai des utilizate sunt:


• PAYMENT (valoare împrumut, rata dobânzii, perioada) –
determină rata periodică – de regulă lunară – care trebuie
80 Suport pentru laborator

achitată pentru a stinge o datorie, un împrumut într-o


perioadă de timp dată, la o anumită rată a dobânzii.

• FV (rata lunară, rata dobânzii, număr de perioade) –


determină valoarea actualizată a unei investiţii cu plăţi
periodice egale, pentru un număr cunoscut de perioade
egale de timp, la o anumită valoare a ratei dobânzii.

• PV (rata lunară, rata dobânzii, număr de perioade) –


determină valoarea prezentă a unei investiţii realizate în
viitor, în condiţiile achitării unor plăţi periodice constante, pe
o anumită perioadă, la o rată a dobânzii constantă.

Observaţie: rata dobânzii se raportează la 12 în toate cele trei


cazuri, caz în care numărul de perioade reprezintă numărul de luni.
Aceste funcţii se utilizează în cadrul unor comenzi de tip
browse. În fereastra de comenzi se va scrie:
browse fields <denumire câmp1>, <denumire câmp2>,...,
<denumire variabilă>=<denumire funcţie financiară>(parametri
corespunzători)
Denumirile câmpurilor afişate prin comanda browse, strâns
legate de parametrii funcţiei, se utilizează pentru a oferi o imagine
completă asupra situaţiei analizate, alternativ existând posibilitatea
afişării doar a rezultatului obnţinut prin utilizarea funcţiei financiare.

Studiu individual

Aplicaţie 13: Utilizare funcţii statistice şi


financiare.

APLICAŢIA 13

Să se construiască un nou proiect. Să se construiască o tabelă


având următoarea structură:
Cod_firma C 4
Credit N 20
Rata N 20
Rata_dob_c N 6 ;2
Limbaje de programare şi baze de date 81

Rata_dob_d N 6 ;2
Perioada N 3

şi cu următorul conţinut :

Cod_firma Credit Rata Rata_dob_c Rata_dob_d Perioada


AMP 10000 100 0.2 0.1 15
COR 15000 145 0.21 0.11 20
DAV 12000 250 0.23 0.12 36
ERG 45000 500 0.22 0.1 48
HTR 21500 350 0.21 0.14 18
COM 50000 220 0.23 0.11 15
SEP 35000 750 0.23 0.13 24
MAN 15500 600 0.21 0.1 12
RAR 75000 840 0.2 0.12 72

a) Să se determine rata periodică, lunară, care trebuie plătită pentru


creditul contractat, de către fiecare societate comercială, utilizând
funcţia PAYMENT.
b) Valorile înscrise în câmpul rata, reprezintă sume lunare egale
care vor fi depuse de fiecare firmă, la începutul fiecărei luni, în
conturi de depozit. Care este valoarea viitoare a sumei obţinute in
cursul ultimei luni în care firmele vor depune bani în cont? (Utilizaţi
funcţia FV)
c) Câte firme au contactat credite cu o valoare peste 25000 lei?
d) Care este suma totală a creditelor acordate de bănci tuturor
firmelor?
e) Care este media sumelor depuse lunar de firmele al căror cod
începe cu litera “C”?
82 Suport pentru laborator

Bibliografie:

1. Marin Fotache, SQL - Dialecte DB2, Oracle, Visual FoxPro,


Editura Polirom, 2001, Bucureşti

2. Mihaela Muntean, Dezvoltarea aplicaţiilor cu baze de date în


Visual FoxPro, Editura All, 2001, Bucureşti

3. Manualul de utilizare - Visual FoxPro 8.0

4. Grupul BDASEIG, Baze de date. Fundamente teoretice şi


practice, Infomega, 2002

5. Manole Velicanu, Constanţa Bodea, Ion Lungu, Cristina Ioniţă,


Georgeta Bădescu - Sisteme de Gestiune a Bazelor de Date,
Petrion
Limbaje de programare şi baze de date 83

Anexa 1
Tabele utilizate

unde: nr - număr; sal_brut - salariu brut; cod_dep - cod departament

unde: cod_dep - cod departament; den-denumire

unde: nr_factură-număr factură; data_fact - data facturii


84 Suport pentru laborator

unde: cod_furn - cod furnizor; nume_furn - nume furnizor

unde: cod_mf - codul mijlocului fix, per_amort - perioada de


amortizare, cod_furn - codul furnizorului