RECAPITULARE1

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

description

c

Transcript of RECAPITULARE1

  • RECAPITULARE

    1- Cerinta I: Tabele/diagrame2 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 DELETEASIF 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 REZOLVARECREATE FUNCTION Cerinta4(@datac as datetime, @Valoare as money)RETURNS MONEYASBEGINRETURN CASE WHEN YEAR(@DATAC)= 2007 AND @VALOARE >=60000 THEN 1 WHEN YEAR(@DATAC)= 2007 AND @VALOARE
  • 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 REZOLVARECREATE FUNCTION Cerinta4(@datac as datetime, @Valoare as money)RETURNS MONEYASBEGINRETURN CASE WHEN YEAR(@DATAC)= 2007 AND @VALOARE >=60000 THEN 1 WHEN YEAR(@DATAC)= 2007 AND @VALOARE
  • 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) )ASBEGIN INSERT @Tabel SELECT NrContract, NumeFirma FROM CLIENTI INNER JOIN CONTRACTE ON CLIENTI.CodClient=CONTRACTE.CodClient WHERE YEAR(DataContract)= @an RETURNEND

    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 moneyASSELECT NUMEFIRMA, SUM(VALOARE) AS TOTAL, RANK() OVER ( ORDER BY SUM(VALOARE) DESC)FROM CLIENTI INNER JOIN CONTRACTE ON CLIENTI.CODCLIENT= CONTRACTE.CODCLIENTGROUP BY NUMEFIRMAHAVING SUM(VALOARE)>@SUMA

    Exemplu de utilizare:EXEC Clasament 6000

    *********