jeudi 18 juillet 2013



Exercice1 :

Ecrire une page HTML et Javascript qui demande les noms et prénoms d'une personne, son numéro de sécurité sociale et qui affiche dans une boite d’alerte un message résumant l'état civil de cette personne. Par exemple


Permet d'obtenir le message suivant :

Votre programme Javascript devra permettre, au moment du click sur le bouton envoi, de vérifier que les 3 champs sont remplis, que le numéro de sécurité est composé de 13 caractères et que le premier est un 1 (pour Monsieur) ou un 2 (pour Madame). La nouvelle fenêtre ne s'affichera que si ces conditions sont vérifiées.

Remarque :
  • l'année de naissance est composée des caractères 2 et 3 du numéro de sécurité (34 dans l'exemple précédent).
  • le mot "né" est accordé en fonction du sexe de la personne. Ainsi on peut trouver Monsieur Dupont Jean est en 1934 ou Madame Dupont est née en 1934


Soit le schéma relationnel suivant, représentant une gestion des logements dans une agence
immobilière GestLog.
Personne (NumP, Nom, Prenom, Tel)
Commune (NomCom, NbreLog)
Type (TypeLog, ChargeFix)
Logement (NumLog, Adresse, Superficie, Loyer, TypeLog, NomCom)
Occupe (NumP, NumLog, DatD, DatF)
Indication : Les charges fixe sont par mois, les deux mois de datD et DatF sont inclut dans la
période d’occupation
1)Ecrire une procédure GestLogTable() qui crée les tables de la base de donnée GestLog.(1,5
pts)
2)Ecrire une procédure qui affiche la liste des logements libre et qui le seront dans le mois
prochain. ......................................................................................................................... (2 pts)
3)Ecrire une procédure MAJLoyer(pourcentage, somme OUTPUT) qui prend en paramètre un
pourcentage et somme paramètre de sortie, et qui augmente les loyers avec le pourcentage
et retourne la somme des augmentations. ...................................................................... (2 pts)
4)Ecrire une procédure qui affiche une table des Logements par Type selon le format :(2,5 pts)
Type : Appartement 500 DH
Num Logement Loyer Superficie Commune
1 4000 80 …
4 3500 70 …
Type : Studio 900 DH
Num Logement Loyer Superficie Commune
2 4000 45 …
5)Ecrire une fonction NbreMois(NumP) qui retourne le nombre de mois d’occupation d’une
personne donnée en paramètre (NumP). .......................................................................(1,5pts)
6)Ecrire une Fonction SomLoyer(NumP) qui retourne la somme du loyer que doit NumP – en
utilise la fonction précédente.......................................................................................... (2 pts)
7)Ecrire un trigger pour la suppression en cascade après la suppression de chaque de
Personne. ........................................................................................................................ (2 pts)
8)Ecrire un trigger qui met à jour NbreLog par commune................................................ (2 pts)
9)Ecrire un trigger qui contrôle que la datD soit inférieur à DatF (RAISERROR). ............ (2 pts)
10)Ecrire un trigger pour auditer la table Logement, ajouter une ligne dans la table
Audit(NumLog,Message)
« Modifier le 03/01/2011 10 :30 par Ali ».................................................................. (2,5 pts)


mercredi 17 juillet 2013

--1
create database transport
use transport
create table Voyage(code_v int identity primary key , dh_deppart_v datetime , dh_arrive_v datetime , place int , cpt_depart int , cpt_arrive int , mtr int foreign key references Personnel(mtr), code_car int foreign key references Autocar(code_cat), code_c int foreign key references Calendrier(code_c) )
create table Personnel(mtr int primary key , nom varchar(20) , prenom varchar(20) , tel int , passe varchar(20))
create table Autocar(code_cat int primary key , capacité int , date_achat date , consommation float , nom_m varchar(20))
create table Calendrier(code_c int primary key , jour_v date , heure_dep datetime , heure_arr datetime , code_ligne int)
create table Ligne(code_ligne int primary key , distance float , code_v_dep int foreign key references Ville(code_ville) , code_v_arr int foreign key references Ville(code_ville))
create table Ville(code_ville int primary key, nom_ville varchar(20))
create table Marque(Nom_marque varchar(20) primary key)


