Supprimer les doublons d'une table sans clé

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 578 fois - Téléchargée 29 fois

Contenu du snippet

Il peut souvent nous arriver de supprimer les doublons d'une table qui n'a pas de clé. Ce qui fait que lorsque l'on supprimer les lignes contenant une valeur dédoublée, on peut totatelement supprimer les lignes contenant cette même valeur de la table sans pour autant en garder une.
Ce programme permettra par exemple s'il ya 4 lignes sur la table qui contiennent les mêmes valeurs de supprimer les 3 lignes et d'en garder une.

Source / Exemple :


Public UnObjectConnexion As ADODB.Connection
Public ChaineDeConnexion As String

'Créer un bonton de commande ayant pour nom "CmdExecuter"
Private Sub CmdExecuter_Click()
Dim Resultat As Boolean
Dim UnRsSelection As ADODB.Recordset
Dim uneRequeteLigne As String
Dim UneRequeteSelection As String
Dim unRsligne As ADODB.Recordset
Dim Champ1, Champ2, Champ3, ChampDeRecherche As String
Set unRsligne = New ADODB.Recordset
Set UnRsSelection = New ADODB.Recordset
'Cette requête permet de sélectionner les lignes de la table pour lesquelles la valeur "UnChampDeRecherche" apparait sur 2 ligne au moins

UneRequeteSelection = "SELECT UnChampDeRecherche, COUNT(UnChampDeRecherche) FROM Un_Nom_de_table GROUP BY UnChampDeRecherche HAVING COUNT(UnChampDeRecherche) > 1"
'Paramétrer cette chaîne de connexion à votre guise pour accéder à votre base de données
'ici j'utilise une chaine de Connexion ODBC qui se connecte à une base de données SQL SERVER
ChaineDeConnexion = "Provider=MSDASQL;DSN=dsnEffacerDoublons;DATABASE=BdEffacerDoublons;UID=sa; PWD="

'fait appel à la procédure d'ouverture de connexion, située plus bas
'en paramètre un booléen pour tester si la connexion s'est bien déroulée
Call OuvertureConnexion(UnObjectConnexion, GlChaineDeConnexion, Resultat)
UnRsSelection.Open UneRequeteSelection, UnObjectConnexion, adOpenStatic, adLockReadOnly
'boucler sur les lignes ayant des doublons
    While Not UnRsSelection.EOF And UnRsSelection.BOF
        uneRequeteLigne = "SELECT UnChampDeRecherche,Champ1,Champ2,Champ3 FROM Un_Nom_de_table WHERE UnChampDeRecherche='" & UnRsSelection("UnChampDeRecherche") & "'"
        unRsligne.Open uneRequeteLigne, UnObjectConnexion, adOpenStatic, adLockReadOnly
        RaisonSocial = unRsligne("RaisonSociale")
        'ranger Une valeur de ligne dans des variables
        ChampDeRecherche = unRsligne("UnChampDeRecherche")
        Champ1 = unRsligne("Champ1DeLaTable")
        Champ2 = unRsligne("Champ2DeLaTable")
        Champ3 = unRsligne("Champ3DeLaTable")
        'Supprimer ttes les lignes de doublons
        UnObjectConnexion.Execute "DELETE FROM Un_Nom_de_table WHERE UnChampDeRecherche='" & ChampDeRecherche & "'"
        'Insérer une ligne unique
        UnObjectConnexion.Execute "INSERT INTO Un_Nom_de_table VALUES ('" & ChampDeRecherche & "', '" & Champ1 & "', '" & Champ2 & "','" & Champ3 & "')"
        'fermeture du recordset
        unRsligne.Close
        UnRsSelection.MoveNext
    Wend
MsgBox "Traitement effectué avec succès"
Call FermetureConnexion(UnObjectConnexion, Resultat)
Unload Me
End Sub

Public Sub OuvertureConnexion(ByRef objconnexion As ADODB.Connection, ByVal ChaineConnexion As String, ByRef Resultat As Boolean)

        On Error GoTo ErreurOuvertureConnexion
        Set objconnexion = New ADODB.Connection
        objconnexion.CommandTimeout = 960
        objconnexion.Open ChaineConnexion
        Resultat = True

ExitOuvertureConnexion:
    Exit Sub

ErreurOuvertureConnexion:
    Resultat = False
    MsgBox Err.Number
    MsgBox "Erreur d'ouverture de Connexion..." & "Chaine = " & ChaineConnexion & "..." & Err.Description & " " & Err.Number
    GoTo ExitOuvertureConnexion
End Sub

Sub FermetureConnexion(ByRef objconnexion As ADODB.Connection, ByRef Bsucces As Boolean)

On Error GoTo ErreurFermetureConnexion
    Bsucces = False
    If Not objconnexion Is Nothing Then
        Set objconnexion = Nothing
        Bsucces = True
    End If
ExitFermetureConnexion:
    Exit Sub
ErreurFermetureConnexion:
    MsgBox "Erreur fermeture de Connexion..." & Err.Description
    GoTo ExitFermetureConnexion
End Sub

Conclusion :


Ciao et à bientôt pour d'autres sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
1/
bein le mieux serait d'ajouter une contrainte d'unicité ou une clé primaire....
d'autant plus que si l'un des champs de ta table est utilisée comme foreign key, ton process ne fonctionnera pas...
de plus, tu utilises un champs de recherche donc ce champs doit être unique d'où la contrainte d'unicité...
2/
le processus que tu mets en place peut être trèèèèèèès long (essaie avec une table avec 1'000'000 d'enregistrements)
3/
c'est pas très 'souple', ta requête et tes champs sont 'hardcodés'.
4/merci quand même ....:)
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
1/
bein le mieux serait d'ajouter une contrainte d'unicité ou une clé primaire....
d'autant plus que si l'un des champs de ta table est utilisée comme foreign key, ton process ne fonctionnera pas...
de plus, tu utilises un champs de recherche donc ce champs doit être unique d'où la contrainte d'unicité...
2/
le processus que tu mets en place peut être trèèèèèèès long (essaie avec une table avec 1'000'000 d'enregistrements)
3/
c'est pas très 'souple', ta requête et tes champs sont 'hardcodés'.
4/merci quand même ....:)
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
1/
bein le mieux serait d'ajouter une contrainte d'unicité ou une clé primaire....
d'autant plus que si l'un des champs de ta table est utilisée comme foreign key, ton process ne fonctionnera pas...
de plus, tu utilises un champs de recherche donc ce champs doit être unique d'où la contrainte d'unicité...
2/
le processus que tu mets en place peut être trèèèèèèès long (essaie avec une table avec 1'000'000 d'enregistrements)
3/
c'est pas très 'souple', ta requête et tes champs sont 'hardcodés'.
4/merci quand même ....:)
Messages postés
1222
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018

Un lien sur elle-même : il faut ajouter deux fois la table dans l'éditeur de requete et faire le joint sur la clé, meme si ce n'est pas une vrai clé : c'est justement le champ à dédoublonner.
Il y a sans doute un moyen de conserver la première occurence et de supprimer les suivantes. Sans utiliser de requete, il y a une astuce qui marche à tout les coups :
DÉDOUBLONNER FACILEMENT UNE TABLE MS ACCESS ET VOIR LA LISTE DES DOUBLONS
www.vbfrance.com/code.aspx?ID=16634
Messages postés
12
Date d'inscription
mercredi 10 décembre 2003
Statut
Membre
Dernière intervention
28 octobre 2006

Il faut se dire que la table n'a pas de clé. Et que qu'il faut supprimer toutes les lignes dédoublées et en garder une.
Avec une requête du genre "DELETE FROM Un_nom_deTable where UnchampDeRecherche='" & ChampDeRecherche & "'", Toutes les lignes ayant la valeur ChampDeRecherche dans la colonne UnChampDeRecherche sont supprimées. Donc l'astuce est de stocker cette valeur dans des variables et d'ajouter les valeurs contenues dans ces variables dans la table après lancement de la requête de suppression.
mais je veux aussi savoir ce que signifie "un lien sur elle-même"?
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.