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 :

Eviter les doublons sur deux critères [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 384
    Points : 136
    Points
    136
    Par défaut Eviter les doublons sur deux critères
    Bonjour,

    J'aimerais éviter des doublons, mais sur deux critères, je m'explique...

    Structure:
    Une table [Personnes], contenant les champs ID, Nom et Prénom
    Une table (Encodage], contenant plusieurs champs, dont un champ [Année] (2018,2019,2020,2021...) et une liste déroulante contenant la table [Personnes]
    Un formulaire reprenant le table [Encodage]

    Demande :
    J'aimerais pouvoir encoder par exemple:
    • LOUIS Lambert avec l'année 2019
    • LOUIS Lambert avec l'année 2020
    • ...


    Mais surtout, ne pas pouvoir encoder:
    • LOUIS Lambert avec l'année 2019
    • LOUIS Lambert avec l'année 2019


    Auriez-vous une astuce pour cela ? Car il est très simple d'empêcher un doublon via l'option (Sans doublons), mais juste pour un champ...

    Merci d'avance pour votre aide

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Bonjour.

    Tu peux utiliser un index unique composé pour cela :

    1. Tu vas dans ta table en mode conception.
    2. Tu appuis sur l'icône Index (celle avec l'éclair)
    3. Sur une ligne vierge dans la 1ère colonne tu donnes un nom à ton index (ex : Unicite) puis dans la seconde colonnes tu choisis le champs idPersonne.
    4. En bas sous les lignes, tu coches "Unique".
    5. Sur la ligne en dessous, dans la 2ième colonne, tu choisis l'année.


    Attention il y a 2 soucis avec cette solutions :
    1. Tu n'es prévenu du doublon qu'au moment de la confirmation de l'ajout ou de la modification.
      Si tu veux autre chose que le message standard, il faut prévoir du code dans l'événement Sur Erreur du formulaire.
    2. Si un des champs est null, Access ne voit plus l'unicité.
      Donc tu peux avoir un nombre infini de IdPersonne, Null ou de Null, Annee.
      Si c'est une possibilité, il faut du code pour valider cela et l'empécher.


    A+

  3. #3
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 859
    Points : 14 977
    Points
    14 977
    Par défaut
    bonjour CrasherSEP et marot_r
    Attention il y a 2 soucis avec cette solutions :

    Tu n'es prévenu du doublon qu'au moment de la confirmation de l'ajout ou de la modification.
    Si tu veux autre chose que le message standard, il faut prévoir du code dans l'événement Sur Erreur du formulaire.
    Si un des champs est null, Access ne voit plus l'unicité.
    Donc tu peux avoir un nombre infini de IdPersonne, Null ou de Null, Annee.
    Si c'est une possibilité, il faut du code pour valider cela et l'empécher.
    une illustratoin de la proposition de marot_r
    MAIS on peut empêcher la saisie de valeur nulle avec la propriété Nul interdit à Oui:

    Nom : _pkcomp.JPG
Affichages : 693
Taille : 51,2 Ko
    et le message d'erreur de doublon apparait lors de la saisie:

    Nom : _dblidx1.JPG
