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+
Vous voulez une réponse rapide et efficace à vos questions téchniques ?
Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.
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+
Vous voulez une réponse rapide et efficace à vos questions téchniques ?
Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.
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+
Vous voulez une réponse rapide et efficace à vos questions téchniques ?
Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.
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+
Vous voulez une réponse rapide et efficace à vos questions téchniques ?
Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.
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+
Vous voulez une réponse rapide et efficace à vos questions téchniques ?
Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.
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+
Vous voulez une réponse rapide et efficace à vos questions téchniques ?
Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.
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
Partager