par , 25/10/2014 à 17h00 (1513 Affichages)
Objectif
On souhaite afficher les activités de personnes sur 1 semainier et on a besoin pour cela de 2 tables:
La table "T_Personne" avec le numéro de la personne et son nom :
- NumPersonne : type Entier long (clé)
- NomPersonne : type Texte
Et la table "T_Planning" contenant 10 champs :
- NumPersonne : type Entier long (clé)
- Annee : type Entier (clé)
- NumSemaine : type Entier (clé)
- Lundi : type Texte
- Mardi : type Texte
- Mercredi : type Texte
- Jeudi : type Texte
- Vendredi : type Texte
- Samedi : type Texte
- Dimanche : type Texte
Pour atteindre notre objectif, on va réaliser une requête paramétrée avec en lignes les informations concernant les personnes, en colonnes les jours de la semaine, et à l'intersection les activités.
Cette requête sera alors facilement exploitable comme source d'un formulaire.
Marche à suivre
1) Création de la requête paramétrée
L'étape suivant consiste à créer une requête "R_Plan", basée sur la table "T_Planning", qui affiche les activités des jours de la semaine identifiée par les paramètres [Forms]![F_Planning]![Annee] et [Forms]![F_Planning]![NumSemaine], qui sont en fait des références aux contrôles situés sur le formulaire "F_Planning" :
1 2 3 4
| PARAMETERS [Forms]![F_Planning]![Annee] Value, [Forms]![F_Planning]![NumSemaine] Value;
SELECT NumPersonne, Annee, NumSemaine, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche
FROM T_Planning
WHERE ((Annee=[Forms]![F_Planning]![Annee]) AND (NumSemaine=[Forms]![F_Planning]![NumSemaine])); |
2) Afficher toutes les personnes
Cette étape consiste à afficher toutes les personnes en en-têtes de lignes, 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" :
1 2 3
| SELECT T_Personne.NumPersonne, T_Personne.NomPersonne, R_Plan.*
FROM T_Personne LEFT JOIN R_Plan ON T_Personne.NumPersonne = R_Plan.NumPersonne
ORDER BY T_Personne.NumPersonne; |
3) Création du sous-formulaire "SF_Planning"
Ce formulaire en mode continu ou feuille de données possède comme source la requête "R_Planning".
Il affiche en ligne les personnes et en colonnes les jours de la semaine.
Il est intégré au formulaire principal.
Pour mettre à jour les champ [Annee] et [NumSemaine] on ajoutera, sur l'évènement <strong>Avant MAJ</strong>, le code suivant :
1 2 3 4 5
| Private Sub Form_BeforeUpdate(Cancel As Integer)
[Annee] = Forms!F_Planning!Annee
[NumSemaine] = Forms!F_Planning!NumSemaine
End Sub |
4) Création du formulaire principal "F_Planning"
Ce formulaire contiendra, en plus du sous-formulaire, les contrôles (zones de texte ou listes déroulantes) nommés "Annee" pour l'année, et "NumSemaine" pour le numéro de semaine.
On ajoutera une commande pour rafraichir le sous formulaire sur l'évènement <strong>Après MAJ</strong> des 2 contrôles :
1 2 3 4 5 6 7
| Private Sub Annee_AfterUpdate()
Me!SF_Planning.requery
End Sub
Private Sub NumSemaine_AfterUpdate()
Me!SF_Planning.requery
End Sub |
Conclusion
Vous pouvez facilement adapter cet exemple à votre cas en changeant au besoin les noms des champs et des contrôles.
Notez que les données peuvent être directement mise à jour sur le planning.