Affichages : 656
Taille : 39,9 Ko

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 384
    Points : 136
    Points
    136
    Par défaut
    Bonjour,

    Super ! Merci beaucoup, je regarde à cela tantôt...

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 384
    Points : 136
    Points
    136
    Par défaut
    Bonjour,

    Super cela fonctionne :-)

    Est-il possible de modifier le message affiché lors d'un doublon ? Que dois-je mettre dans [Avant enregistrement] pour afficher un message d'erreur ?

    J'aimerais aussi que le test se fasse dès l'ajout d'une personne ou de l'année, ne pas attendre la fin de tout l'encodage pour voir qu'il y a un problème à la base... donc faire qu'[Après mise à jour] l'enregistrement se fasse automatiquement... :-)

    Merci pour votre aide :-)

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 859
    Points : 14 977
    Points
    14 977
    Par défaut
    bonjour,
    Que dois-je mettre dans [Avant enregistrement] pour afficher un message d'erreur ?
    Est-ce que l'évènement [Avant enregistrement] correspond à [Avant MAJ] ou BeforeUpdate dans la version 2007 ?

    Peu importe car ce n'est pas ici qu'il faut trapper l'erreur, c'est dans Form.Error [Sur erreur].
    Un exemple ici:https://docs.microsoft.com/fr-FR/off...ess.Form.Error

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 384
    Points : 136
    Points
    136
    Par défaut
    J'aimerais sur l'erreur afficher une boîte de dialogue me donnant soit le choix de modifier les champs, soit de simuler un Esc, mais mon code ne fonctionne pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
    If MsgBox("Voulez-vous faire une remise à zéro !", vbYesNo + vbInformation, "Message") = vbYes Then
           SendKeys "{Escape}"
        Else
           MsgBox "Modifiez les champs !", vbInformation, "Message"
        End If
    End Sub

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 859
    Points : 14 977
    Points
    14 977
    Par défaut
    pourquoi faire compliqué ?
    le SendKeys "{Escape}" est la pire des solutions d'autant plus que la commande Undo fait la même chose.
    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
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
        Select Case DataErr
            Case 3022      ' doublon dans un index
                MsgBox "Cette valeur existe déjà dans la table"    ' ici ton message personnalisé 
                Response = acDataErrContinue
                If Me.NewRecord Then   ' si c'est un nouvel enregistrement
                    Me.Undo         ' Annulation complète de la saisie (même effet que la touche Echap)
                Else
                    Me.ActiveControl.Value = Me.ActiveControl.OldValue  ' on restaure l'ancienne valeur si c'est un enregistrement existant
                End If
            Case Else
                Response = acDataErrDisplay
        End Select
     
    End Sub

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 384
    Points : 136
    Points
    136
    Par défaut
    Super, cela fonctionne nickel :-)
    Merci :-)

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 859
    Points : 14 977
    Points
    14 977
    Par défaut
    de rien. Si cela fonctionne n'oublie pas de fermer la discussion (bouton )

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 384
    Points : 136
    Points
    136
    Par défaut
    Bonjour,

    J'ai un problème... lorsque ma réponse est "Non", il n'y a pas de problème, mais lorsque ma réponse est "Oui", il faudrait que mes trois champs soient en [Enabled = True] et cela ne fonctionne pas..., j'ai l'impression que la ligne n'est même pas lue...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Select Case DataErr
            Case 3022      ' doublon dans un index
                MsgBox "Cette fiche existe déjà pour ce bénéficiaire "    ' ici ton message personnalisé
                Response = acDataErrContinue
                If Me.NewRecord Then   ' si c'est un nouvel enregistrement
                    If MsgBox("Voulez-vous pouvoir modifier le nom ou l'année ?", vbYesNo, "Titre") = vbNo Then Me.Undo: DoCmd.GoToRecord , , acFirst     ' Annulation complète de la saisie (même effet que la touche Echap)
                Else
                Me.AFFILIE.Enabled = True: Me.ANNEE_EN_COURS.Enabled = True: Me.COMPTE_BANQUE.Enabled = True
                End If
            Case Else
                Response = acDataErrDisplay
        End Select
    Une idée ?

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 859
    Points : 14 977
    Points
    14 977
    Par défaut
    bonjour,
    tu persistes dans la complexité... ce n'est pas ce que je t'ai conseillé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    If MsgBox("Voulez-vous pouvoir modifier le nom ou l'année ?", vbYesNo, "Titre") = vbNo Then Me.Undo: DoCmd.GoToRecord , , acFirst     ' Annulation complète de la saisie (même effet que la touche Echap)
                Else
                Me.AFFILIE.Enabled = True: Me.ANNEE_EN_COURS.Enabled = True: Me.COMPTE_BANQUE.Enabled = True
                End If
    Ici il faut faire un Me.Undo et rien d'autre ...

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 384
    Points : 136
    Points
    136
    Par défaut
    Ok

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

Discussions similaires

  1. comment chercher les doublons sur deux champs (ou plus)
    Par alili mostafa dans le forum Bases de données
    Réponses: 4
    Dernier message: 31/05/2010, 20h09
  2. [AC-2003] Eviter les doublons entre deux tables
    Par soleil_levant dans le forum Modélisation
    Réponses: 1
    Dernier message: 23/06/2009, 18h29
  3. Réponses: 10
    Dernier message: 18/07/2007, 18h36
  4. Eviter les doublons sur un champ SQL Serveur 2005
    Par crashyear dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/12/2006, 09h02
  5. [Access] supprimer les doublons sur deux champs
    Par nini94 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 13/10/2006, 12h41

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