Sunteți pe pagina 1din 9

RECAPITULARE

1- Cerinta I: Tabele/diagrame
2 Cerinta II: Triggers
3 Cerinta III : Views
4 Cerinta IV: Functii (scalar sau tabel)
5 Cerinta V : Proceduri stocate/Cursor

CERINTA I.
Se dau urmtoarele tabele dintr-o baz de date pentru evidena clienilor,
contractelor i ncasrilor la o firm.
Se cunoate c, pentru fiecare contract, se pot ntocmi unul sau mai multe
rapoarte privind situaia lucrrilor n care se precizeaz: NrRaport, DataRaport,
Observatii privind stadiul lucrrilor i suma solicitat.
Cerin: Adugati tabelul/tabelele necesare i modificai Diagrama de relaii.
Restricie: DataRaport trebuie s fie dup 1 ianuarie 2008.

REZOLVARE CERINTA 1

CERINTA II.
Realizai un trigger pe tabelul incasari, pentru operaia de tergere, pentru a nu se
putea terge incasarile ce provin din contracte finalizate in anul 2007.
REZOLVARE
CREATE TRIGGER Cerinta2 ON Incasari for DELETE
AS
IF EXISTS(SELECT NrContract FROM DELETED
WHERE NrCONTRACT IN (SELECT NrContract FROM CONTRACTE
WHERE YEAR(DataFinalizare)=2007))
BEGIN
RAISERROR ('Nu se poate sterge', 18,1)
ROLLBACK TRANSACTION
END

CERINTA III.
Realizai un View pentru a calcula totalul ncasrilor din anul 2007 pe fiecare
client. Pentru clienii la care totalul incasarilor depaeste 40.000 se va calcula
un BONUS de 2% din total incasari

Cerinta IV.
Realizai o funcie de tip scalar care va calcula pe fiecare contract un
coeficient de importana n funcie de valoarea contractului i de anul in
care a fost incheiat contractul
- pentru contractele din anul 2007 cu valoare peste 60.000 coeficient 1
- pentru contractele din anul 2007 cu valoare sub 60.000 coeficient 2
- pentru contractele de dinainte de 2007 coeficient 3
REZOLVARE
CREATE FUNCTION Cerinta4(@datac as datetime, @Valoare as money)
RETURNS MONEY
AS
BEGIN
RETURN
CASE
WHEN YEAR(@DATAC)= 2007 AND @VALOARE >=60000 THEN 1
WHEN YEAR(@DATAC)= 2007 AND @VALOARE <60000 THEN 2
ELSE 3
END
END
Exemplu de utilizare:
SELECT NrContract, DataContract, Valoare, dbo.Cerinta4(DataContract, Valoare)
FROM CONTRACTE

Cerinta IV.
Realizai o funcie de tip scalar care va calcula pe fiecare contract un
coeficient de importana n funcie de valoarea contractului i de anul in
care a fost incheiat contractul
- pentru contractele din anul 2007 cu valoare peste 60.000 coeficient 1
- pentru contractele din anul 2007 cu valoare sub 60.000 coeficient 2
- pentru contractele de dinainte de 2007 coeficient 3
REZOLVARE
CREATE FUNCTION Cerinta4(@datac as datetime, @Valoare as money)
RETURNS MONEY
AS
BEGIN
RETURN
CASE
WHEN YEAR(@DATAC)= 2007 AND @VALOARE >=60000 THEN 1
WHEN YEAR(@DATAC)= 2007 AND @VALOARE <60000 THEN 2
ELSE 3
END
END
Exemplu de utilizare:
SELECT NrContract, DataContract, Valoare, dbo.Cerinta4(DataContract, Valoare)
FROM CONTRACTE

Cerinta IV (exemplul 2).


Realizai o funcie de tip tabelar care sa returneze numerele de contracte i
numele clientilor pentru contractele dintr-un anumit an (Anul va fi specificat ca
argument al functiei)

REZOLVARE
CREATE FUNCTION ListaPeAn (@An as integer)
RETURNS @Tabel TABLE
(NrContract Integer, Client varchar(50) )
AS
BEGIN
INSERT @Tabel
SELECT NrContract, NumeFirma
FROM CLIENTI INNER JOIN CONTRACTE ON
CLIENTI.CodClient=CONTRACTE.CodClient
WHERE YEAR(DataContract)= @an
RETURN
END

Exemplu de utilizare:
SELECT * FROM ListaPeAn(2006)

Cerinta V. (exemplul 2)
Realizai o procedura stocat cu parametri pentru a realiza un clasament al
clientilor in functie de valoarea totala a contractelor. Se vor utiliza functiile
RANK sau ROW_NUMBER. Procedura va fi parametrizata pentru nu a afisa
decat clientii a caror valoare totala a contractelor depaseste o suma
specificata prin parametru.
REZOLVARE
CREATE PROC Clasament
@suma as money
AS
SELECT NUMEFIRMA, SUM(VALOARE) AS TOTAL,
RANK() OVER ( ORDER BY SUM(VALOARE) DESC)
FROM CLIENTI INNER JOIN CONTRACTE
ON CLIENTI.CODCLIENT= CONTRACTE.CODCLIENT
GROUP BY NUMEFIRMA
HAVING SUM(VALOARE)>@SUMA

Exemplu de utilizare:
EXEC Clasament 6000

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