IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

MsgBox indiquant que la valeur d'une zone de texte existe déjà [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 21
    Points
    21
    Par défaut MsgBox indiquant que la valeur d'une zone de texte existe déjà
    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

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    la valeur entrée est déjà présente dans un champs.
    Dans une table ? Dans un formulaire ?

    Peux-tu préciser ?

    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    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.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    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+

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    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:
    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
    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).

    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

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    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).
    Que fais ta macro "Actualiser" ? Peux-tu poster le code ?

    A+

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    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+

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    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.

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    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+

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    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+

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    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+

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    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" :
    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
    Merci à toi marot_r et bonne continuation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 28/02/2006, 09h36
  2. Convertir une valeur d'une zone de texte en date
    Par os_rasta dans le forum ASP
    Réponses: 17
    Dernier message: 27/02/2006, 15h56
  3. Réponses: 40
    Dernier message: 24/02/2006, 14h19
  4. Réponses: 1
    Dernier message: 02/12/2005, 05h18
  5. Réponses: 6
    Dernier message: 30/09/2005, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo