NTIC DEV WWW.NTICRIAD.NET Exercices Procédures stockées 1 . Ecrire un programme qui calcule le montant d’une commande et affiche un message 'Commande Normale' ou 'Commande Spéciale' selon que le montant est inférieur ou supérieur à 100000 DH Declare @Montant decimal Set @Montant=(Select Commande C, Article C.NumCom=LC.NumCom C.NumCom=10) If @Montant is null Begin Print 'Cette Commande d''ingrédients' Return End if @Montant <=10000 Print 'Commande Normale' Else Print 'Commande Spéciale' Sum(PUArt*QteCommandee) from A, LigneCommande LC where and LC.NumArt=A.NumArt and n''existe pas ou elle n''a pas 2 . Ecrire un programme qui supprime l'article numéro 8 de la commande numéro 5 et met à jour le stock. Si après la suppression de cet article, la commande numéro 5 n'a plus d'articles associés, la supprimer. Declare @Qte decimal Set @Qte=(select QteCommandee from LigneCommande where NumCom=5 and NumArt=8) Delete from LigneCommande where NumCom=5 and NumArt=8 Update article set QteEnStock=QteEnStock+@Qte where NumArt=8 if not exists (select numcom from LigneCommande where NumCom=5) Delete from commande where NumCom=5 3 . Ecrire un programme qui affiche la liste des commandes et indique pour chaque commande dans une colonne Type s'il s'agit d'une commande normale (montant <=100000 DH) ou d'une commande spéciale (montant >= 100000 DH) Select C.NumCom, DatCom, Sum(PUArt*QteCommandee), 'Type'= Case NTIC DEV WWW.NTICRIAD.NET A supposer que toutes les commandes ont des montants différents.NTIC DEV WWW.NumCom. DatCom 4 .NTICRIAD.NumArt=A.NumCom. DatCom. LigneCommande LC Where C.NumCom. Ecrire un programme qui : Recherche le numéro de commande le plus élevé dans la table commande et l'incrémente de 1 Enregistre une commande avec ce numéro Pour chaque article dont la quantité en stock est inférieure ou égale au seuil minimum enregistre une ligne de commande avec le numéro calculé et une quantité commandée égale au triple du seuil minimum if exists(select NumArt from article where QteEnStock<=SeuilMinimum) Begin Declare @a int set @a=(select max(NumCom) from commande) + 1 insert into commande values(@a.NET . MontantCom) Create Table T1 (NumCom int. LigneCommande LC Where C. MontantCom decimal) Insert into T1 Select Top 5 C.NumArt=A. getdate()) insert into lignecommande Select @a.NTICRIAD. SeuilMinimum * 3 From article Where QteEnStock <=SeuilMinimum NTIC DEV WWW.NET When Sum(PUArt*QteCommandee) <=10000 then 'Commande Normale' Else 'Commande Spéciale' End From Commande C.NumCom=LC. DatCom Order by Mt Desc 5 . DatCom. Article A.NumArt Group by C. NumArt.NumArt Group by C.NumCom and LC. écrire un programme qui stocke dans une nouvelle table temporaire les 5 meilleures commandes (ayant le montant le plus élevé) classées par montant décroissant (la table à créer aura la structure suivante : NumCom. Article A.NumCom and LC. DatCom DateTime. Sum(PUArt*QteCommandee) as Mt From Commande C.NumCom=LC. NTICRIAD.NET .NET End Exercices Curseur 1. La liste des articles associés Le montant de cette commande NTIC DEV WWW.NTICRIAD. Ecrire un programme qui pour chaque commande : Affiche le numéro et la date de commande sous la forme : Commande N° : ……Effectuée le : ….NTIC DEV WWW. [email protected] Declare @a int. @c decimal Declare C1 Cursor for Select C.@a) + ' effectuée le : ' + convert(varchar. QteCommandee NTIC DEV WWW. PUArt.NumCom. Elle sera supprimée' Delete From Commande Where NumCom=@a End Else Begin Print 'Commande n° : ' + convert(varchar.NET .@c) Fetch Next from C1 into @a.NTIC DEV WWW.@b) Select Numart from LigneCommande where numcom=@a Print 'Son montant est : ' + convert(varchar. DesArt. Article A. @b DateTime. @a) Select A. Ecrire un programme qui pour chaque commande vérifie si cette commande a au moins un article.@c End Close C1 Deallocate C1 2. LigneCommande LC Where C.DatCom.NumArt group by C.@c While @@fetch_status =0 Begin Print 'Commande N° : ' + convert(varchar. Elle sera supprimée et supprime cette commande Declare @a int Declare Cur_Com Cursor for select NumCom from Commande open Cur_Com Fetch Next from Cur_Com into @a While @@fetch_status =0 Begin if not exists (Select NumArt from LigneCommande where NumCom=@a) Begin Print 'Aucun article pour la commande N° : ' + convert(varchar.NumArt=A.DatCom Open C1 Fetch Next from C1 into @a.NumCom.NTICRIAD.@b. Sum(PUArt*QteCommandee) From Commande C.NumArt.NTICRIAD.NumCom and LC. Si c'est le cas affiche son numéro et la liste de ses articles sinon affiche un message d'erreur 'Aucun article pour la commande …. @a) + '. Ecrire un trigger qui affiche l'ancien n° de tél ainsi que le nouveau lorsqu'un update de la colonne <tel> est effectué sur un tuple(enreg) de Employé.[archive] AFTER deLETE AS BEGIN if (select count(*) from deleted )>50 begin rollback print 'ne pas supprimer plus de 50 enreg' end END 2.NTIC DEV WWW. Create TRIGGER [dbo].@n2) end END 3. Ecrire un trigger qui empêche qu’on supprime plus de 50 n-uplets à la fois dans la table EMPLOYE.16.NET . Ecrire un trigger for ou after update sur la table Vente qui utilise la fonction update() et affiche à l'utilisateur le message suivant : "Attention : vous venez de modifier une valeur de clé étrangère pour la commande n° XXX" NTIC DEV [email protected] vous utilisez print pour afficher le message ou bien raiserror print 'l''ancienne valeur du tel est : ' + @n1+ ' la nouvelle valeur après modification est : '+@n2 -.NET From Article A.RAISERROR ('l''ancienne valeur du tel est %s et la nouvelle valeur est %s'.NumArt and NumCom=@a End Fetch Next from Cur_Com into @a End Close Cur_Com Deallocate Cur_Com Exercices trigger 1.NumArt=LC.NTICRIAD. Lignecommande LC Where A.NTICRIAD.1.[ex1] ON [dbo]. Create TRIGGER ex2 ON archive1 AFTER UPDATE AS BEGIN declare @n1 varchar(20) set @n1=(select tel from deleted) declare @n2 varchar(20) set @n2=(select tel from inserted) if update(nom) begin -. NTICRIAD. (select prenom from inserted)) END 5. Créer un trigger for insert. Create TRIGGER ex5 ON employe After insert.numstg = notation.(select nom from inserted).NET . notation where inserted. Écrire un trigger qui (quelle que soit la valeur donnée comme identifiant de l’employé) insérera le n° immédiatement supérieur au plus grand n° présent dans la table.numstg) Begin Print ‘Ce stagiaire possède des notes’ Else NTIC DEV WWW. Si c'est le cas empêcher la suppression Create trigger ex6 on stagiaire Instead of Delete As Begin If exists(select * from deleted .NET Create TRIGGER ex3 ON archive1 AFTER update AS BEGIN declare @n1 varchar(20) set @n1=(select Ncommande from deleted) IF (UPDATE(nclient)) BEGIN print 'Attention : vous venez de modifier le n°client de la commande N° '+ @n1 end END 4.nom.prenom) values(@n1+1. S'il n'est pas compris entre les valeurs limites pour la catégorie. update qui fait le contrôle de validité lorsque le niveau d'emploi (posEmploi) d'un employé est modifié ou inséré. trigger qui à la suppression d'un stagiaire vérifie s'il a été évalué et si des notes lui ont été attribuées.NTICRIAD. la transaction devra être annulée (rollback tran).NTIC DEV WWW.update AS BEGIN declare @n1 int set @n1=(select valmin from categorie where codecat in (select codecat from inserted)) declare @n2 int set @n2=(select valmax from categorie where codecat in (select codecat from inserted)) If exists(select * from employe where posemploi not between (@n1 and @n2)) Begin Print ‘la valeur posemploi doit être comprise entre ‘ + @n1 + ‘ et ‘ + @n2 Rollback end END 6. Create TRIGGER ex4 ON archive1 Instead of insert AS BEGIN declare @n1 varchar(20) set @n1=(select max(NPERSONNE) from archive1) insert into archive1(NPERSONNE. Le totalvente doit être égal au total des montants de chacune des lignes de la vente. ventelivraison vl where vl.NET .1) else begin raiserror('clients différents pour la même livraison'.update As Begin If exists(select * from inserted I.1) rollback end NTIC DEV WWW. détailvente where numvente = (select numvente from inserted Group by numvente) 8.NET delete from stagiaire where numstg in select numstg from deleted 7.commande C where I. Une livraison peut regrouper plusieurs commandes. Une livraison ne touche toujours qu'un seul Client.NTICRIAD. c'est-à-dire ne peut être liée à des Commandes de plusieurs Clients . update As Begin Update vente set totalvente= totalvente+(select sum (qtévendue * pu ) from produit.numlivraison and l. La dateLivraison ne peut précéder la dateCommande.UPDATE AS declare @cli varchar(10) declare @liv int set @cli=(select personne from vente where codevente in (select codevente from inserted)) set @liv=(select numlivraison from inserted) if @cli = all (select personne from vente where codevente in(select codevente from livraison l.NTIC DEV WWW.numlivraison=l. Supposons qu’on ait ajouté à la table vente une nouvelle colonne totalvente. Numcmd and C. Concevez un TRIGGER qui modifie directement le totalvente des ventes suite à la l’insertion ou la modification de la qté vendue d’une ligne vente.Datecommande > I.numlivraison=@liv)) raiserror('même client pour la même livraison'.16.datelivraison ) Begin Print ‘la date commande doit être inférieure à la date de livraison’ Rollback End End 9.NTICRIAD. Create Trigger ex7 on detailvente After Insert .Numcmd =C. Create TRIGGER ex9 ON [ventelivraison] AFTER INSERT.16. Create Trigger ex8 on livraison After Insert . NET Exercices Gestion Stagiaire Soit la base de données suivante : Créer les procédures stockées suivantes : P S 1 .NumFiliere and codSecteur=@CodSecteur group by NomModule Having count(F.Qui affiche les filières ayant plus de 10 modules au .NTIC DEV WWW. toutes les filières d'un secteur donné en paramètre CREATE PROCEDURE SP3 @CodSecteur varchar(10) AS Select NomModule from Module M. NomFiliere from filiere.NET .NTICRIAD.Programme P.NumFiliere=F.NTICRIAD.Numfiliere Group by Filiere.Nummodule=P.Qui affiche les numéros et les noms des stagiaires pour .numfiliere)=(select Count(numfiliere) from filiere where CodSecteur=@CodSecteur) NTIC DEV WWW. NomStagiaire From Stagiaire NumStagiaire not in (Select NumStagiaire from Notation. ) where P S 2 .NumFiliere. programme CREATE PROCEDURE SP2 AS Select Filiere.numFiliere=Programme.qui affiche les noms des modules qui sont étudiés dans . NomFiliere Having Count(NumModule)>=10 P S 3 . programme Where Filiere. Filiere F Where M.numModule and P.NumFiliere. lesquels on a pas encore saisi de note CREATE PROCEDURE SP1 AS Select NumStagiaire. @NomPreSta varchar(50). Stagiaire S where P..Filière : .NumFiliere=F..NumFiliere=S.NumFiliere=S.NumFiliere and NumStagiaire=@NumSta and NumModule not in (select NumModule from notation where NumStagiaire=@NumSta)) Begin Print 'En cours de traitement' select NumModule from Programme P. • Le nom.NumModule=Module..Coefficient Module. Note. Stagiaire S where P.NET ...NTIC DEV WWW.NumModule Module.NumFiliere and NumStagiaire=@NumSta and NumModule not in (select NumModule from notation where NumStagiaire=@NumSta) NTIC DEV WWW.Qui affiche pour chaque stagiaire : . des notes (numéro module. programme Where Notation. @NomPreSta.. NomStagiaire + ' ' + PrenomStagiaire. Filiere F where S.NumModule. @NomFil varchar(50) Declare C1 Cursor for Select NumStagiaire.NumFiliere Open C1 Fetch Next from C1 into @NumSta.Nummodule numStagiaire=@NumStagiaire from and and P S 5 . Notation.NET P S 4 ...Nummodule=programme. NomModule. note et coefficient) CREATE PROCEDURE SP4 @NumStagiaire int AS Select Module.Qui affiche pour un stagiaire donné en paramètre.. le prénom et la filière sous la forme : Nom et Prénom :. @NomFil while @@fetch_status=0 Begin Print 'Nom et Prénom : ' + @NomPreSta + ' Filière : ' + @NomFil if exists (select NumModule from Programme P.NTICRIAD. NomFiliere from Stagiaire S. • S'il existe des modules où le stagiaire n'a pas de notes attribuée afficher le message 'En cours de traitement' ainsi que la liste des modules où il n'a pas encore de notes' • S'il existe plus de deux modules où le stagiaire a obtenu une note <3 afficher 'Notes Eliminatoires' et afficher les modules concernés • Sinon afficher la liste des modules (Module + Coefficients+note) ainsi que la moyenne du stagiaire CREATE PROCEDURE SP5 AS Declare @NumSta int. nom du module. la liste ..NTICRIAD. @NomFil End Close C1 Deallocate C1 NTIC DEV WWW.NumFiliere and M.NumModule and P. Note from Module M. Stagiaire S where M.NET .NumModule=N. Programme P.NumModule=N.NumModule=N.NumStagiaire and S.NTICRIAD.NTICRIAD.NumStagiaire and S. Coefficient.NumModule and N.NumModule=P. Programme P.numStagiaire=@NumSta Fetch Next from C1 into @NumSta. @NomPreSta.numFiliere=S.NumModule and N.NumModule and numStagiaire=@NumSta and note <3 Return End Select NomModule.NTIC DEV WWW.NumStagiaire=S. Stagiaire S where M. Notation N. Notation N.NumModule and P.NumFiliere and M.numFiliere=S.numStagiaire=@NumSta Select Sum(Note*coefficient) / Sum(coefficient) from Module M.NET return end if (select count(NumModule) from notation where NumStagiaire = @NumSta and note<3) >2 Begin Print 'Notes Eliminatoires' Select NomModule from Module M. Notation N where M.NumStagiaire=S.NumModule=P.