select * from autocar
insert into Voyage values('17/12/2001 17:00:00','17/12/2001 19:00:00',41,40000,40500,10,20,30)
insert into Calendrier values(30,'17/12/2001','17:00:00','19:00:00',59)
insert into Ligne values(59,500,7,8)
insert into Ligne values(65,500,7,8)
insert into Ville values(7,'casa')
insert into Ville values(8,'rabat')
insert into Marque values('volvo')
insert into Marque values('audi')
insert into Marque values('mercedes')
insert into Autocar values(20,41,'11/12/2000',7,'volvo')
insert into Autocar values(22,25,'11/12/2000',7,'audi')
insert into Personnel values(10,'ahmed','abdo',0522021254,555)

--2
alter table Calendrier
add constraint c check(jour_v like '01/%d/%d')

alter table Voyage
add constraint cc check(dh_deppart_v < dh_arrive_v)

alter table Autocar
add check(capacité >0)

--3
alter table Personnel
add NP as nom +''+ prenom

select * from Personnel

--4
create trigger t1 on Ligne
for insert
as
begin
begin tran
declare @code_v_dep int, @code_v_arr int
select @code_v_dep = @code_v_dep from inserted
select @code_v_arr = @code_v_arr from inserted
if(select COUNT(*) from Ligne where @code_v_dep = @code_v_dep and @code_v_arr = @code_v_arr)>1
begin
print('ligne éxiste dèja')
rollback transaction
end
else
commit tran
end

--1
create database Marocmec
use Marocmec

create table etat(idetat int primary key,libetat varchar(20))
insert into etat values(1,'x')
select * from rechange
create table appareil (idapp int primary key,decapp varchar(50),nserie int,idmod int foreign key references model(idmod),prixapp int ,idlot int foreign key references lot(idlot),idetat int foreign key references etat(idetat) )
insert into appareil values(1,'blabla',1,1,200,1,1)

create table  model(idmod int primary key , libmod varchar(20))
insert into model values(1,'mod1')

create table  lot(idlot int primary key,liblot varchar(20),dateach date,prixach int)
insert into lot values(1,'lot1','22/06/2012',200)

create table  rechange(idrech int primary key,idpie int foreign key references piece(idpie),idapp int foreign key references appareil(idapp),datenvrech date,datretrech date,montant int,decrech varchar(20))
insert into rechange values(1,1,1,'22/04/2010','30/06/2010',3000,'descrech')

create table  piece(idpie int primary key ,libpie varchar(20),idmod int foreign key references model(idmod),prixpie int,idlot int foreign key references lot(idlot))
insert into piece  values(1,'piece1',1,300,1)
--2
alter table rechange add constraint ct check (datretrech > datenvrech)
alter table rechange add constraint ct2 check (montant >=0)

--3
create proc p (@mod int)
as
select montant from rechange where idapp in (select idapp from appareil where idmod = @mod )
exec p 1
--4
alter trigger tr on rechange instead of insert
as begin
declare @x varchar(50) ,@l varchar(20),@p int,@idp int,@m int,@da date ,@dr date ,@idap int,@idre int,@pa int
select @x=decrech,@idp=idpie ,@m=montant ,@da=datenvrech,@dr=datretrech,@idap=idapp,@idre=idrech from inserted
select @l=libpie,@p=prixpie from piece where idpie = @idp
select @pa=prixapp from appareil where idapp = @idap
if(@m >= @pa)
begin
rollback
end
else if(@x = '')
begin

insert into rechange values (@idre,@idp,@idap,@da,@dr,@m,@l +''+ @p)
end
else insert into rechange values (@idre,@idp,@idap,@da,@dr,@m,@x)

