Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Vérifier doublons - Sortie d'un champ

6 réponses
Avatar
Butch
Bonjour,

Sous Access XP...

Voici la situation: Dans un formulaire, un champ nommé Code_Client inscrit
automatiquement le code d'un client en effectuant l'extraction des 4
premières lettres du nom de famille et la première lettre du prénom, des
champs dans lesquels ces données sont inscrites.
Ex: Bergevin Daniel - le code est: BERGD.

Ce champ Code_Client, dans la table (principale) sous-jacente au formulaire,
possède une clé primaire. Donc, si un deuxième nom de famille et prénom a
pour effet de générer le même code (ce qui peut arriver...), Access affiche
le message habituel. (Une procédure est prévue pour modifier alors
manuellement le code...je sais... c'est pas esthétique mais...le client a
toujours raison!).

De plus, ce Code_Client, suite à une opération de gestion de données, peut
être déplacé dans une deuxième table (secondaire) servant à conserver les
données des clients inactifs.

La question: J'aimerais pouvoir faire afficher un message (donc vérifier),
dès que le curseur sort du champ Code_Bénévole, si ce code existe déjà dans
la table principale (même si Access affiche un message général mais...
seulement lors du changement d'enregistrement...) ou dans la table
secondaire?

Merci à qui peut m'aider.

Butch

6 réponses

Avatar
Eric
Bonjour,

Je n'ai pas très bien compris l'interaction entre Code_Client et
Code_Benevole mais bon tu devrais pouvoir t'en sortir avec la fonction
DLookUp()

Sur l'évènement Avant MAJ de ton controle Code_Benevole
On verifie que le code_benevole saisi n'existe pas dans les tables
primaire et/ou secondaire.

Private Sub Code_Benevole_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("[Code_Client]", "TablePrincipale",
"[Code_Client]='" & Me.Code_Benevole & "'")) _
Or Not IsNull(DLookup("[Code_Client]", "TableSecondaire", "[Code_Client]
='" & Me.Nom & "'")) Then
MsgBox me.[Code_Benevole] & " Existe déja !"
Cancel = True
End If
End Sub

PS: tu pourrais utiliser cette méthode pour vérifier de même lors de la
création d'un code_client dans la table principale (cas où tu aurais un
doublon en raison des homonymes). Mais l'algo de codage me parait un peu
juste ;-). Il devra être changé rapidement je pense.

A+
Eric


"Butch" écrivait
news:R6IBc.87068$:

Bonjour,

Sous Access XP...

Voici la situation: Dans un formulaire, un champ nommé Code_Client
inscrit automatiquement le code d'un client en effectuant l'extraction
des 4 premières lettres du nom de famille et la première lettre du
prénom, des champs dans lesquels ces données sont inscrites.
Ex: Bergevin Daniel - le code est: BERGD.

Ce champ Code_Client, dans la table (principale) sous-jacente au
formulaire, possède une clé primaire. Donc, si un deuxième nom de
famille et prénom a pour effet de générer le même code (ce qui peut
arriver...), Access affiche le message habituel. (Une procédure est
prévue pour modifier alors manuellement le code...je sais... c'est pas
esthétique mais...le client a toujours raison!).

De plus, ce Code_Client, suite à une opération de gestion de données,
peut être déplacé dans une deuxième table (secondaire) servant à
conserver les données des clients inactifs.

La question: J'aimerais pouvoir faire afficher un message (donc
vérifier), dès que le curseur sort du champ Code_Bénévole, si ce code
existe déjà dans la table principale (même si Access affiche un
message général mais... seulement lors du changement
d'enregistrement...) ou dans la table secondaire?

Merci à qui peut m'aider.

Butch





Avatar
Eric
.../...

Remplacer Me.Nom par Me.Code_Benevole evidemment

Eric
Avatar
Eric
re,

Il y a encore plus simple avec la fonction DCount().

Le test devient :

If DCount("[Code_Client]", "TablePrincipale", "[Code_Client]='" &
Me.Code_Benevole & "'") > 0 _
Or DCount("[Code_Client]", "TableSecondaire", "[Code_Client]='" &
Me.Code_Benevole & "'") > 0 Then
...
...
End If

Eric
Avatar
Butch
Bonjour Éric,

Merci pour l'information transmise.
Le deuxième exemple de code que tu m'as fourni (IF DCount...) semble être
OK! Du moins, je n'ai pas de message d'erreur de la part de VBA en le
créant.

Toutefois, lorsque je teste ce code en utilisant le formulaire pour inscrire
les données, je ne reçois pas à l'écran le message voulu lorsque le Code_
Client se crée automatiquement. Access continue à m'indiquer qu'il y a
"risque de doublons..." sur le champ Code_Client mais seulement lorsque
j'essaie de changer d'enregistrement ou d'en inscrire un nouveau...donc, il
fonctionne comme à l'habitude lorsqu'une clé primaire "fait son travail".

Je ne sais pas où j'ai fait l'erreur... ou peut-être n'ai-je pas expliqué
correctement le contexte. Voici quelques précisions:
Ce "fameux" Code_Client est un champ de type texte. Le code se crée
automatiquement par une macro qui extrait des caractères du nom de famille
(4) et du prénom (1). Ce code client s'inscrit alors dans la table
principale. Les champs nom famille et prénom sont bien sûr dans le même
formulaire (et la même table sous-jacente) que celle du Code client. Le
champ code client, dans le formulaire est placé après (je ne crois pas que
cela soit très important..) les champs Nom famille et prénom. Lorsque
l'usager a inscrit le nom famille puis le prénom, en appuyant sur "TAB", il
passe au champ Code_Client qui se crée alors automatiquement.

Voilà.. j'espère que tout cela est plus clair.

As-tu une solution supplémentaire à me proposer ?

Merci encore
Butch
Avatar
Eric
Bonjour "Butch"


Voici quelques précisions:
Ce "fameux" Code_Client est un champ de type texte. Le code se crée
automatiquement par une macro qui extrait des caractères du nom de
famille (4) et du prénom (1). Ce code client s'inscrit alors dans la
table principale.


Il faudrait, après constitution du code par ta macro, vérifier si le code
n'existe pas déjà avant de l'inscrire dans la table principale.

En faisant très simple, et sans macro, par exemple avant MAJ du Prenom:

Private Sub PrenomClient_BeforeUpdate(Cancel As Integer)
Dim Code As String
Code = UCase(Left(Me.NomClient, 4)) & UCase(Left(Me.PrenomClient, 1))
If DCount("Code_Client", "TablePrincipale", "Code_Client='" & Code &
"'") > 0 _
Or DCount("Code_Client", "TableSecondaire", "Code_Client='" & Code &
"'") > 0 Then
MsgBox Code & " existe déjà"
Cancel = True
Exit Sub
End If
Me.Code_Client = Code
End Sub

(Rechercher peut-être l'évènement le mieux approprié pour faire cette
vérification.)

A+
Eric

Avatar
Butch
Bonjour Éric,

Merci encore une fois!

Il faudrait, après constitution du code par ta macro, vérifier si le code
n'existe pas déjà avant de l'inscrire dans la table principale.
Rechercher peut-être l'évènement le mieux approprié pour faire cette
vérification.


Je vais vérifier tout cela.

À une prochaine fois peut-être...
Butch