Voir le flux RSS

User

Une alternative aux champs multivalués Access

Noter ce billet
par , 22/03/2020 à 21h30 (304 Affichages)
On présente dans ce billet une alternative aux champs multivalués utilisés dans les tables Access.

I - Introduction

Les champs multivalués permettent d'afficher directement dans les tables, les requêtes ou les formulaires, des listes de choix avec des cases à cocher pour sélectionner des données provenant d'une autre source.

Par exemple, on peut choisir les employés devant participer à une visioconférence directement dans la table des événements :

Nom : champs-multivalues.jpg
Affichages : 45
Taille : 86,3 Ko

Cependant, comme ces champs peuvent contenir plusieurs valeurs pour un même enregistrement, ils ne répondent pas à la première forme normale de la théorie de la normalisation, nécessaire pour concevoir un bon schéma d'une de base de données.

Leur utilisation dans les requêtes comme dans le code peut ainsi sembler déroutante aux puristes.

En résumé, ils peuvent par la suite compliquer le développement et la maintenance de la base Access.

Pour éviter ces problèmes, on propose une méthode permettant de créer soi-même ce type de liste de choix à l'aide d'un sous-formulaire.

II - Description du contexte

On souhaite réaliser une liste permettant de choisir les employés devant participer à un événement (visioconférence, réunion, etc..).

Pour cela, on va utiliser un sous-formulaire basé sur une requête affichant la liste des employés accompagnés de cases à cocher pour effectuer les choix :

Nom : SF_Employes_Evenement.jpg
Affichages : 37
Taille : 57,7 Ko

On bénéficiera ainsi en plus, de tous les avantages qu'offrent les sous-formulaires par rapport aux zones de liste, notamment au niveau de la mise en forme.

III - Tables nécessaires

III.1 - T_Employe

Elle permet d'enregistrer les données concernant les employés.

Nom du champ Type de données Description
IdEmploye NuméroAuto Identifiant de l'employé
NomEmploye Texte Nom de l'employé
PrenomEmploye Texte Prénom de l'employé


III.2 - T_Evenement

Elle contient les informations relatives aux événements.

Nom du champ Type de données Description
IdEvent NuméroAuto Identifiant de l''événement
ObjetEvent Texte Objet de l'événement
EmplacementEvent Texte Lieu de l'événement
DateEvent Date/heure Date de l'événement
HeureDebutEvent Date/heure Heure de début de l'événement
HeureFinEvent Date/heure Heure de fin de l'événement

III.3 - T_Employe_Evenement

Cette table supplémentaire permet de faire le lien entre les 2 précédentes, et d'afficher ainsi dans une requête, pour chaque événement, la liste des noms des employés accompagnés de cases à cocher.

Nom du champ Type de données Description
IdEmploye Entier long Identifiant de l'employé : clé étrangère
IdEvenement Entier long Identifiant de l'événement : clé étrangère
Participant oui/non Indique si l'employé participe à l'événement.

Le champ Participant a comme valeur par défaut Non.

IV - Relations entre les tables

On définit :

  • Une relation 1 à plusieurs entre les tables T_Employe et T_Employe_Evenement sur le champ IdEmploye.
  • Une relation 1 à plusieurs entre les tables T_Evenement et T_Employe_Evenement sur respectivement les champs IdEvent et IdEvenement.


Nom : Relations.jpg
Affichages : 39
Taille : 31,0 Ko

V - Requête

V.1 - R_Employes_Evenement

Elle affiche, pour chaque événement, la liste des employés accompagnés de leur participation et ordonnés suivant leur nom et prénom :

Nom : R_Employes_Evenement.jpg
Affichages : 38
Taille : 70,5 Ko

Elle constitue la source de données du sous-formulaire destiné à afficher la liste de choix des employés.

VI - Formulaire principal

Il est basé sur la table T_Evenement.

Nom : F_Evenement.jpg
Affichages : 36
Taille : 95,5 Ko

VI.1 - Procédure sur BeforeInsert

Ce code génère la liste des employés dans le sous-formulaire, juste avant l'ajout d'un nouvel événement, c'est à dire quand vous commencez la saisie dans le formulaire principal.

Déroulé de la procédure événementielle :

  • On créé un événement avec un nouveau NuméroAuto pour le champ IdEvent de la table T_Evenement.
  • On insère dans la table T_Employe_Evenement, la liste des identifiants des employés accompagnés de la nouvelle valeur du champ IdEvent.
  • On rafraîchit le sous-formulaire basée sur la requête R_Employes_Evenement, pour afficher la liste des employés accompagnés de cases à cocher.


Code VBA : 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
Private Sub Form_BeforeInsert(Cancel As Integer)
    Dim db As DAO.Database
 
    Me.ObjetEvent = "" ' copie une chaîne vide dans une zone de texte pour générer le numéro-auto du champ IdEvent
 
    Me.Refresh ' actualise le formulaire pour créer un nouvel enregistrement
 
    Set db = CurrentDb ' référence à la base courante
 
    ' exécute une requête d'insertion dans la table T_Employe_Evenement de la liste des identifiants des employés accompagnés de l'identifiant IdEvent de l'événement
    db.Execute "insert into T_Employe_Evenement select IdEmploye, " & Me.IdEvent.Value & " As IdEvenement from T_Employe order by IdEmploye;", dbFailOnError
 
    Set db = Nothing ' libère la variable objet
 
    Me.SF_Employes_Evenement.Requery ' actualise le sous-formulaire pour afficher la liste de choix
 
End Sub

VI.2 - Procédure sur clic du bouton CmdAjouter

Ce code permet de déclencher l'événement sur insertion :

Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Private Sub CmdAjouter_Click()
 
    If MsgBox("Souhaitez-vous créer un nouvel événement ?", vbYesNo + vbExclamation) = vbYes Then ' si on accepte
        DoCmd.GoToRecord acDataForm, Me.Name, acNewRec ' on se déplace sur un nouvel enregistrement
        Me.ObjetEvent = "" ' on créé l'enregistrement pour déclencher l'événement sur insertion
    End If
 
End Sub

VII - Sous-formulaire SF_Employes_Evenement

Il est contenu dans le formulaire principal et est basé sur la requête R_Employes_Evenement. Ce sous-formulaire est en mode feuille de données, avec ajout et suppression des données interdits.

Il affiche donc les noms et prénoms des employés, avec pour chacun une case à cocher pour indiquer s'il participe ou pas à l'événement :

Nom : SF_Employes_Evenement.jpg
Affichages : 37
Taille : 57,7 Ko

VII.1 - Liaison entre le formulaire principal et le sous-formulaire

Pour les relier, on définit dans les propriétés du sous-formulaire, IdEvent comme champ père, et IdEvenement comme champ fils.

Nom : Liaison_SousForm.jpg
Affichages : 37
Taille : 60,2 Ko

Envoyer le billet « Une alternative aux champs multivalués Access » dans le blog Viadeo Envoyer le billet « Une alternative aux champs multivalués Access » dans le blog Twitter Envoyer le billet « Une alternative aux champs multivalués Access » dans le blog Google Envoyer le billet « Une alternative aux champs multivalués Access » dans le blog Facebook Envoyer le billet « Une alternative aux champs multivalués Access » dans le blog Digg Envoyer le billet « Une alternative aux champs multivalués Access » dans le blog Delicious Envoyer le billet « Une alternative aux champs multivalués Access » dans le blog MySpace Envoyer le billet « Une alternative aux champs multivalués Access » dans le blog Yahoo

Mis à jour 25/03/2020 à 17h26 par User

Catégories
Access , VBA

Commentaires