Bonjour,
Après Maj d'une zone de texte, je voudrais afficher un MsgBox si la valeur entrée est déjà présente dans un champs.
Est ce que quelqu'un pourrait me dire comment s'y prendre?
Merci d'avance
Bonjour,
Après Maj d'une zone de texte, je voudrais afficher un MsgBox si la valeur entrée est déjà présente dans un champs.
Est ce que quelqu'un pourrait me dire comment s'y prendre?
Merci d'avance
Dans une table ? Dans un formulaire ?la valeur entrée est déjà présente dans un champs.
Peux-tu préciser ?
A+
La zone de texte est dans un formulaire et elle est liée à un champs d'une table.
Une solution serait d'empêcher les doublons pour le champs en question, mais cela ne résout pas le problème d'affichage de la MsgBox.
Ok, une solution assez simple consiste à mettre un index unique sur le champ en question dans la table.
Si tu essayes d'entrer un seconde fois la même valeur Access va le refuser et renvoyer une erreur. C'est la solution la plus robuste car le contrôle est fait dans la table et aucun programme ne pourra le contourner.
Une fois l'index créé, dans ton formulaire de saisie tu peux utiliser l'événement 'Sur Erreur' (ON Error) pour gérer ce cas et envoyer un jolis message à tes utilisateurs.
Une autre solution consiste à mettre du code dans l'événement 'Avant MAJ' (beforeUpdate) du champ de saisie.
Dans ce code tu contrôles si la donnée est déjà dans la table et tu annules la saisie si c'est le cas.
Cette solution est moins sécuritaire car un autre formulaire pourrait entrer des données en double si aucun contrôle n'a été programmer.
Une note à propos des indexs uniques : si la valeur du champ indéxé est 'Null' alors il n'y a pas de contrôle d'unicité. Tu peux donc te retrouver avec plusieurs enregistrements qui contiennent Null dans leur champ indéxé.
Si tu as besoin de détails n'hésites pas à demander.
A+
Merci pour ta réponse.
Par rapport à ce que tu m'as dis, j'ai opté pour l'indexation sans doublon de mon champs. Donc j'ai entré sur l’événement "Sur erreur" du formulaire, le code suivant:
Ensuite, j'ai rentré la macro "Actualiser" sur l'événement "Après Maj" de la zone de texte. Mais là, erreur 2950 car la macro n'a pas réussi a s’exécuter correctement ( d’où la deuxième partie du code au dessus).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Private Sub Form_Error(DataErr As Integer, Response As Integer) Const conDuplicateKey = 3022 Const conDuplicateKey2 = 2950 If DataErr = conDuplicateKey Then Response = acDataErrContinue MsgBox "La fiche est déjà rentrée", vbOKOnly + vbDefaultButton1 + vbInformation + vbMsgBoxRight + vbMsgBoxRtlReading + vbMsgBoxSetForeground, "Jard'Intemporel" Else If DataErr = conDuplicateKey2 Then Response = acDataErrContinue End If End If End Sub
Finalement ça ne marche pas.
Est ce qu'il serait possible d'avoir un exemple de code pour contrôler si la donnée est déjà dans la table? je pense qu'il faut coder une requête, mais je sèche un peut.
Merci
Que fais ta macro "Actualiser" ? Peux-tu poster le code ?Ensuite, j'ai rentré la macro "Actualiser" sur l'événement "Après Maj" de la zone de texte. Mais là, erreur 2950 car la macro n'a pas réussi a s’exécuter correctement ( d’où la deuxième partie du code au dessus).
A+
Pour répondre à ta 2ième question, oui tu peux utiliser une requête mais tu peux aussi utiliser
DFirst("NomTonChamp","NomTaTable","[TonChamp]=" & TaValeur) si TonChamp est numérique
DFirst("NomTonChamp","NomTaTable","[TonChamp]=""" & TaValeur & """") si TonChamp est aplhanum.
ou
DFirst("NomTonChamp","NomTaTable","[TonChamp]=#" & format(TaValeur,"yyyy-mm-dd" & "#") si TonChamp est une date.
si Dfirst te retourne un null alors c'est que la valeur cherchée n'existe pas.
A+
La macro "Actualiser" est une macro access intégrée qui est placée sur "Après Maj" de la zone de texte. Elle me permet d'enregistrer ma valeur dans ma table. De ce fait, d'activer la recherche de doublon. Le problème est que lorsqu'il y a un doublon, elle ne peut pas terminer et plante.
Il doit surement avoir une autre solution.
En ce qui concerne la deuxième partie, je la test tout de suite.
Merci de prendre du temps pour répondre à des questions surement pas très compliquées.
Ta données est enregistrée dans la source du formualire ou dans une autre table ?
Si tu as fait un formulaire liée à une source, et que ta données va dans cette source à priori tu n'a pas besoin de code pour enregistrer ta données. Access fait cela automatiquement. Essaye simplement en enlevant ta macro.
A+
Elle est enregistrée dans une autre table. Mais j'ai une dizaine de zones de texte à remplir avant de rentrer mon enregistrement. Donc je me sers de cet évènement pour vérifier s'il n'est pas déjà rentré (ça m'évite de tout renseigner pour rien).
A+
OK, je vois et en effet un contrôle préalable est préférable mais garde quand même l'index unique cela blinde ta table et évite qu'un développeur contourne tes sécurités en accédant directement à ta table.
A+
Bonjour,
Après quelques tests, le code de l'aide access c'est avéré le plus efficace.
Donc pour finir:
-Verrouillage du champs avec indexation sans doublons.
-Code sur événement "Avant Maj" :
Merci à toi marot_r et bonne continuation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Sub Nom_Botanique_BeforeUpdate(Cancel As Integer) If (Not IsNull(DLookup("[Nom_Botanique]", "TblPlante", "[Nom_Botanique] ='" & Me.Nom_Botanique & "'"))) Then MsgBox "La fiche est déjà rentrée", vbOKOnly + vbDefaultButton1 + vbInformation + vbMsgBoxRight + vbMsgBoxRtlReading + vbMsgBoxSetForeground, "Jard'Intemporel" Cancel = True Me.Nom_Botanique.Undo End If End Sub
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager