BTS-DSI Correction TP3 SGBDR lycée lissane eddine ibn el khatib laayoune use master; CREATE DATABASE BD_Recettes ON ( NAME = 'BD_Recettes_Data', FILENAME = 'F:\Documents and Settings\Administrateur\Bureau\2014\bts2\sql\tds sqlserver\sqltd3\bd_recettes_data.mdf', SIZE = 3MB, MAXSIZE = 10MB, FILEGROWTH = 20%) LOG ON ( NAME = 'BD_Recettes_log', FILENAME = 'F:\Documents and Settings\Administrateur\Bureau\2014\bts2\sql\tds sqlserver\sqltd3\bd_recettes_log.ldf', SIZE = 1MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10%); CREATE TABLE Fournisseur(NumFou int, Constraint pk_numfou primary key(numfou), RSFou varchar(50), AdrFou varchar(150)) CREATE TABLE Recettes (NumRec int, Constraint pk_numrec primary key(numrec), NomRec varchar(50), MethodePreparation varchar(50), TempsPreparation int) CREATE TABLE Ingrédients (NumIng int primary key, NomIng varchar(50), PUIng money, UniteMesureIng decimal(12,2), NumFou int, QteEnStock int, Constraint fk_numfou foreign key(numfou) references Fournisseur( NumFou)) CREATE TABLE Composition_Recette (NumRec int, NumIng int, QteUtilisee int Constraint pk_numrec_numing primary key(numrec,numing), Constraint fk_numrec foreign key(numrec) references Recettes( NumRec), Constraint fk_numing foreign key(numing) references Ingrédients( NumIng)) Correction TP3 V1 SGBDR 1 / 5
insert into Fournisseur values(101,'rs1', 'fes') insert into Fournisseur values(102,'rs2', 'rabat') insert into Recettes values(1,'rec C ','C',70) insert into Recettes values(2,'rec A', 'A', 100) insert into Recettes values(3,'rec B','B',15) insert into Recettes values(4,'rec D','D',34) insert into Ingrédients values (10,'ING1',79.02, 80.50,101,20) insert into Ingrédients values (11,'ING2',50.73, 54.50,101,90) insert into Ingrédients values (12,'ING3',66.52, 80.00,102,10) insert into Ingrédients values (13,'ING4',56.45, 70.00,102,100) insert into Composition_Recette values(1,10,7) insert into Composition_Recette values(1,11,4) insert into Composition_Recette values(1,12,2) insert into Composition_Recette values(1,13,5) insert into Composition_Recette values(2,11,2) insert into Composition_Recette values(2,12,3) insert into Composition_Recette values(3,10,12) insert into Composition_Recette values(3,11,7) insert into Composition_Recette values(3,12,12) insert into Composition_Recette values(3,13,20) ------------------------------------------------------------- --PS1 Procedures stockées Qui affiche la liste des ingrédients avec --pour chaque ingrédient le numéro, le nom et la raison sociale du fournisseur ------------------------------------------------------------- create procedure PS1 as select NumIng, NomIng,RSFou from Ingrédients as ing,fournisseur as Fou where ing.numfou = Fou.NumFou exec PS1 --PS2 Qui affiche pour chaque recette le nombre d'ingrédients et le prix de reviens create procedure PS2 as select NumRec, count(cr.numing) as 'le nombre d''ingrédients',sum(puing*qteutilisee) as 'le prix de reviens' from Composition_Recette as CR,Ingrédients as I group by NumRec exec PS2 --PS3 Qui affiche la liste des recettes qui se composent de plus de 3 ingrédients --avec pour chaque recette le numéro et le nom. create procedure PS3 as select CR.NumRec,NomRec from Composition_Recette as CR,Recettes as R where CR.NumRec=R.NumRec group by CR.NumRec,NomRec having count(numing) > 3 exec PS3 Correction TP3 V1 SGBDR 2 / 5
--PS 4. Qui reçoit un numéro de recette et qui retourne son nom create procedure PS4 @num int, @nom varchar(12)output as set @nom=(select NomRec from Recettes where NumRec=@num) declare @n varchar(20) exec PS4 2,@n output print 'le nom de recette : ' + @n --PS 5. Qui reçoit un numéro de recette. --Si cette recette a au moins un ingrédient, PS5 retourne --l'ingrédient qui a le montant le plus bas -- sinon elle retourne "Aucun ingrédient associé" create procedure PS5 @num int,@numi int output as if exists(select * from Composition_Recette where NumRec=@num) set @numi=(select CR.NumIng from Composition_Recette as CR, Ingrédients as I and NumRec=@num and PUIng *QteUtilisee = (select min(puing*qteutilisee) from Composition_Recette as CR, Ingrédients as I and NumRec=@num)) print 'Aucun ingrédient associé' declare @n int exec PS5 1, @n output print 'le num d''ingrédient qui a le montant le plus bas : '+convert(varchar(21),@n) --PS 6 Qui reçoit un numéro de recette et qui affiche la liste des ingrédients correspondant. -- à cette recette avec pour chaque ingrédient le nom, la quantité utilisée et le montant. create procedure PS6 @num int as declare @nomi varchar(23),@q int,@montant decimal(12,2) declare ligne cursor for select noming, QteUtilisee,PUIng*QteUtilisee as montant from Composition_Recette as CR,Ingrédients as I and NumRec=@num open ligne fetch next from ligne into @nomi,@q,@montant while @@fetch_status=0 print 'le nom : '+ @nomi+' la quantité : '+convert(varchar(20),@q)+ ' le montant : '+convert(varchar(20),@montant) ; fetch next from ligne into @nomi,@q,@montant close ligne deallocate ligne Correction TP3 V1 SGBDR 3 / 5
exec PS6 1 --PS 7 Qui reçoit un numéro de recette et qui affiche ps1 ps2 PS3 create procedure PS7 @num int as declare @nom varchar(21) exec PS4 @num,@nom output select 'le nom de recette : ', @nom exec PS6 @num declare @n int exec PS5 @num, @n output select 'le num d''ingrédient qui a le montant le plus bas : ',@n exec PS7 1 --PS 8. Qui reçoit un numéro de fournisseur vérifie si ce fournisseur existe. --Si ce n'est pas le cas afficher le message 'Aucun fournisseur ne porte ce numéro' Sinon vérifier, --s'il existe des ingrédients fournis par ce fournisseur si c'est le cas afficher la liste des ingrédients --associées (numéro et nom) Sinon afficher un message 'Ce fournisseur n'a aucun ingrédient associé. --Il sera supprimé' et supprimer ce fournisseur create procedure PS8 @num int as if not exists(select * from Fournisseur where NumFou=@num) select 'Aucun fournisseur ne porte ce numéro' if exists(select * from Ingrédients where NumFou=@num ) select NumIng,NomIng from Ingrédients where NumFou=@num select 'Ce fournisseur n''a aucun ingrédient associé' delete from fournisseur where NumFou=@num exec PS8 103 --PS 9. Qui affiche pour chaque recette : --Un message sous la forme : "Recette : (Nom de la recette), temps de préparation : (Temps) --La liste des ingrédients avec pour chaque ingrédient le nom et la quantité --Un message sous la forme : Sa méthode de préparation est : (Méthode) --Si le prix de reviens pour la recette est inférieur à 50 Dh afficher le message 'Prix intéressant' Correction TP3 V1 SGBDR 4 / 5
create procedure PS9 as declare @NomR varchar(23),@temps int,@methode varchar(23),@num int,@prixreviens decimal(12,2) declare ligne_rec cursor for select NumRec,NomRec,MethodePreparation,tempsPreparation from Recettes open ligne_rec fetch next from ligne_rec into @num,@nomr,@methode,@temps while @@fetch_status=0 print 'Recette : ('+@NomR+'), temps de préparation : ('+convert(varchar(20),@temps)+')' exec PS6 @num print 'Sa méthode de préparation est : '+@methode; set @prixreviens =(select sum(puing*qteutilisee) as 'prixdereviens' from Composition_Recette as CR,Ingrédients as I and NumRec=@num) if(@prixreviens>50) print 'Prix intéressant' fetch next from ligne_rec into @num,@nomr,@methode,@temps close ligne_rec deallocate ligne_rec exec PS9 Correction TP3 V1 SGBDR 5 / 5