end

 --5
alter function f (@idap int)
 returns int
 as begin
 declare @c int
 select @c= montant from rechange where idapp = @idap
 return @c
 end
 exec dbo.f 1

 --6
 select idapp,decapp,dbo.f(idapp) as Cout_de_reparation from appareil
 --ps liste
 create proc pslistpiece (@d1 date,@d2 date)
 as
 select * from rechange where datenvrech between   @d1 and @d2



mardi 16 juillet 2013


EFM SGBD 1
Au niveau national, la natation est un sport géré par la Fédération Marocaine de Natation, puis par des clubs au niveau des différentes villes du Royaume.
La fédération organise des entraînements de natation communs aux différents athlètes dans le but d’harmoniser les pratiques et de déceler les futurs talents. Ces entraînements communs nécessitent de disposer de créneaux horaires dans trois piscines différentes.
La fédération souhaite mettre en place une gestion informatisée afin de contrôler que chaque athlète suit bien son plan d'entraînement personnalisé. Pour chaque athlète, le plan d'entraînement proposé définit la distance (exprimée en mètres) à parcourir pour chaque entraînement.


Pour assurer cette gestion, le schéma relationnel suivant a été établi :


ATHLETE(#NumLicence, NomAthlete, PrenomAthlete, CategorieAthlete)


ENTRAINEMENT(#NumEntrainement, DateEntrainement, HeureDebut, HeureFin, NumPiscine#)


PLAN_ENTRAINEMENT(#NumEntrainement*, #NumLicence*, DistanceAParcourir, DistanceParcourue)


PISCINE(#NumPiscine, NomPiscine, AdressePiscine)

TRAVAIL À FAIRE



I. Création de la base de données

       1. Créer la base de données sous SQL SERVER
       2. Créer trois enregistrements par table

II. Contraintes

       1. Les valeurs permises pour le champs CategorieAthlete sont (Catégorie1,Catégorie2,catégorie3)
       2. La distance parcourue doit être positives et inférieure ou égale à la distance à parcourir

III. Requêtes

       1. Afficher la liste des athlètes triés par ordre décroissant des catégories et ordre croissant de leur
 numéro de licence.

       2. Afficher la liste de piscines triées par ordre croissant des noms, les noms doivent avoir le premier caractère en majuscule et les adresses des piscines en minuscule.


       3. Afficher les athlètes qui ont participés au plan d’entrainement numéro 20, (nom,prénom,distanceparcourue,observation), le champs observation permettant d

’afficher le mot débutant si la distance parcouru est inférieure à 2000 m sinon on affiche le mot expert. 

       4. Afficher les piscines (numéro, nom,adresse) qui seront disponible pour le mois janvier de l’année 2013.


       5. Créer une vue vue1 affichant le nombre d’athlète par catégorie.


       6. Créer une vue vue2 affichant le total des distances parcourue au niveau des différents entrainements pour chaque athlètes (numéro athlète, total distance parcourue)


       7. En utilisant la question N°6 afficher les athlètes dont la distance parcourue dans les différents entrainements est supérieur à 2000 m


       8. Afficher les entrainements dont leur distance à parcourir est la valeur maximale.


       9. Créer une vue vue3 permettant d’afficher la listes des entrainements suivis(numéro,date,heure début,heure fin,Nom piscine,Distance à parcourir, distance parcourue)pour chaque athlète.


       10. Afficher les athlètes qui ont participé à au moins 4 entrainements.


       11. Créer une vue vue4 affichant le nom de piscine le plus utilisé par les athlètes de la catégorie 1.



Télécharger le fichier complet par ici :




 II – SGBDR :

1)       ALTER TABLE PILOTE ADD Ville varchar(15)

2)      SELECT DISTINCT (NomPilote) FROM PILOTE P, AFFECTATION AF, AVION AV
WHERE P.IdPilote = AF.IdPilote
AND AF.NumAvion = AV. NumAvion
AND AV.TypeAvion = ‘A320’

3)      SELECT DISTINCT (NomPilote) FROM PILOTE P, AFFECTATION AF, AVION AV, AEROPORT AE
WHERE P.IdPilote = AF.IdPilote
AND AF.NumAvion = AV. NumAvion
AND AV.TypeAvion = ‘A320’
AND AV.BaseAeroport = AE.IdAeroport
AND AE.NomVilleDesservies = P.Ville

4)      SELECT ‘Ville’ = NomVilleDesservie, ‘Moyenne Capacité’ = AVG(Capacite), ‘Minimum’ = MIN(Capacite), ‘Maximum’ = MAX(Capacite)
FROM AVION AV, AEROPORT AE, TYPE T
WHERE AE.IdAeroport = AV.BaseAeroport
AND AV.TypeAvion = T.TypeAvion

GROUP BY NomVilleDesservie

5)      CREATE TRIGGER T1 ON VOL
FOR INSERT
AS
BEGIN
DECLARE @v_depart varchar(15)
DECLARE @v_arrivée varchar(15)
DECLARE @h_depart datetime
DECLARE @h_arrivée datetime
SELECT @v_depart=AeroportDepart, @v_arrivée=AeroportArrivée, @h_Depart=HeureDepart, @h_arrivée=HeureArrivée
FROM INSERTED
IF @v_depart = @v_arrivée OR @h_depart>@h_arrivée
BEGIN
RAISERROR(‘Insertion impossible !!’, 16, 1)
ROLLBACK
END
END 


    Télécharger la correction complète par ici : 
                 




Dossier 1 : UML

                   Question 1 :  diagramme des cas d’utilisation: 




 diagramme de séquence du cas d’utilisation « Publier contenu »:





                                     Question 3 : 
 diagramme de classes:

   



 Télécharger la correction complète par ici :
                     



Cas « GESTION DE COMMERCE »

Voici le modèle relationnel des données de la base de données Commerce pour enregistrer l’activité commerciale d’une entreprise.

Client (numcli, nom, cp, rue, ville)

Fournisseur (numfour, raisonsoc)

Produit (numprod, designation, prix, numfour#)

Commande (numcom, numcli#, numprod#, quantite, datec)

Travail à faire :
1) Créer la base de données SQL server et ajouter des d’enregistrement.
2) Développer les requêtes suivantes :
 Liste des clients qui commencent par le caractère a
 Listes des clients dont le 3ème caractère est un a et le 6ème caractère est c.
 Liste de tous les clients par ordre croissants des villes et décroissant des noms.
 Afficher le montant total de toutes les commandes
 Afficher la désignation du produit et la quantité commandée moyenne.
 Liste des produits n’ayant fait l’objet d’aucune commande entre le 2/1/2005 et le 7/1/2005.
 Afficher la raison sociale des fournisseurs et le nombre de produit qu’ils proposent
 Afficher les noms des clients dont le montant total des commandes dépasse 50000.
 Afficher toutes les commandes qui concernent le produit ‘Stylo’
 Calculer le nombre de clients ayant passé au moins dix commandes le mois de janvier 2005.
 Afficher la date de la commande la plus récente
 Lister les commandes triées dans l’ordre décroissant de leur montant ,et l’ordre croissant des quantités commandés.
 Afficher le numcli, nom et montant des commandes par client
 Afficher le numcli et nom des clients ayant passé plus de 10 commandes le mois de mai 2005.

Exercice 1

Dans un établissement scolaire, on désire gérer la réservation des salles de cours ainsi que du matériel
pédagogique (ordinateur portable ou/et Vidéo projecteur). Seuls les enseignants sont habilités à effectuer
des réservations (sous réserve de disponibilité de la salle ou du matériel).
Le planning des salles peut quant à lui être consulté par tout le monde (enseignants et étudiants).
Par contre, le récapitulatif horaire par enseignant (calculé à partir du planning des salles) ne peut être
consulté que par les enseignants.
Enfin, il existe pour chaque formation un enseignant responsable qui seul peut éditer le récapitulatif
horaire pour l’ensemble de la formation.

