Tester l’existence d’une valeur de clef – Saison 2 !
Je dispose d’un formulaire de saisie. La clef primaire doit être saisie sur ce formulaire (il ne s’agit pas d’un NuméroAuto). Lorsque je tape une clef qui existe déjà dans la table, Access m’affiche un message d’erreur (ce qui est normal). Comment vérifier si la clef existe déjà, pour éviter le message d’erreur d’Access ?
Ce précédent article du blog illustrait une manière de faire. Dans ce nouvel article, nous allons voir la méthode qu’on a tendance à suivre… mais qui n’est pas forcément la plus simple. Voyez plutôt…
Le principe
Cette fois, nous allons employer une méthode qui consiste à vérifier par nous-même si la valeur de clef primaire existe déjà dans la table. La vérification sera faite au moment du changement de code, précisément dans l’événement Avant MAJ (BeforeUpdate
) du champ concerné.
Mise en place
- Ouvrez votre formulaire en mode Création.
- Faites apparaître les propriétés du champ à vérifier (dans notre exemple, le champ
Code Genre
), et activez l’onglet Événement. - Cliquez dans l’événement
Avant MAJ
, déroulez la liste proposée, puis choisissezProcédure événementielle
. - Cliquez sur les points de suspension à droite de l’événement, pour passer dans le code VBA.
- Faites en sorte que votre événement ressemble à ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Private Sub Code_Genre_BeforeUpdate(Cancel As Integer) ' Chercher le Code Genre dans la table Dim varCode As Variant varCode = DLookup("[Code Genre]", "tbl Genres", _ "[Code Genre]='" & Me.Code_Genre & "'") ' Si le code a été trouvé, c'est qu'il y a doublon... ' sauf si on est en train de modifier le même code If (Not IsNull(varCode)) And (Me.Code_Genre <> Me.Code_Genre.OldValue) Then MsgBox "Un genre de film existe déjà avec ce code.", vbExclamation ' Annuler la mise à jour Cancel = True End If End Sub |
Quelques petites choses à savoir :
- L’idée consiste à chercher la valeur de clef dans la table, en utilisant par exemple la fonction
DLookup()
. Si vous souhaitez plus d’informations surDLookup()
, consultez cet article du blog. Notamment si vous n’êtes pas à l’aise avec les guillemets, les apostrophes, etc. - Si
DLookup()
renvoieNull
, c’est que la clef n’a pas été trouvée. Dans le cas contraire, la clef existe, on affiche un message d’erreur personnalisé. - Pour bien faire, il faut également vérifier un cas particulier : celui où on est en train de modifier le code d’origine. Un exemple : j’ai un genre codifié
THR / Thriller
. Si je tapeSF
à la place deTHR
, le système me signale queSF
est déjà utilisé (pour Science-Fiction). C’est ok. Mais si je me place surTHR
et que je retapeTHR
, il n’est pas utile que le message d’erreur s’affiche. D’où la comparaison entre le Code Genre et sa valeur d’origine (OldValue
). - Enfin, au cas où l’erreur a été affichée, il faut annuler la mise à jour, grâce au
Cancel = True
.
En résumé
Vous avez maintenant 2 méthodes pour afficher un message personnalisé quand une clef existe déjà dans une table. Même si la technique traitée dans cet article est plus « logique », j’aurais tendance à privilégier l’autre méthode. Pour plusieurs raisons :
- L’autre méthode exploite une fonctionnalité native d’Access.
- L’autre méthode nécessite moins de code.
- L’autre méthode est plus générique : seul le message doit être personnalisé, alors qu’ici il faut adapter le
DLookup()
et la condition qui suit à chaque fois, avec tous les problèmes de syntaxe que ça pose.
A vous de choisir !
bon jour
merciiiiiiiiiiiiiiii pour ce tuto