Bonjour à tous, je cherche à créer une fonction en SQL qui vérifie d'une part si un événement est déjà enregistré pour la date donnée puis que les horaires de l'événement rentré ne chevauchent pas un éventuel événement déjà présent. Mon SGBD est MySQL, j'ai déjà fait appel à votre aide pour modéliser mon MCD (je remercie encore Richard_35) à l'adresse suivante, le mcd étant celui du dernier post : http://www.developpez.net/forums/d14...tion-terrains/
Voici comment j'ai créé ma BdD :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 /***********************************************************************************/ /************************************* BDD ****************************************/ /***********************************************************************************/ /************************************ Gestion partie arrêtés ***************************/ CREATE TABLE IF NOT EXISTS Arrêté ( id_arrete INT AUTO_INCREMENT not null, CONSTRAINT Pk_Arrete PRIMARY KEY(id_arrete) ); CREATE TABLE IF NOT EXISTS Stade ( id_stade INT AUTO_INCREMENT not null, CONSTRAINT Pk_Stade PRIMARY KEY(id_stade) ); CREATE TABLE IF NOT EXISTS Concerner ( id_stade INT not null, id_arrete INT not null, date_concernee DATE not null, heure_debut INT, heure_fin INT, CONSTRAINT Pk_Concerner PRIMARY KEY(id_stade,id_arrete), CONSTRAINT Fk_Concerner1 FOREIGN KEY(id_stade) REFERENCES Stade(id_stade), CONSTRAINT Fk_Concerner2 FOREIGN KEY(id_arrete) REFERENCES Arrêté(id_arrete) ); /*************************************** Gestion partie états *******************************/ CREATE TABLE IF NOT EXISTS Etat ( id_etat INT AUTO_INCREMENT not null, Libelle VARCHAR(32), interdit_we BOOL, CONSTRAINT Pk_Etat PRIMARY KEY(id_etat) ); CREATE TABLE IF NOT EXISTS Date_Etat ( date_concernee DATE not null, date_concernee_matin BOOL, date_concernee_apresmidi BOOL, CONSTRAINT Pk_Date_Etat PRIMARY KEY(date_concernee) ); CREATE TABLE IF NOT EXISTS Dater ( id_etat INT not null, date_concernee DATE not null, CONSTRAINT Pk_Dater PRIMARY KEY(id_etat,date_concernee), CONSTRAINT Fk_Dater1 FOREIGN KEY(id_etat) REFERENCES Etat(id_etat), CONSTRAINT Fk_Dater2 FOREIGN KEY(date_concernee)REFERENCES Date_Etat(date_concernee) );
Le trigger qui utilisera la fonction en question pour vérifier chaque insertion :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TRIGGER anti_chevauchement_horaires BEFORE INSERT ON Arrêté FOR EACH ROW BEGIN EXECUTE PROCEDURE P_anti_chevauchement_horaires(); END;
Et enfin l'ébauche de fonction que j'ai réalisé, je me demandais si il n'y avait pas une correspondance à l'attribut "new." de postgresql en SQL pour récupérer les éléments rentrés :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CREATE PROCEDURE P_anti_chevauchement_horaires(); BEGIN IF( /*heure de debut du nouvel arrêté*/ > SELECT heure_debut FROM Concerner WHERE date_concernee = /* date_concernee du nouvel arrêté */ ) && ( /*heure de debut du nouvel arrêté*/ < SELECT heure_fin FROM Concerner WHERE date_concernee = /* date_concernee du nouvel arrêté */ print 'Erreur vous ne pouvez pas créer un arrêté avec des horaires qui chevauchent un autre arrêté déjà créé' ELSE IF( /*heure de fin du nouvel arrêté*/ > SELECT heure_debut FROM Concerner WHERE date_concernee = /* date_concernee du nouvel arrêté */ ) && ( /*heure de fin du nouvel arrêté*/ < SELECT heure_fin FROM Concerner WHERE date_concernee = /* date_concernee du nouvel arrêté */ print 'Erreur vous ne pouvez pas créer un arrêté avec des horaires qui chevauchent un autre arrêté déjà créé' END
Merci à tous !
Partager