Bonjour tous le monde,
j'ai une requête plutôt compliquer à améliorer.
Pour vous situer le contexte:
Je développe actuellement sur un logiciel crée par des anciens élèves.
Ce logiciel à pour but de gérer la gestion des absences sur les semaines en cours et à venir.
Principe :
L'utilisateur crée des TMA.
Chaque utilisateur de l'application est associé à une TMA donné.
Ensuite chaque utilisateur peut ou non définir les journées où il sera absent.
Sachant que chaque TMA doit obligatoirement avoir une personne assigné et présent la journée, la fonctionnalité d'astreinte permet de déterminer quels jours une TMA sera sans personne présente.
Ce que je fait actuellement :
Actuellement, un utilisateur du logiciel peut uniquement définir une Absence sur la journée entière.
Je souhaite donc ajouter une fonctionnalité, où un utilisateur aura la possibilité de choisir l'horaire de son absence ( c'est à dire, absent toute la journée, le matin ou le soir).
Le Problème:
Il est donc nécessaire de prendre en compte dans la fonctionnalité d'astreinte, la présence ou non de chaque utilisateur assigné à une tma ( présence le matin ou le soir ou toute la journée)
Voici ci joint la requête sql déjà conçu par les anciens :
Ce que représente la requête :
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 select JOUR, TMA from ( select jours2.jour jour, TMA2.TMA tma , '' as Nb from -- Selection les jours et les TMA concerné (select jour from calendrier where jour >= CURDATE()) jours2, planastre.tma tma2 -- jour2 --> selectionner le jour du calendrier supérieur à la date actuel where DAYOFWEEK(jours2.jour) between 2 and 6 and not exists (select 1 from planastre.fermetures fe -- Verifie si la TMA est fermé ou non where fe.tma = tma2.TMA and fe.date_ferm = jours2.jour) -- Verifie si la TMA est fermé ou non union select jour, tma, COUNT(NOM) from -- Selection des jours, tma et le nombre de personnes (select jours.jour, af.TMA tma , af.nom nom, af.niveau from (SELECT cal0.JOUR as jour FROM planastre.calendrier cal0 where jour >= CURDATE()) jours, planastre.affectations af where DAYOFWEEK(jours.jour) between 2 and 6 and not exists (select absences.date_abs, affectations.tma, affectations.nom from planastre.absences absences, -- Selectionner la date de labsence, la tma affecté et le nom des affectations planastre.affectations affectations where absences.nom = AFFECTATIONS.NOM and absences.date_abs=jours.jour and (absences.jour = "JOURNEE" or absences.jour = "MATIN") and absences.type_abs != "Tele-Travail" and affectations.tma=af.tma and affectations.nom = af.nom) and not exists (select 1 from planastre.fermetures fe where fe.tma = af.tma and fe.date_ferm = jours.jour) ) t1 group by jour,tma ) T2 group by jour, tma having max(Nb) = 0;
Cette requête récupère les jours où des tma ont des problème d'astreinte.
La ligne en gras représente le moment ou la requête va comparer un par un les utilisateur assigné à une tma et voir si la journée d'absence de l'utilisateur correspond à une journée du calendrier. Ainsi on peux, par comparaison ligne par ligne déterminé si il y a problème d'astreinte.
Ce que j'ai rajouté:
La ligne en gras et italique correspond à mon ajout afin que la requête compare chaque absence d'utilisateur par date d'absence et par leur horaire d'absence.
Actuellement il me prend en compte les problèmes d'astreintes pour laquelle tous les utilisateurs d'une TMA sont absents la journée et les problèmes d'astreintes pour lesquelles personne n'est présent le Matin.
Cependant lorsque je souhaite ajouter le cas de l'absence de type Soir, la requête va définir un problème d'astreinte pour les TMA dont les personnes sont soit absent le matin ou l'aprèm.
Cependant dans le cas où deux personnes sont affectées à une tma et qu' une personne est uniquement absent le matin et l'autre le soir, il ne faut pas qu'il y est un problème d'astreinte car sur la journée il y aura toujours quelqu'un sur la TMA.
Quelqu'un aurait t'il une solution à mon problème s'il vous plaît.
ps: sachant que je suis sur du mysql, la fonctionnalité Intersect ne fonctionne pas et j'ai utilisé un inner join mais ça ne marche pas.
Partager