6.2. Les formulaires
6.2.9. Synchroniser les listes
Actuellement, les deux listes déroulantes sont indépendantes. Rien n'empêche l'utilisateur de choisir un pays dans une liste et un code postal d'un autre pays dans l'autre liste ainsi qu'on le voit à la fig. 6.21.
Il nous reste a faire en sorte que, lorsque l'utilisateur a choisi un pays dans la liste, seules les villes de ce pays sont affichées dans l'autre liste. Ceci implique deux modifications :
- transformer la requête de la liste des villes en une requête avec critère
- écrire une petite procédure VBA événementielle de synchronisation.
6.2.9.1 Transformer la requête
La requête R_CodesPostauxListeId ne doit afficher que les villes qui appartiennent
au pays choisi dans la liste FCodePaysISO. Il faut donc expliquer à la requête
qu'elle doit lire le critère dans le champ FCodePaysISO qui se trouve dans le
formulaire frmClients. La clause WHERE de l'expression SQL est modifiée :
SELECT CodesPostaux.CodeVille, CodesPostaux.CodePaysIso, CodesPostaux.Ville, CodesPostaux.CodePostal FROM CodesPostaux WHERE (CodesPostaux.CodePaysIso = [Formulaires]![frmClients]![FCodePaysIso]) AND (CodesPostaux.estDetruit=False)
ORDER BY CodesPostaux.Ville, CodesPostaux.CodePostal;
L'expression de la clause WHERE est un peu particulière. Pour obtenir une syntaxe
correcte, l'emploi du générateur d'expression est recommandé :
- ouvrir la requête CodesPostauxListeId en mode MODIFIER,
- positionner le curseur dans la case CRITERES située dans la colonne
CodePaysISO,
- faire un clic droit et sélectionner l'option GENERER,
- utiliser la fenêtre pour rechercher le champ voulu,
Application Access 6 - La chaîne Clients - Codes Postaux - Pays
L'expression s'inscrit dans la requête. Sauver cette requête sous le nom
CodesPostauxSelonPaysListeId. Quand on a modifié une requête, il est
recommandé de la sauver sous un autre nom car la requête initiale pourrait être utilisée à un autre endroit du programme. Ceci impose de rectifier la propriété
CONTENU de l'onglet des DONNEES de la liste déroulante FCodeVille.
6.2.9.2 Ecrire une procédure événementielle
A ce stade, si l'utilisateur choisit un pays dans le formulaire, la liste des villes n'affiche que les villes et codes postaux de ce pays. Toutefois, si l'utilisateur change d'avis et sélectionne un autre pays, la liste des villes n'est pas modifiée. Nous devons donc demander à Access de mettre à jour la liste des villes chaque fois que
le champ FCodePaysISO a été modifié. Pour cela, nous devons
- créer un module VBA,
- écrire une fonction qui remet la liste à jour,
- attacher cette fonction à un événement de l'objet FCodePaysISO.
Créer un module n'est pas plus compliqué que créer une table, une requête ou un
formulaire : on sélectionne l'onglet MODULES dans la fenêtre de la base de données
et on clique sur NOUVEAU.
fig. 6.23 La fenêtre d'un module vide
Un module n'est rien d'autre qu'un fichier texte, intégré à la base de données, qui contient des instructions exécutables, c'est-à-dire des instructions rédigées par le concepteur dans le langage de programmation VBA.
Une page de module est structuré en paragraphes, chaque fonction ou routine occupant un paragraphe. Les premières lignes de la page sont réservées aux options (1).
En dessous des deux premières lignes, nous inscrivons l'instruction suivante :
Function Clients_ApresMAJ_CodePaysISO()
La première ligne commence par le mot-clé
Function
suivi du nom de la fonctionen un seul mot. Nous l'appelons
Clients_ApresMAJ_CodePaysISO
car il s'agit d'une fonction qui a trait au formulaire Clients et qu'elle doit être activée après que l'utilisateur ait mis à jour le choix du pays. Notez la présence des tirets soulignés (ang.: underscore) qui remplacent les caractères d'espacement.Dès que l'on a tapé cette ligne, Access ajoute les parenthèses et crée la ligne
End Function
1 Nous nous contentons ici d'écrire quelques routines élémentaires. La programmation VBA proprement dite fait l'objet d'un autre cours.
Application Access 6 - La chaîne Clients - Codes Postaux - Pays
Entre le début et la fin de la fonction, on insère alors la ligne
Forms!frmClients!FCodeVille.Requery
Elle signifie qu'il faut réexécuter la requête (ang.: requery) qui est attachée au champ
FCodeVille qui est dans l'objet frmClients qui est un formulaire (ang.: form).
Le tout est sauvé sous le nom modClients. Le résultat doit ressembler à ceci :
fig. 6.24 La fonction de mise à jour
Il nous reste à attacher cette fonction à la liste déroulante des pays dans le formulaire des clients :
- ouvrir le formulaire frmClients,
- sélectionner la liste déroulante des pays FCodePaysISO,
- afficher ses propriétés,
- sélectionner l'onglet EVENEMENT
On peut comparer les événements à des drapeaux qui se lèvent quelque part dans les tréfonds de Access chaque fois qu'il arrive quelque chose à l'objet en question. Par exemple, l'utilisateur a cliqué (événement: sur clic) ou double cliqué (événement : sur double clic) sur l'objet; il va modifier le contenu (événement : avant Mise A Jour) ou il a modifié le contenu (événement : après Mise A Jour), etc.
Dans le cas présent, c'est l'événement APRES MISE A JOUR (Après MAJ) qui nous intéresse. Nous y inscrivons le nom de la fonction précédé du signe égal (=) et suivi
des parenthèses () :
Propriétés FCodePaysISO Evénement
Après MAJ =Client_ApresMAJ_CodePaysISO()
Pour éviter les problèmes, il est conseillé de copier le nom de la fonction dans le module et de le copier ici par [CTRL][V].
A présent, si tout fonctionne correctement, dès que nous modifions le choix du pays, la liste des villes et codes postaux est adaptée.
6.2.9.3 Récupérer le code postal
Quant la liste de villes est déroulée, on voit le nom de la ville et son code postal. Par contre, quand la liste est repliée, seul subsiste le nom de la ville. Nous allons à
Application Access 6 - La chaîne Clients - Codes Postaux - Pays
- d'ajouter un contrôle zone de texte dans le formulaire,
- d'alimenter de contrôle avec une information récupérée dans la liste déroulante
- bloquer ce contrôle pour que l'utilisateur ne puisse le modifier.
Après avoir ouvert le formulaire frmClients en mode MODIFIER, nous y ajoutons une
zone d'encodage (zone de texte) de la même manière que nous avons ajouté la liste déroulante au point 6.2.1. Un champ marqué "Indépendant" et son étiquette s'inscrivent dans le formulaire.
Nous allons modifier la propriété SOURCE CONTROLE de l'onglet DONNEES pour que
l'objet affiche le code postal de la ville sélectionnée dans la liste déroulante. Le code postal est dans la quatrième colonne de la requête attachée à la liste déroulante,
laquelle s'appelle FCodeVille. Pour des raisons qui sont propres aux
programmeurs d'Access, les colonnes sont numérotées à partir de 0. La quatrième colonne porte donc le numéro 3. C'est bizarre mais c'est ainsi :
Propriétés Données
Source contrôle =[FCodeVille].[Colonne](3)
Activé Non
Verrouillé Oui
Autres
Nom FCodePostal
Les propriétés ACTIVE et VERROUILLE empêchent l'utilisateur de positionner le
curseur dans ce champ. On peut également rendre le fond et les contours transparents :
fig. 6.25 Affichage du code postal dans un champ indépendant
Il nous reste à supprimer les anciens champs, devenus redondants depuis l'insertion des listes déroulantes et a arranger le formulaire pour le rendre plus ergonomique. N'oublions pas non plus de vérifier l'ordre de tabulation.