• Aucun résultat trouvé

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 fonction

en 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.

Documents relatifs