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 :

quelle méthode utiliser pour une mise à jour sans les doublons


Sujet :

Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 52
    Points
    52
    Par défaut quelle méthode utiliser pour une mise à jour sans les doublons
    bonjour a tous,

    J'ai une très très grosse expérience d'utilisation d'access (environ 2 semaines). J'ai à disposition une base avec une table que je souhaite mettre à jour par importation d'un fichier Excel. Pour l'importation des données je n'ai pas de soucis. En revanche parmi ces données il y'en à plusieurs que j'ai déjà dans la table et donc j'obtiens plusieurs doublons. Je souhiate donc les supprimer pour n'en garder qu'un seul et tout ça dans la même table.

    Si vous avez une méthode à me proposer. Je souhaite que les utilisateurs qui feront les mises à jour n'aient qu'à se soucier de choisir le fichier .xls. La suppression des doublons (le nettoyage) se faisant automatiquement.



    J'ai actuellement déjà un code trouvé sur internet que j'essaie d'exploiter. Il est construit à base de recordset et ADO (un peu neuf pour moi). J'ai lu les tutos mais j'ai encore un peu de mal. J'ai réussi à peu près à l'exploiter mais j'ai encore qques erreurs :
    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
    77
    78
    79
    80
     
    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 lignes au moins 
     
    UneRequeteSelection = "SELECT UnChampDeRecherche, COUNT(UnChampDeRecherche) FROM Un_Nom_de_table GROUP BY UnChampDeRecherche HAVING COUNT(UnChampDeRecherche) > 1" 
     
    ChaineDeConnexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\maBase.mdb;User Id=admin;Password=;"
     
    '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 
            '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
    J'ai une erreur 3265 'impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé' au niveau de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneRequeteLigne = "SELECT UnChampDeRecherche,Champ1,Champ2,Champ3 FROM Un_Nom_de_table WHERE UnChampDeRecherche='" & UnRsSelection("UnChampDeRecherche") & "'"
    En fait j'ai mis un espion sur UnRsSelection et j'ai l'impression qu'il est vide. J'ai un peu de mal à saisir. Si vous pouviez m'eclairer.

    Je ne reste pas bloqué sur ce code et je suis ouvert à d'autres propositions de méthodes explicites bien sûr

    Merci d'avance

  2. #2
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    bjr,

    c'est bizarre ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         While Not UnRsSelection.EOF And UnRsSelection.BOF
    Il doit manquer un "Not" non? (personnellement je ne teste pas le BOF dans le While, je met un MoveFirst avant le While pour être sûr d'être correctement positionné)

    A priori au moment de l'erreur on est sur BOF (le While tel qu'il est écrit ne traite que le BOF) donc avant le premier enregistrement, il n'y a donc pas de valeur.

    La requête ne renvoie sûrement rien.

  3. #3
    Invité
    Invité(e)
    Par défaut Pour les doublons...
    Salut,

    Tu n'a pas moyen d'indexer le champ recherche de ta table avec l'option sans doublon, cela t'éviterai d'avoir le problème !

    A+

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 52
    Points
    52
    Par défaut
    Merci à vous deux.

    En fait j'ai parlé de mon soucis à mon voisin de bureau après 2 jours d'arrachage de cheveux et visiblement pour lui les recordset n'ont aucun secret. Je vais donc abandonner le code précédent et reprendre à zéro. Finalement c'est beaucoup plus clair pour moi donc ca devrait le faire.

    J'attends d'avoir fini mon code pour le poster et mettre un tag résolu.

    Merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 52
    Points
    52
    Par défaut
    J'aurai mis le temps mais finallement je suis arrivé au bout en je crois beaucoup plus simple. Ca tourne bien pour moi. J'espere que ce code en aidera qques un.

    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
    Private Sub SuppressionDesDoublons()
    Dim rSt As Recordset
     
    Dim valeurChamp As String
     
    Set rSt = CurrentDb.OpenRecordset("MaTable", dbOpenDynaset)
     
    rSt.MoveFirst
    valeurChamp = rSt.Fields![NomChamp]
    rSt.MoveNext
     
     
    While Not rSt.EOF
     
        If rSt![NomChamp] = valeurChamp Then
            rSt.Delete
        Else
            valeurChamp = rSt.Fields![NomChamp]
        End If
     
        rSt.MoveNext
     
    Wend
     
    End Sub
    Bon code!

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

Discussions similaires

  1. [MySQL] Utiliser la syntaxe d'un INSERT pour une mise à jour
    Par Concombre Masqué dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/05/2009, 21h14
  2. Pb de sous-requête pour une mise à jour
    Par Balthos dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 05/03/2008, 09h13
  3. Quelle méthode utiliser pour traiter les images
    Par babozfr dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 02/03/2007, 15h40
  4. Quelle méthode utiliser pour un formulaire
    Par sam01 dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2006, 16h42
  5. Réponses: 4
    Dernier message: 05/06/2005, 14h05

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