IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

User

Afficher un planning au moyen d'une requête analyse croisée

Noter ce billet
par , 25/10/2014 à 15h58 (1197 Affichages)
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 :

  • d : 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.

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
PARAMETERS [Jour1] DateTime; 
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 :

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT T_Planning.*, R_Jour.DateJ 
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" :

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT T_Personne.NumPersonne, T_Personne.NomPersonne, R_Plan.[DateJ] AS Jour, R_Plan.Activite AS Activite 
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 :

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
TRANSFORM First(Activite) AS Activite 
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'<strong>indice du jour</strong> 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.

Envoyer le billet « Afficher un planning au moyen d'une requête analyse croisée » dans le blog Viadeo Envoyer le billet « Afficher un planning au moyen d'une requête analyse croisée » dans le blog Twitter Envoyer le billet « Afficher un planning au moyen d'une requête analyse croisée » dans le blog Google Envoyer le billet « Afficher un planning au moyen d'une requête analyse croisée » dans le blog Facebook Envoyer le billet « Afficher un planning au moyen d'une requête analyse croisée » dans le blog Digg Envoyer le billet « Afficher un planning au moyen d'une requête analyse croisée » dans le blog Delicious Envoyer le billet « Afficher un planning au moyen d'une requête analyse croisée » dans le blog MySpace Envoyer le billet « Afficher un planning au moyen d'une requête analyse croisée » dans le blog Yahoo

Mis à jour 25/10/2014 à 16h09 par User

Catégories
Sans catégorie

Commentaires