avril
2012
Objectif
On souhaite afficher les activités de personnes sur 1 planning et on dispose pour cela de 2 tables :
La table « T_Personne » avec le numéro de la personne et son nom :
- NumPersonne : clé primaire
- NomPersonne : type Texte
Et la table « T_Planning » contenant 4 champs :
- id : clé primaire
- DateDebut : type Date
- DateFin : type Date
- Activite : type Texte
- NumPersonne : clé étrangère
Pour atteindre notre objectif, on va réaliser une requête analyse croisée avec en en-têtes de lignes les informations concernant les personnes, en en-têtes de colonnes les indices des jours et à l’intersection les activités.
Cette requête sera alors facilement exploitable comme source d’un formulaire.
Marche à suivre
1) Définition des indices de colonnes
Tout d’abord, il nous faut définir le nombre de colonnes, le nombre de jours à afficher dans la requête analyse croisée, normalement 31.
Pour cela, on doit créer une table « T_Jour » contenant les indices des 31 jours (1,2,3…31).
2) Génération des 31 dates
Puis, il nous faut générer les dates correspondant aux 31 indices partant d’une date entrée en paramètre d’une requête.
On crée donc une requête paramétrée « R_Jour », basée sur la table précédente et qui affiche les 31 jours à partir du jour [Jour1] passé en paramètre.
SELECT T_Jour.Jour, [Jour1]+[Jour]-1 AS DateJ
FROM T_Jour;
Notez que le paramètre [Jour1] peut aussi bien être un contrôle dans un formulaire.
3) Générer les jours intermédiaires entre les dates de début et de fin
L’étape suivant consiste à créer une requête « R_Plan », basée sur la requête « R_Jour » et la table « T_Planning », qui affiche tous les jours à planifier, y compris les jours intermédiaires entre les dates de début et de fin :
FROM R_Jour, T_Planning
WHERE (R_Jour.DateJ BETWEEN [DateDebut] AND [DateFin]);
4) Afficher toutes les personnes
L’avant dernière étape consiste à afficher toutes les personnes, y compris celles qui n’ont pas eu d’activité au cours de la période. On crée donc une requête « R_Planning » basée sur la table « T_Personne » et sur la dernière requête « R_Plan » et qui réalise une jointure gauche entre la table « T_Personne » et la requête « R_Plan » sur le champ « NumPersonne » :
FROM T_Personne LEFT JOIN R_Plan ON T_Personne.NumPersonne = R_Plan.NumPersonne
ORDER BY T_Personne.NumPersonne;
5) Créer la requête analyse croisée
Enfin, on va réaliser une requête croisée basée sur la table « T_Personne » et sur la dernière requête « R_Planning » et qui affiche, en lignes les informations des personnes, et en colonnes les indices des 31 jours partant du 1er jour passé en paramètre :
SELECT NumPersonne, NomPersonne
FROM R_Planning
GROUP BY NumPersonne, NomPersonne
ORDER BY NumPersonne
PIVOT DateDiff("d",[Jour1],[Jour])+1 In (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);
La clause Pivot désigne les en-têtes de colonnes et l’opérateur In permet de fixer les colonnes : Ici, la requête comportera 31 colonnes (1,2..31).
L’expression DateDiff(« d »,[Jour1],[Jour])+1 renvoie l’indice du jour partant du 1er jour passé en paramètre.
Conclusion
Vous pouvez facilement adapter cet exemple à votre cas et utiliser le résultat dans un formulaire en mode continu.