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

IHM Discussion :

Vérifier doublon après un LostFocus()


Sujet :

IHM

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Février 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Février 2006
    Messages : 110
    Points : 79
    Points
    79
    Par défaut Vérifier doublon après un LostFocus()
    Bonjour à tous.
    Dans mon formulaire, j'ai un champ "matricule" qui est une clé primaire.
    Je cherche une fonction qui, après un MATRICULE_LostFocus(), me dirait "attention, la valeur existe" si le matricule introduit existe déjà dans ma table_noms. Dans le cas contraire, je peux continuer à introduire mes données.

  2. #2
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 411
    Points : 239
    Points
    239
    Par défaut
    Bonjour monsieur,

    il te faudra charger tous les autres enregistrements dans un recorset où tu devras gérer la méthode EOF. Ainsi, à la perte du focus, la clé introduite est vérifiée avec tous les autres enregistrements du recordset. Si tu ne comprends pas bien tous ca, donnes nous plus de détails, nous allons tenter de t'aider

    bye

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Février 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Février 2006
    Messages : 110
    Points : 79
    Points
    79
    Par défaut
    voilà comment je m'y suis pris.
    J'ai refais un query, avec uniquement le champ "matricule" sur lequel je filtre suivant la valeur introduite dans mon formulaire "NOUVEAU".
    Sur mon formulaire "NOUVEAU", j'ai mis ceci dans une zone de texte: =CpteDom("[matricule]";"Query-MATRICULE EXIST")

    Si la valeur de retour est "1", c'est que le matricule existe déjà. Sinon, elle reste à "0".
    Je sais, c'est du chipotage. Mais je ne sais pas comment faire avec EOF.

  4. #4
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Tu peux simplement indexer ton champ sans doublons.

    Domi2

  5. #5
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 411
    Points : 239
    Points
    239
    Par défaut
    Bonjour m. bigounet

    bien sur monsieur bigounet. Cela n'est que du chipotage. Et dans la conçeption classique des bdd, il faudra éviter le plus possible d'écrire dans une base des éléments qu'on peut éviter et aussi des rédodances.

    Veuillez m'envoyer le nom de la table ainsi que le nom du champ matricule de la table. Ainsi je vais vous proposer un code qui vous fait ça.

    bye

  6. #6
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Février 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Février 2006
    Messages : 110
    Points : 79
    Points
    79
    Par défaut
    Pour Domi2, mon champ matricule est indexé et sans doublon. Mais je voulais avoir un msgbox qui me signale si le matricule que l'on vient d'introduire existe oui ou non. Le personnel qui introduit les données n'est pas forcément ingénieur et si un msg d'erreur apparait suite à ce doublon, ça va être "aïe, j'ai fait une boulette". Et donc je dois éviter les erreurs au maximum. Ce qui n'est pas évident.

    Pour vlksoft, la table s'appelle [Tb_NOMS] et le champ en question [matricule]
    Actuellement, j'ai 2708 enregistrements dans cette table.

  7. #7
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Re,

    2 méthodes possibles. Tu peux utiliser l'événement Sur erreur du formulaire (faire recherche avec "doublons" dans la FAQ)... Mais l'existence d'un doublon n'est testée qu'au moment de l'insertion de l'enregistrement dans la table.

    ou un peu de code :

    Nécessite la référence Microsoft DAO X.X Object Library

    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
    17
    18
    19
    Dim Db As DAO.Database, rst As DAO.Recordset
     
    Set Db = CurrentDb
     
    Set rst = Db.OpenRecordset("Tb_NOMS")
     
    rst.FindFirst "matricule =" & Me.MomDuChampMatricule.Value
     
    If Not rst.NoMatch Then
     
        MsgBox "Le numéro de matricule " & Me.MomDuChampMatricule.Value & "existe déjà !", , "Doublons"
     
    End If
     
    rst.Close
     
    Set rst = Nothing
     
    Set Db = Nothing
    Attention, pas testé...

    Domi2

  8. #8
    Membre éclairé Avatar de ft035580
    Profil pro
    Inscrit en
    Août 2004
    Messages
    689
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 689
    Points : 812
    Points
    812
    Par défaut
    Salut,

    Un simple DLookUp() ne suffirait il pas?

  9. #9
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Un simple DLookUp() ne suffirait il pas?
    Oui, mais probablement moins rapide...

    Enfin, c'est ce que j'ai cru compendre dans d'autres discussion...

    Domi2

  10. #10
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 411
    Points : 239
    Points
    239
    Par défaut
    Bonjour monsieur,

    Voici la procédure que je te propose de mettre sur l'événement "OnLostFocus comme tu le voulais. Mais ceci est une fonction qui sera appellée par l'événement en question.

    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
    17
    18
    19
    20
    21
    22
    23
     
     
    Function verification()
    Dim bd as database
    dim rst as recordset
    set db=currentdb
    set rst=db.opentable("Tb_Noms")
     
    Do while rst.EOF=False
         'On suppose que le nom du formulaire est FrmAgents
     
         If rst.fields![Matricule]=Forms![FrmAgents]![Matricule] then
            msgbox ("Cet agent est déjà enregistré")
           exit function
     
         Else
          rst.movenext
         end if
         rst.close
         set rst=nothing
         set db=nothing
    Loop
    End function
    Vous n'aurez qu'à remplacer le nom du formulaire et cela marche.

    bye

  11. #11
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    J'ai fait un essai sur une table de 38'000 - 39'000 enregistrements sur un champ numérique indexé (les données se présentent de manière séquentielle dans la table). Dorsale en réseau, frontale en local.

    Avec FindFirst, j'obtiens des temps compris en 350 et 450 millisecondes. Et entre 600 et 700 millisecondes avec DLookUp.

    Dans les 2 cas, j'ai également obtenu des temps supérieurs à la seconde (1 x tous les 10 -15 tests), probablement dû à un mauvais temps de réponse passager du réseau.

    Domi2

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/10/2008, 21h30
  2. Réponses: 2
    Dernier message: 18/09/2008, 14h52
  3. [Graphe] Vérifier connexité après retrait d'un sommet
    Par Nil_ct dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 17/01/2008, 16h19
  4. Vérifier doublon avec une variable
    Par Mario Rousson dans le forum VBA Access
    Réponses: 11
    Dernier message: 12/12/2007, 00h16

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