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

Access Discussion :

Contrôle de doublon avec DCount au cours d'enregistrements dans une Table [AC-2013]


Sujet :

Access

  1. #1
    Membre confirmé Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2009
    Messages
    1 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 135
    Points : 497
    Points
    497
    Par défaut Contrôle de doublon avec DCount au cours d'enregistrements dans une Table
    Bonsoir membres du forum,

    Je reviens à la recherche d'un code de Contrôle de doublons avec DCount au cours d'enregistrement de données dans une Table.
    Voici le code qui me permets d'enregistrer les données dans la table "Tbl_EVALUATION_NIVEAU_SCOLAIRE"
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Private Sub BtnEnregisterElevesComposants_Click()
    Dim stMsg As String
    Dim Itm As Variant
    Dim oDb As Database
    Dim oRS As Recordset
    Dim critere As String
     
    With Me.ListeELEVES_ANNEE_CLASSE
        '' contrôle saisie élèves
        If .ItemsSelected.Count = 0 Then Exit Sub
        'contrôle saisie Classe
        If IsNull(Me.lstClasse_Evaluation) Then
            MsgBox "Sélectionnez une classe.", vbCritical
            Me.lstClasse_Evaluation.SetFocus
            'Me.lstClasse_Evaluation.Dropdown  **** Pour dérouler le combobox à l'aide de la méthode DROPDOWN
            SendKeys "{F4}"      '*** Pour dérouler le combobox à l'aide de l'envoi de touche clavier (F4)
            Exit Sub
        End If
        stMsg = "Voulez-vous insérer les élèves suivants:" & vbCrLf
     
        For Each Itm In .ItemsSelected
            stMsg = stMsg & .Column(4, Itm) & vbCrLf
     
        Next Itm
     
     'Confirmer l'insertion des élèves
        stMsg = stMsg & "?"
        If MsgBox(stMsg, vbQuestion + vbYesNo) = vbNo Then Exit Sub
     
        Set oDb = CurrentDb
        Set oRS = oDb.OpenRecordset("Tbl_EVALUATION_NIVEAU_SCOLAIRE", dbOpenDynaset)
     
    ' ajout des éléments sélectionnés
        For Each Itm In .ItemsSelected
            critere = "[Nom_Prenoms_EleveComposant]=""" & .Column(4, Itm) _
            & """ and [NumInsCreleve]=" & .Column(2, Itm) _
            & " and [MleEleve]=" & .Column(3, Itm) _
            & " and [COMPOSITION]=" & Me.ListeComposition_Evaluation _
            & " and [NiveauCompositionFrancais]='" & Me.ListeNiveauEVALUATION & "'"
     
           Call oRS.FindFirst(critere) 'Cherche si il y a déjà un enregistrement avec ces valeurs
     
            ''If oRS.NoMatch Then
                    'L'enregistrement n'existe pas déjà, on va l'ajouter.
                    oRS.AddNew
     
                   oRS.Fields("NumEnregistreComposant") = f_NumAutoEnregistrementElevesComposants() + 1 '.Column(0, Itm)
     
                    oRS.Fields("Nom_Prenoms_EleveComposant") = .Column(4, Itm)
     
                    oRS.Fields("COMPOSITION") = Me.ListeComposition_Evaluation '.Column(2, Itm)
                    oRS.Fields("NiveauCompositionFrancais") = Me.ListeNiveauEVALUATION '.Column(2, Itm)
     
                    oRS.Fields("IdEcole") = Me.ID_ETABL_FREQ '.Column(9, Itm)
                    oRS.Fields("AnneeScol") = Me.ANNEE_SCOL '.Column(8, Itm)
     
                    oRS.Fields("NumInsCreleve") = .Column(2, Itm)
                    oRS.Fields("MleEleve") = .Column(3, Itm)
     
                    oRS.Update
     
           ''End If
     
        Next Itm
    ' enlever la sélection
        .RowSource = .RowSource
     
    ' affichage des éléments saisis
        Me.Refresh
        Me.ListeELEVES_ANNEE_CLASSE.Requery
        Forms("Frm_EvaluationScolaireElevesECIND").Tbl_EVALUATION_NIVEAU_SCOLAIRE_SFrm.Requery
        ListeELEVES_ANNEE_CLASSE.RowSource = ListeELEVES_ANNEE_CLASSE.RowSource
        End With
    Forms!Frm_EvaluationScolaireElevesECIND!CtlTabEVALUATION_COMPOSITION.Pages(1).SetFocus
     
    End Sub
    Apres la découverte de ces codes
    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 Nomlicencie_BeforeUpdate(Cancel As Integer)
    If IsNull(Me.Prenom) Then Exit Sub
    If DCount("*", "T_adherent", "Nomlicencie = """ & Me.Nomlicencie & """ and Prenom = """ & Me.Prenom & """") <> 0 Then
      MsgBox "Cet ajout ferait doublon !", vbCritical
      Cancel = True
    End If
    End Sub
     
    Private Sub Prenom_BeforeUpdate(Cancel As Integer)
    If IsNull(Me.Nomlicencie) Then Exit Sub
    If DCount("*", "T_adherent", "Nomlicencie = """ & Me.Nomlicencie & """ and Prenom = """ & Me.Prenom & """") <> 0 Then
      MsgBox "Cet ajout ferait doublon !", vbCritical
      Cancel = True
    End If
     
    End Sub
    à partir de cette discussionhttps://www.developpez.net/forums/d1...-cours-saisie/, je suppose qu'on devrait m'aider à traiter
    les doublons lors de l'enregistrement des données qui entrent dans la table de destination "Tbl_EVALUATION_NIVEAU_SCOLAIRE".

    Merci de savoir que je ne suis pas un expert en programmation.
    je vous signale que cette discussion est en rapport avec celle ci:
    https://www.developpez.net/forums/d2...ess-2e-partie/

    Cordialement.

  2. #2
    Modérateur

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

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

    Désolé je ne saisi pas bien ton besoin et il se peut que je réponde "à côté de la plaque".
    Pour la gestion de personne, utiliser le nom et le prénom comme identifiant unique n'est pas une super idée car tu peux avoir plusieurs personnes qui portent les mêmes noms et prénom.
    Cas un peu extrême mais j'ai eu un moment dans ma vie professionnelle où j'avais 12 personnes qui s'appelaient Martin ROY comme collègues.
    Dons il vaut mieux attribuer un numéro de personne.

    Ceci dit pour éviter les doublons il est plus prudent de mettre la protection au niveau de la table en utilisant un index unique.
    Pour ce faire tu vas dans ta table en mode création et tu demandes à voir les index (l'icône avec l'éclair).
    Dans la fenêtre qui s'ouvre tu mets sur une ligne blanche, dans la 1ère colonne le nom que tu veux pour ton index (ex : UniciteNumPersonne).
    Dans la seconde colonne, tu vas choisir le où les champs dont tu veux te servir. Si tu as plusieurs champs, tu mets juste le nom du champ sur la ligne, il ne faut pas répéter le nom de l'index.
    Une fois tous les champs sélectionnés, tu coches "Unique" en bas de de la fenêtre.
    Attention cette protection n'est pas parfaite, si un des champs est Null alors Access tolère les doublons.

    Une fois l'index unique en place Access va te retourner une erreur si l'enregistrement existe déjà mais attention seulement au moment où tu écris dans la table (MAJ, AJout) donc pas super confortable pour ton utilisateur car il a déjà tout entré.

    Personnellement, je fais mes contrôles au moment de la saisie dans l'événement Avant MAJ des champs concernés.
    Ici un exemple :

    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
    private function GererDoublon() as boolean
       dim result as boolean: result=false 'Par défaut ce n'est pas un doublon.
     
       if not isnull(me.nom) and not isnull(me.prenom) then
          'Il y a des infos, on peut contrôler.
          dim criteria as string
          criteria="[Nom]=""" & me.Nom & """ and [Prenom]=""" & me.Prenom & """"
     
          'Cherche si le nom et le prénom existent
          if dcount("*", "MaTable", criteria)<>0 then
                'Ils existent
                if vbYes=Msgbox("Attention il y a déjà un " me.Nom & " " & me.prenom & " dans les données, confirmez-vous la création ?", vbYesNo+vbDefaultButton1+vbQuestion) then
                      'Ce n'est pas un doublon
                      result=false
                   else
                       'Finalement c'est un doublon
                      result=true
               end if
          end if
       end if
       GererDoublon=result
    end sub
    Dans la procédure évènementielle associée à avant MAJ (BeforeUdate) mise à jour du Nom ou du Prénom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    'Teste si c'est un doublon et annule la modif éventuellement.
    if GererDoublon() then
        Cancel=Cint(true) 'Signale l'abandon de la modif
    end if
    A+

  3. #3
    Membre confirmé Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2009
    Messages
    1 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 135
    Points : 497
    Points
    497
    Par défaut
    Bonsoir membres du forum,
    bonsoir marot_r.
    Très très heureux de vous retrouver.
    Vos explications sont vraiment limpides. Ce qui me permets de vous envoyer la capture de ma table
    de destination de données "Tbl_EVALUATION_NIVEAU_SCOLAIRE":

    Nom : CaptureCOMPOSITION_ENTAMEE 8.JPG
Affichages : 292
Taille : 53,5 Ko qui est une table d'enregistrement des élèves dont le niveau est à
    évaluer d'une composition scolaire. Et dans une année scolaire, il y a 3 compositions.

    Et à chaque composition, je sélectionne les élèves présents à évaluer, ensuite les enregistrer dans la table "Tbl_EVALUATION_NIVEAU_SCOLAIRE" grace à la cmd Enregistrer les Elèves Composants Sélectionnés "BtnEnregisterElevesComposants" du formulaire "Frm_EvaluationScolaireElevesECIND".

    Nom : CaptureCOMPOSITION_ENTAMEE 4.JPG
Affichages : 295
Taille : 198,2 Ko
    Nom : CaptureCOMPOSITION_ENTAMEE 6.JPG
Affichages : 297
Taille : 177,0 Ko

    Donc ici l'insertion est effectuée directement dans la table mais pas à partir du formulaire. Ce qui m'amène à
    suggérer comment pourrais je adapter les codes que vous venez de me donnés, à
    Personnellement, je fais mes contrôles au moment de la saisie dans l'événement Avant MAJ des champs concernés.
    Ici un exemple :
    l'avant MAJ des données dans la table de destination en question ?
    Voir la piece jointe au dernier Post ici https://www.developpez.net/forums/d2...ess-2e-partie/
    Cordialement.

  4. #4
    Modérateur

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

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

    avant MAJ des données dans la table de destination en question ?
    Non vu, le processus que tu utilises mon idée n'est pas applicable.

    IL faut ajouter le contrôle soit avant de faire la boucle, soit dans la boucle en inventoriant au passage les enregistrements qui n'ont pu être créés.
    Je pense que la 2ième solution est la meilleur puisque tu ne vas pas annulé la création des lignes qui peuvent être créées, n'est-ce pas ?

    A+

  5. #5
    Membre confirmé Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2009
    Messages
    1 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 135
    Points : 497
    Points
    497
    Par défaut
    Citation Envoyé par marot_r Voir le message
    IL faut ajouter le contrôle soit avant de faire la boucle, soit dans la boucle en inventoriant au passage les enregistrements qui n'ont pu être créés.
    Je pense que la 2ième solution est la meilleur puisque tu ne vas pas annulé la création des lignes qui peuvent être créées, n'est-ce pas ?
    A+
    Bonsoir marot_r,
    C'est exact !
    Je vous rappelle encore une fois je ne suis un expert en programmation.
    je prie vous de me donner un exemple de code que je pourrais adapter à ma recherche.
    Merci infiniment de m'accorder des moments précieux de votre emploi du temps très chargé.
    Voici mes codes:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Private Sub BtnEnregisterElevesComposants_Click()
    Dim stMsg As String
    Dim Itm As Variant
    Dim oDb As Database
    Dim oRS As Recordset
    Dim critere As String
     
    With Me.ListeELEVES_ANNEE_CLASSE
        '' contrôle saisie élèves
        If .ItemsSelected.Count = 0 Then Exit Sub
        'contrôle saisie Classe
        If IsNull(Me.lstClasse_Evaluation) Then
            MsgBox "Sélectionnez une classe.", vbCritical
            Me.lstClasse_Evaluation.SetFocus
            'Me.lstClasse_Evaluation.Dropdown  **** Pour dérouler le combobox à l'aide de la méthode DROPDOWN
            SendKeys "{F4}"      '*** Pour dérouler le combobox à l'aide de l'envoi de touche clavier (F4)
            Exit Sub
        End If
        stMsg = "Voulez-vous insérer les élèves suivants:" & vbCrLf
     
        For Each Itm In .ItemsSelected
            stMsg = stMsg & .Column(4, Itm) & vbCrLf
     
        Next Itm
     
     'Confirmer l'insertion des élèves
        stMsg = stMsg & "?"
        If MsgBox(stMsg, vbQuestion + vbYesNo) = vbNo Then Exit Sub
     
        Set oDb = CurrentDb
        Set oRS = oDb.OpenRecordset("Tbl_EVALUATION_NIVEAU_SCOLAIRE", dbOpenDynaset)
     
    ' ajout des éléments sélectionnés
        For Each Itm In .ItemsSelected
            critere = "[Nom_Prenoms_EleveComposant]=""" & .Column(4, Itm) _
            & """ and [NumInsCreleve]=" & .Column(2, Itm) _
            & " and [MleEleve]=" & .Column(3, Itm) _
            & " and [COMPOSITION]=" & Me.ListeComposition_Evaluation _
            & " and [NiveauCompositionFrancais]='" & Me.ListeNiveauEVALUATION & "'"
     
           Call oRS.FindFirst(critere) 'Cherche si il y a déjà un enregistrement avec ces valeurs
     
            ''If oRS.NoMatch Then
                    'L'enregistrement n'existe pas déjà, on va l'ajouter.
                    oRS.AddNew
     
                   oRS.Fields("NumEnregistreComposant") = f_NumAutoEnregistrementElevesComposants() + 1 '.Column(0, Itm)
     
                    oRS.Fields("Nom_Prenoms_EleveComposant") = .Column(4, Itm)
     
                    oRS.Fields("COMPOSITION") = Me.ListeComposition_Evaluation '.Column(2, Itm)
                    oRS.Fields("NiveauCompositionFrancais") = Me.ListeNiveauEVALUATION '.Column(2, Itm)
     
                    oRS.Fields("IdEcole") = Me.ID_ETABL_FREQ '.Column(9, Itm)
                    oRS.Fields("AnneeScol") = Me.ANNEE_SCOL '.Column(8, Itm)
     
                    oRS.Fields("NumInsCreleve") = .Column(2, Itm)
                    oRS.Fields("MleEleve") = .Column(3, Itm)
     
                    oRS.Update
     
           ''End If
     
        Next Itm
    ' enlever la sélection
        .RowSource = .RowSource
     
    ' affichage des éléments saisis
        Me.Refresh
        Me.ListeELEVES_ANNEE_CLASSE.Requery
        Forms("Frm_EvaluationScolaireElevesECIND").Tbl_EVALUATION_NIVEAU_SCOLAIRE_SFrm.Requery
        ListeELEVES_ANNEE_CLASSE.RowSource = ListeELEVES_ANNEE_CLASSE.RowSource
        End With
    Forms!Frm_EvaluationScolaireElevesECIND!CtlTabEVALUATION_COMPOSITION.Pages(1).SetFocus
     
    End Sub
    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
    24
    25
    26
     ''FONCTION POUR CONTROLER LES DOUBLONS DE L'ENREGISTREMENT DES ELEVES
    ''COMPOSANTS PAR COMPOSITION, Niveau de Composition ET ANNEE SCOLAIRE, ECOLE
     
    Public Function fEstEleveDejaComposant(ETABL As Long, NumInsc As Long, Mleelv As Long, Ansco As String, Composi As Long, NivCompo As String) As Boolean
    On Error GoTo MOROBABOUMAR
    If IsNull(ETABL) Then Exit Function
    If IsNull(NumInsc) Then Exit Function
    If IsNull(Mleelv) Then Exit Function
    If IsNull(Ansco) Then Exit Function
    If IsNull(Composi) Then Exit Function
    If IsNull(NivCompo) Then Exit Function
    Dim db As Database
    Dim rst As Recordset
    Dim sql As String
        Set db = CurrentDb
        sql = "select * from Tbl_EVALUATION_NIVEAU_SCOLAIRE where  IdEcole = " & ETABL & "and NumInsCreleve =" & NumInsc & "and MleEleve =" & Mleelv & "and AnneeScol ='" & Ansco & "'and COMPOSITION =" & Composi & "and NiveauCompositionFrancais ='" & NivCompo & "'"
        Set rst = db.OpenRecordset(sql)
        If Not rst.EOF Then
            fEstEleveDejaComposant = True
            Else
            fEstEleveDejaComposant = False
        End If
    Exit Function
    MOROBABOUMAR:
        MsgBox "Erreur n° " & err.Number & vbCrLf & err.description, vbCritical + vbOKOnly, "Une erreur est survenue"
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    '__Appel de la fonction de doublons dans le code de la commande BtnEnregisterElevesComposants_Click
    If fEstEleveDejaComposant(Me.ID_ETABL_FREQ, _
    Me.NumInscriptionEleveInscrit, _
    Me.Mleeleve, Me.ANNEE_SCOL, _
    Me.ListeComposition_Evaluation, _
    Me.ListeNiveauEVALUATION) = True Then
        MsgBox "ATTENTION !!" & vbCrLf & "Cet élève est déjà sur la liste des composants pour cette : " _
        & Me.ListeNiveauEVALUATION.Column(1), vbCritical + vbOKOnly, "Risque de Doublons"
    End If
    'Exit Sub
    '_________________________
    Cordialement.

  6. #6
    Membre confirmé Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2009
    Messages
    1 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 135
    Points : 497
    Points
    497
    Par défaut DISCUSSION RESOLUE
    Cette discussion est résolue ici https://www.developpez.net/forums/d2...ess-2e-partie/

    Merci infiniment marot_r.
    Cordialement.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/05/2009, 17h56
  2. Réponses: 2
    Dernier message: 27/04/2009, 23h01
  3. [SQL] Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/08/2006, 13h28
  4. Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/08/2006, 13h21

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