Modéliser cette situation par un diagramme de cas d’utilisation

Exercice 2

Dans un magasin, le processus de vente est le suivant : le client entre, passe dans les rayons, demande
éventuellement des renseignements ou procède à des essais, prend des articles (si le stock est suffisant),
passe à la caisse où il règle ses achats (avec tout moyen de paiement accepté). Il peut éventuellement
bénéficier d’une réduction.

Modéliser cette situation par un diagramme de cas d’utilisation

Exercice 3

On considère le système suivant de gestion d’un DAB (Distributeur automatique de billets) :
· le distributeur délivre de l’argent à tout porteur de carte (carte Visa ou carte de la banque)
· pour les clients de la banque, il permet :
o la consultation du solde du compte
o le dépôt d’argent (chèque ou numéraire)
· toute transaction est sécurisée et nécessite par conséquent une authentification
· dans le cas où une carte est avalée par le distributeur, un opérateur de maintenance se charge de la
récupérer. C’est la même personne qui collecte également les dépôts d’argent et qui recharge le
distributeur.
Modéliser cette situation par un diagramme de cas d’utilisation

Exercice 4

Dans un magasin, un commerçant dispose d’un système de gestion de son stock d’articles, dont les
fonctionnalités sont les suivantes :
· Edition de la fiche d’un fournisseur
· Possibilité d’ajouter un nouvel article (dans ce cas, la fiche fournisseur est automatiquement
éditée. Si le fournisseur n’existe pas, on peut alors le créer)
· Edition de l’inventaire. Depuis cet écran, on a le choix d’imprimer l’inventaire, d’effacer un
article ou d’éditer la fiche d’un article).
Modéliser cette situation par un diagramme de cas d’utilisation

Exercice 5

Soient les phrases suivantes :
· Un répertoire contient des fichiers
· Une pièce contient des murs
· Les modems et claviers sont des périphériques d’entrée / sortie
· Une transaction boursière est un achat ou une vente
· Un compte bancaire peut appartenir à une personne physique ou morale

Elaborez les diagrammes de classe correspondants en choisissant le type de relation Approprié

NB : Pour le compte bancaire, on aurait également pu modéliser 2 associations entre « compte bancaire »
et « personne physique » et « personne morale » en y incluant une contrainte d’exclusion.

Exercice 6

Une académie souhaite gérer les cours dispensés dans plusieurs collèges. Pour cela, on dispose des
renseignements suivants :
· Chaque collège possède un site Internet
· Chaque collège est structuré en départements, qui regroupent chacun des enseignants
spécifiques. Parmi ces enseignants, l’un d’eux est responsable du département.
· Un enseignant se définit par son nom, prénom, tél, mail, date de prise de fonction et son indice.
· Chaque enseignant ne dispense qu’une seule matière.
· Les étudiants suivent quant à eux plusieurs matières et reçoivent une note pour chacune d’elle.
· Pour chaque étudiant, on veut gérer son nom, prénom, tél, mail, ainsi que son année l’entrée au collège.
· Une matière peut être enseignée par plusieurs enseignants mais a toujours lieu dans la même
salle de cours (chacune ayant un nombre de places déterminé).
· On désire pouvoir calculer la moyenne par matière ainsi que par département
· On veut également calculer la moyenne générale d’un élève et pouvoir afficher les matières
dans lesquelles il n’a pas été noté
· Enfin, on doit pouvoir imprimer la fiche signalétique (nom, prénom, tél, mail) d’un
enseignant ou d’un élève.
Elaborez le diagramme de classes correspondant. Pour simplifier l’exercice, on limitera le diagramme à
une seule année d’étude

dimanche 14 juillet 2013

