Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Interdire les doublons de paires
Pour des raisons de
sécurité, c'est bien souvent avec une
paire d'identifiants qu'un utilisateur doit s'authentifier pour être reconnu. Mais dans ce contexte, ce n'est plus la clé primaire qui est garante de l'unicité de l'enregistrement dans la base de données. L'application doit veiller à ce que cette
paire ne soit pas déjà utilisée par une autre personne.
Sur l'exemple illustré par la capture, lorsque l'utilisateur modifie ou insère un client avec une
paire qui est
déjà utilisée sur un autre enregistrement, un message d'alerte vient lui barrer la route. Il n'a d'autre choix que d'annuler ou de modifier la paire sans quoi, l'enregistrement est refusé.
Base de données Access à télécharger
Pour développer cette solution triviale en VBA, nous proposons de baser les travaux sur une
base de données Access offrant déjà un
formulaire des clients, avec une vue tabulaire.
Ainsi, nous accédons à l'organisation tabulaire des clients recensés dans cette petite base de données. Ce
formulaire tabulaire est construit sur la
table nommée
Clients. Ces clients sont donc identifiés avec une
paire de nombres :
Client_id et
Client_id2. Il pourrait s'agir d'une paire de textes. Cela ne changerait rien à la problématique. Le
code VBA doit
interdire la validation d'un
nouvel enregistrement ou d'un
enregistrement modifié possédant exactement la
même paire qu'un autre client.
Code VBA avant validation
Un
code VBA doit donc se déclencher avant l'
entrée d'un nouvel enregistrement pour l'examiner afin d'accepter ou de refuser son intégration. Pour cela, un
formulaire Access offre un
événement particulièrement dédié. Nous devons l'exploiter.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans les propositions, choisir le mode Création,
Nous basculons ainsi dans la vue en conception du formulaire.
Ce contrôle parent est sélectionné par défaut, comme en atteste le carré noir à l'intersection des règles, en haut à gauche du formulaire.
- De fait, activer l'onglet Evénement de sa feuille de propriétés,
- Cliquer sur la ligne de son événement Avant MAJ pour l'activer,
- Cliquer sur le petit bouton situé à son extrémité,
- Dans la boîte de dialogue, choisir le Générateur de code et valider par Ok,
C'est ainsi que nous sommes propulsés dans l'
éditeur VBA Access, entre les bornes de la
procédure événementielle Form_BeforeUpdate. Son code se déclenchera avant la mise à jour (BeforeUpdate) des données sur le formulaire.
La fonction de vérification
Nous suggérons de tester la validité des paires avec une
fonction booléenne. C'est elle qui devra rendre son verdict à la procédure événementielle pour lui permettre d'agir en conséquence.
- Après la procédure Form_BeforeUpdate, créer la fonction estDoublonPaire, comme suit :
...
Function estDoublonPaire() As Boolean
End Function
...
Nous la typons donc comme une
fonction booléenne (Boolean), sans argument. En effet, elle doit se contenter d'analyser l'
enregistrement actif sur le
formulaire Access.
Variable et affectations
La fonction retournera son verdict par son propre nom, nous le savons. Elle a néanmoins besoin d'une
variable capable de stocker la position de l'enregistrement, s'il est trouvé avec un doublon de paires.
- Dans les bornes de la fonction, ajouter les instructions VBA suivantes :
...
On Error Resume Next
Dim posEnr As Long
estDoublonPaire = False
posEnr = 0
...
Nous déclarons la
variable posEnr comme un
entier long (As Long) si d'aventure la table était constituée d'un
très grand nombre d'enregistrements. En l'absence de recherche encore initiée, nous l'affectons naturellement sur la position zéro (0). Dans le même temps, nous calons le verdict de la fonction sur une valeur négative (False). Là encore, tant qu'une recherche n'a pas été lancée, aucun doublon n'a pu être trouvé.
La fonction de recherche
Maintenant que les réglages sont faits, nous devons exercer la recherche pour vérifier la
présence de doublons sur la
paire saisie ou modifiée. Sur le formulaire, les zones concernées se nomment respectivement
Client_id et
Client_id2. Elles reprennent donc les noms des champs de la table source. Et comme vous le savez, c'est la fonction Access RechDom qui permet de chercher des informations dans une table, selon un ou des critères à préciser. Mais comme ici nous codons en
VBA, nous devons utiliser son homologue anglais, soit :
DLookup.
- A la suite du code de la fonction, ajouter les instructions VBA suivantes :
...
posEnr = DLookup("Client_num", "Clients", "Client_num<>" & Client_num & " AND Client_id=" & Client_id & " AND Client_id2=" & Client_id2)
If posEnr <> 0 Then
estDoublonPaire = True
End If
...
Nous lançons donc la recherche (DLookup) sur l'
identifiant client (Client_num) dans la
table Clients. En troisième argument, nous vérifions une
triple condition. En effet, le client actif sur le formulaire doit être ignoré ("Client_num <>" & Client_num), puisqu'il porte forcément la paire recherchée. Dans le même temps (AND), nous tentons de débusquer une
double égalité sur les identifiants (Client_id=" & Client_id & " AND Client_id2=" & Client_id2). Si un enregistrement répond positivement, la position renvoyée par la
fonction DLookUp est stockée dans la
variable posEnr.
Ensuite, si une position est effectivement trouvée (posEnr <> 0), nous basculons l'état de la
fonction booléenne Ã
true pour en alerter la procédure appelante.
Appeler la fonction
Précisément, c'est maintenant que nous devons initier l'
appel de cette fonction, depuis la
procédure événementielle Form_BeforeUpdate, soit juste avant qu'une saisie soit validée.
- Dans les bornes de la procédure événementielle, ajouter les instructions VBA suivantes :
Private Sub Form_BeforeUpdate(Cancel As Integer)
If estDoublonPaire Then
MsgBox "Cette paire d'identifiants est déjà utilisée." & Chr(13) & Chr(13) & "Vous devez la changer.", vbCritical
Cancel = 1
End If
End Sub
Nous engageons la fonction que nous venons de finaliser dans une instruction conditionnelle (if). Si elle répond positivement (Then), nous en alertons l'opérateur et nous basculons l'état de la variable Cancel passée en paramètre, pour annuler l'action, donc pour annuler la mise à jour.
- Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
- Exécuter ce dernier, par exemple avec la touche F5 du clavier,
- Tout en bas, créer un nouvel enregistrement avec une paire existante,
A validation, l'alerte se déclenche. Elle barre le passage. Si vous la validez, l'enregistrement reste actif mais il n'est toujours pas accepté. Vous n'avez d'autre choix que de modifier l'une des valeurs de la paire pour que la nouvelle ligne soit intégrée et que tout rentre dans l'ordre.