ISIM Institut Supérieur d’Informatique de Mahdia
TP2 Développement Web 2.0 : JavaScript

Exercice 1 : Réaliser des scripts simples avec Javascript.
a) Ecrire une page HTML contenant un script permettant d’afficher « Bonjour tout le
monde »
b) Améliorer le script pour qu’il permette de demander le Prénom de l’utilisateur (méthode
prompt()) et afficher « Bonjour ‘votre prénom’».
Exercice 2 :
Utiliser les méthodes Javascript prompt() et alert() pour demander à l’utilisateur deux nombres
puis afficher leur somme.
Exercice 3 : Réaliser des conditions (if/else)
Ecrire un script demandant de l’utilisateur d’entrer son âge et de contrôler la validité de l’âge
entré (si l’âge est erroné afficher un message d’erreur et redemander de saisir l’âge).
Exercice 4 : boucle for simple.
Ecrire une page HTML faisant apparaitre les nombres premiers compris entre 0 et 100.
Exercice 5 : boucle for (insertion des balises HTML dans les scripts).
Ecrire une page HTML faisant apparaitre la table de multiplication pour les entiers compris entre
0 et 9 et présenter le résultat dans un tableau [11 x 11].
Exercice 6 : (S’amuser avec un bouton)
Ecrire une page HTML contenant un formulaire. Ce formulaire contient un bouton. Le click sur
le bouton engendre la modification de la couleur de l’arrière plan de la page. Utiliser la
commande suivante : document.bgColor= ‘’#FFFggF’’.

Correction :

Ex1 :

a) <BODY><script language="JavaScript">
var phrase = "Bonjour tout le monde !";
document.write(phrase);
</SCRIPT>
</BODY>
</HTML>
a) <BODY><SCRIPT language="JavaScript">
var phrase = "Bonjour";
var prenom = prompt("Entrer votre prénom");
document.write(phrase+" "+prenom );
</SCRIPT>

Ex2  :

<script language="JavaScript">
var a = prompt("Entrez le premier nombre");
var b = prompt("Entrer le deuxième nombre");
var somme = parseInt(a) + parseInt(b);
document.write("La somme de "+a+" et "+b+" égal à "+ somme);
</script></body></html>

Ex3 :

1ère solution
<html><head><title>Exercice3</title></head><body>
<script language="javascript">
var userage = prompt("Entrer votre age");
if ( userage <= 0 || userage > 150)
alert("Age non valide");
else
alert(userage+ "est valide");
</script>
</body>
</html>

2ème solution (plus juste)

<html><head><title>Exercice3</title></head><body>
<script language="javascript">
do{
var age = prompt("Entrer votre age");
if( age <= 0 || age > 150)
alert("Age non valide");
}while ( age <= 0 || age > 150)
alert(age+ "est valide");
</script>
</body>
</html>

EX4 :

<html><head>Exercice4</head>
<body>
<script language="javascript">
document.write("les nombres premiers compris entre 0 et 100 sont :<br>");
/* 0 et 1 ne sont pas des nombres premiers*/
for(var i=2;i<=100;i++)
{ var trouve=false;
for(j=2;j<i/2;j++)
{
if(i%j==0)
trouve=true;
}
if(trouve==false)/* S'il n'existe aucun diviseur de i*/
document.write(i,",");
}
</script></body></html>

EX5 :

<script language="javascript">
document.write("<center>");

/* Mettre un titre pour la table */
document.write("<caption> Table de multiplication</caption>");

/* Créer la table*/
document.write("<table border=1>");

/* Créer la première ligne */
document.write("<tr><td>","x","</td>");
for(var i=1;i<=9;i++)
document.write("<td>",i,"</td>");

/* créer les autres lignes*/
for(var i=1;i<10;i++)
{
/* Créer la ligne numéro i*/

document.write("<tr>");
document.write("<td>",i,"</td>");
for(var j=1;j<=9;j++)
{

/* Créer la colonne numéro j*/
document.write("<td>",i*j,"</td>");
}
document.write("</tr>");
}
document.write("</table>");
</script>

EX6 :

1ère Solution

<script language="javascript">
function modif()
{
document.bgColor="#fffggf";
}
</script> </head><body>
<form>
<input type="button" value="modifier" OnClick="modif()">
</form>
</body>
</html>

2ème solution:

Modifier la function modif() en donnant à l’utilisateur la main pour spécifier la couleur la couleur du fond
<script language="javascript">
function modif()
{
/* l’utilisateur saisie la couleur du fond*/
var c=prompt("Donner la couleur du fond");
document.bgColor=c;
}
</script> </head><body>
<form>
<input type="button" value="modifier" OnClick="modif()">
</form></body></html>

3ème solution :
remplacer le bouton du formulaire par un lien

<script language="javascript">
function modif()
{
var c=prompt("Donner la couleur du fond");
document.bgColor=c;
}
</script> </head><body>
<a href="javascript: modif()">Modifier le fond</a>
</body>
</html>
Exercice SGBDR 2

Voici le schéma  relationnel de la base AcciRoute pour représentater les rapports d’accidents de la route. Le S.R de chaque relation est enrichi avec un type de l’attribut, afin de vous permettre de formuler adéquatement les requétes SQL
Personne (NAS : char(9), nom : varchar(35), VilleP : Varchar(50))
Voiture (Imma : Char(6), modele : varchar(20), annee : char(4), nas : char(9))
Accident (DateAc : Date, NAS : char(9), dommage : numeric(7 :2), villeAc : varchar(50), imma : char(6) )
 Note :
  1. Les types des attributs représentent les domaines syntaxiques.
  2. Une personne est propriétaire d’une ou plusieurs voitures.
  3. Une personne conduit q’une voiture dont elle est propriétaire.
  4. Il peut y avoir des homonymes dans la base différentiés par leur NAS respectif.

Questions :
  1. Créer la base de données AcciRoute.
  2. Créer la procédure CreateAcciRoute qui permet de construire les tables de données AcciRoute en les suppriman
  3. t s’ils existent avant leur création.
  4. Créer la procédure InsertAcciRoute qui permet d’insérer les données dans AcciRoute
  5.  en vérifiant l’intégrité référentielle.
  6. Créer la procédure GetnumProp qui permet de calculer le nombre de propriétaires impliqués
  7. dans un accident entre deux années données.
  8. Créer la procédure GetProp qui donne le nom et le nas des propriétaires qui ont fait deux accidents
  9.  dans un intervalle de 4 mois.
  10. Créer la procédure GetDamCity qui calcule le total des dommages d’une ville donnée et affiche
  11. « catégorie1 » pour dommage<=5000 et « catégorie2 » pour dommage entre 5000 et 10000
  12. et « catégorie3 » pour dommage >10000.
  13. Créer la procédure GetnumAcci qui permet d’afficher pour chaque ville le nombre total d’accidents enregistrés.
  14. Créer la procédure GetNamProp qui permet d’afficher le nom des propriétaires qui résident
  15.  dans une ville où il y a eu plus de x accidents tel que x un paramètre de la procédure.
  16. Créer la procédure GetnumAcciDat qui calcule le nombre d’accidents qui sont survenus à une date donnée.
  17. Créer la procédure GetnumAcciHour qui calcule le nombre d’accidents survenus entre deux heures données.
  18. Créer la procédure UpdateDam qui permet de diminuer de 5% le dommage  à chaque véhicule
  19. dont les dommages dépassant  les 5000.00.




Solution ;
-- 1)
use master
go
create database M21N3Ex1--AcciRoute
go
-- 2)
use M21N3Ex1
go
alter Proc AcciRoute
as
begin
if exists(select * from sys.tables where name like 'Personne')
 drop table Personne
create table Personne (NAS char(9)primary key, nom varchar(35), VilleP Varchar(50))

if exists(select * from sys.tables where name like 'Voiture')
 drop table Voiture
create table Voiture (Imma Char(6)primary key, modele varchar(20), annee smalldatetime, nas char(9))

if exists(select * from sys.tables where name like 'Accident')
 drop table Accident
create table Accident (DateAc smallDatetime, NAS char(9)foreign key references Personne(Nas),
dommage numeric(7,2), villeAc varchar(50),imma char(6)foreign key references Voiture(imma))
end
Go
Exec AcciRoute 
go

-- 3)
create proc inserte(@dateAc datetime,@NAS char,@dommage numeric,@villeAc varchar,@imma char)
as
begin
 BEGIN try
  if not exists(select * from Personne where @NAS=NAS)
    RAISERROR('NAS introuvable ',15,1) 
  else if not exists(select * from Voiture where @Imma=Imma)
    RAISERROR('IMMA introuvale ',15,1)
  else --if not exists(select * from Accident)
    insert into Accident values(@dateAc,@NAS,@dommage,@villeAc,@imma)
 end try
 begin catch
  select ERROR_MESSAGE() AS ErrorMessage
 end catch
end

Exec inserte '12/06/1993 05:30','xxx',30,'rabat','yyy'
Exec inserte 'xxx','fandi','casa'
Exec inserte 'yyy','uno','12/05/1990','qqq'
Exec inserte '12/06/1993','xxx',30,'rabat','yyy'
go

--- 4)
alter proc GetnumProp(@A1 int,@A2 int)
as
begin
 select COUNT(distinct NAS) from Accident where YEAR(DateAc) between @A1 and @A2
end
Go
exec GetnumProp 1990,1998
go
--- 5)
create proc GetProp
as
begin
select P.nom,P.NAS from Personne P,Accident A1,Accident A2
where A1.NAS=A2.NAS and A1.NAS=P.NAS and A1.NAS>=A2.NAS and ABS(DATEDIFF(month ,A1.DateAc,A2.DateAc))>4

end
exec GetProp
go
--- 6)
alter proc GetDamCity @ville varchar(12) as
begin
select sum(dommage) as 'total' ,case when sum(dommage)<=5000 then 'catégorie1'
when (sum(dommage)between 5000 AND 10000) then 'catégorie2'
else 'catégorie3'
end 
from Accident where @ville=villeAc
end
exec GetDamCity
go
---- autre méthode
alter proc GetDamCiti @ville varchar(12) as
begin
declare @total numeric(6)
select @total=sum(dommage) from Accident where @ville=villeAc
if @total<5000
begin 
print 'catégorie1'
end
if @total between 5000 AND 10000
begin
print 'catégorie2'
end
if @total>10000
begin
print 'catégorie3'
end
print @total 
end
exec GetDamCiti
go
---Q6
create proc GetnumAcci as
begin
select villeAc, COUNT(*)as 'nombre total' from Accident group by villeAc
end
exec GetnumAcci
go
-----Q7
alter proc GetNamProp @X int as
begin
select P.nom,COUNT(*)as 'nombre accident' from Personne P,Accident A 
where P.VilleP=A.villeAc
group by P.nom,A.villeAc
having count(*)>=@X
end
exec GetNamProp 1
go
-----Q8
create proc GetnumAcciDat @DateAc datetime as
begin
select COUNT(*)as'nbr d"accident' from Accident where DateAc=@DateAc
end
exec GetnumAcciDat '01/01/2010'
go
----Q9
create proc GetnumAcciHour @h1 datetime,@h2 datetime as
begin
select count(*)as 'nbr d"accident' from Accident A where DATEPART(hour,A.DateAc) between DATEPART(hour,@h1)and DATEPART(hour,@h2)
end
exec GetnumAcciHour '01:00:00','02:10:00'
go
------Q10
alter proc UpdateDam as
begin
update Accident set dommage=dommage-(dommage*0.05) where dommage>=5000
end
exec UpdateDam