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 :

Recherche doublons entre tables


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    Bonjour,
    J'ai 2 tables: A (table Access avec une vingtaine de champs) et une seconde B (issue de l'importation de fichiers Xls)
    Les 2 tables ont des champs identiques.

    Je voudrais comparer les 2 tables afin de rechercher les enregistrements identique entre A et B.
    La comparaison doit se faire sur tous les champs.
    S'il en existent, les supprimer de B avant de transférer les enregistrements restant dans A, puis vider B afin de la remplir de nouveau par un autre fichier Xls.
    L'importation et le vidage de B, je sais faire.
    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 394
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    Bonjour,

    Partant de 2 tables Table1 <Champ1, Champ2, Champ3> et Table2 <Champ1, Champ2, Champ3>.

    Pour supprimer les enregistrements de Table2 présents dans Table1 :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE
    FROM Table2
    WHERE Exists (select * from Table1 where (Table2.Champ1=[Table1].[Champ1]) AND (Table2.Champ2=[Table1].[Champ2]) AND (Table2.Champ3=[Table1].[Champ3]));

    Pour ajouter les enregistrements restant de Table2 dans Table1 :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO Table1 ( Champ1, Champ2, Champ3 )
    SELECT Table2.Champ1, Table2.Champ2, Table2.Champ3
    FROM Table2;

    Cdlt

  3. #3
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    Merci pour la réponse,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE
    FROM Table2
    WHERE Exists (select * from Table1 where (Table2.Champ1=[Table1].[Champ1]) AND (Table2.Champ2=[Table1].[Champ2]) AND (Table2.Champ3=[Table1].[Champ3]));
    mais ne fonctionne pas = erreur sur DELETE (sub ou fonction non définie).
    J'ai écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CurrentDb.Execute "Delete"
        FROM "table 2" _
         & " WHERE Exists (select * from [table 2] " _
         & " where (table 2.X=[table 1].[X])" _
    etc... pour nommer tous les champs.
    Même erreur sur le FROM
    Est-ce une erreur de syntaxe.
    Merci

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 394
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    Bonjour,

    Ce n'est pas tout à fait ce que j'ai écris.

    Essayez ceci pour 3 champs X, Y, Z issus de 2 tables (Table 1 et Table 2):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Dim strSQL As String
     
        strSQL = "DELETE " & _
                  "FROM [table 2] " & _
                  "WHERE Exists (select * from  [table 1] where ([table 2].X=[table 1].X) and ([table 2].Y=[table 1].Y) and ([table 2].Z=[table 1].Z))"
     
        CurrentDb.Execute strSQL, dbFailOnError

    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Dim strSQL As String
     
        strSQL = "DELETE " & _
                  "FROM [table 2] " & _
                  "WHERE Exists (select * from  [table 1] where ([table 2].champ1=[table 1].champ1) and ([table 2].champ2=[table 1].champ2) and ([table 2].champ3=[table 1].champ3))"
     
        CurrentDb.Execute strSQL, dbFailOnError
    Cdlt

  5. #5
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    Merci pour cette réponse,
    Mais quelle syntaxe utiliser pour scinder sur plusieurs ligne la condition WHERE, de façon à mettre sur des lignes différentes les "AND"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE Exists (select * from  [table 1] where ([table 2].X=[table 1].X) and ([table 2].Y=[table 1].Y) and ([table 2].Z=[table 1].Z))"
    Test: exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE Exists (select * from  [table 1] where ([table 2].X=[table 1].X) 
     and ([table 2].Y=[table 1].Y)
     and ([table 2].Z=[table 1].Z))"
    car avec une vingtaine de champs, il sera plus facile de vérifier les champs.
    Merci.

  6. #6
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    Salut
    Si cela peut vous aider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    strSQL = "DELETE" _
                & " FROM [table 2]" _
                & " WHERE EXISTS (SELECT * FROM [table 1]" _
                & " WHERE ([table 2].champ1=[table 1].champ1)" _
                & " AND ([table 2].champ2=[table 1].champ2)" _
                & " AND ([table 2].champ3=[table 1].champ3))"

  7. #7
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    Bonjour,
    En effet cette syntaxe fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    strSQL = "DELETE" _
                & " FROM [table 2]" _
                & " WHERE EXISTS (SELECT * FROM [table 1]" _
                & " WHERE ([table 2].champ1=[table 1].champ1)" _
                & " AND ([table 2].champ2=[table 1].champ2)" _
                & " AND ([table 2].champ3=[table 1].champ3))"
    Par contre, le code ne fonctionne pas
    Si j'importe deux fois le même fichier XLS, de la table 2 dans la table 1, il ne trouve aucune correspondance et recopie intégralement la table 2 dans la table 1.
    Donc je me retrouve avec des enregistrements en doublons.

    Merci

  8. #8
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    re,
    Il serait peut-être temps de nous fournir un extrait de votre bdd et du fichier Excel.
    Je pense que le problème déjà évoqué dans un autre billet Tbl_D, tbl_C et une tbl_intermédiaire ne fonctionne toujours pas comme vous voudriez que cela fonctionne.
    Je crois toujours que vous importez un fichier Excel qui contient la liste des Départements et des Communes de France et que vous souhaitez ventiler ce fichier dans vos 2 tbl. Je me trompe peut-être.

  9. #9
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    Bonjour,
    Affectivement, cela n’a rien à voir avec de tables Communes et Département.
    Il s'agit de fichiers XLS récapitulant des décès, que je transfert dans une table Access.
    L'import se fait dans une table Décès Import par le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Créer un objet FileDialog pour ouvrir explorateur windows
        Set fd = Application.FileDialog(msoFileDialogOpen)
        'Titre de la boîte de dialogue
        fd.Title = "Sélectionnez un fichier..."
        'Ne pas autoriser la sélection multiple, un seul fichier est sélectionnable
        fd.AllowMultiSelect = False
        'Afficher la boîte de dialogue
        If fd.Show() Then
            MsgBox "Vous avez sélectionné le fichier : " _
            & vbCrLf & fd.SelectedItems(1), vbInformation
        End If
        'Execute l'importation
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel97, "tblDecesImport", fd.SelectedItems(1), True
    Je veux contrôler s'il existe des enregistrements commun entre table décès et table tblDecesImport. Si oui, supprimer les enregistrements en double dans tblDecesImport avant l'importation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    strSQL = "DELETE" _
                & " FROM [tblDecesImport]" _
                & " WHERE EXISTS (SELECT * FROM [tblDeces]" _
                & " WHERE ([tblDecesImport].champ1=[tblDeces].champ1)" _
                & " AND ([tblDecesImport].champ2=[tblDeces].champ2)" _
                & " AND ([tblDecesImport].champ3=[tblDeces].champ3))"
    CurrentDb.Execute strSQL, dbFailOnError
    Je mets à jour la table tblDeces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     'On met à jour la table
        CurrentDb.Execute "INSERT INTO tblDeces" _
            & " In " & Chr(34) & CheminFichier & Chr(34) _
            & " SELECT tblDecesImport.*" _
            & " FROM tblDecesImport", dbFailOnError
    Puis vidage de la table tblDecesImport pour importer d'autres fichiers Xls
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "DELETE * FROM tblDecesImport"
    Il manque peut-être une actualisation après le contrôle de doublons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strSQL = "DELETE" _
                & " FROM [tblDecesImport]" _?
    Merci

  10. #10
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    re
    essayez ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    strSql = "DELETE tblDecesImport.*" _
        & " FROM tblDecesImport" _
        & " INNER JOIN tblDeces ON (tblDecesImport.champ1 = tblDeces.champ1)" _
        & " AND (tblDecesImport.champ2 = tblDeces.champ2)" _
        & " AND (tblDecesImport.champ3 = tblDeces.champ3)" _
        & " AND (tblDecesImport.champ4 = tblDeces.champ4)"

  11. #11
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour tous,

    La requête de User est correct et va effectivement supprimer les enregistrements en double. Cependant je regarde le code de Pascalpir et ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     'On met à jour la table
        CurrentDb.Execute "INSERT INTO tblDeces" _
            & " In " & Chr(34) & CheminFichier & Chr(34) _
            & " SELECT tblDecesImport.*" _
            & " FROM tblDecesImport", dbFailOnError
    on parle d'une table qui ne fait pas partie de la Bd en cours. Alors si c'est le cas, est-ce que la table "tblDeces" est une table liée. Si oui le code ci-haut est inutile on pourrait insérer directement (sans la ligne 3). Si ce n'est pas le cas, on fait une vérification sur une table locale (code de User ou celui d'hyperion13) et on injecte dans une table externe ce qui fait qu'on ne vérifie pas la bonne table.

    Bonne journée

  12. #12
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    re,
    @Robert1957 je confirme la bdd distante, voir ici.
    Il y a donc fort à parier qu'on travaille sur 2 bdd.
    Dans ce cas, le plus simple serait, dans la bdd dans laquelle on importe les données d'Excel, de créer une qry distante du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM [;DATABASE=C:\Users\...\mabdd.accdb].tbl_deces
    et pour le DELETE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    strSql = "DELETE tbl_decesimport.*" _
        & " FROM tbl_decesimport" _
        & " INNER JOIN qry_01_deces ON (tbl_decesimport.noms = qry_01_deces.noms)" _
        & " AND (qry_01_deces.adresses = tbl_decesimport.adresses)" _
        & " AND (qry_01_deces.villes = tbl_decesimport.villes)" _
        & " AND (qry_01_deces.nam = tbl_decesimport.nam)" _
        & " AND (qry_01_deces.dte = tbl_decesimport.dte)"
    CurrentDb.Execute strSql, dbFailOnError
    et pour le INSERT INTO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    strSql = "INSERT INTO tbl_deces (noms, adresses, villes, nam, dte)" _
        & " In 'C:\Users\...\mabdd.accdb'" _
        & " SELECT noms, adresses, villes, nam, dte" _
        & " FROM tbl_decesimport"
    CurrentDb.Execute strSql, dbFailOnError

  13. #13
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    Re.
    Joint les relations des tables qui sont dans la même base de données
    Nom : Tables.png
Affichages : 315
Taille : 4,9 Ko
    La tblDecesImport me sert pour l'import Xls.
    Je voudrais la comparer avec tblDeces por trouver les enregistrement communs sur tous les champs des 2 tables.
    Après vérification, suppression des enregistrements commun dans la tblDecesImport.
    Mise à jour de la tblDecesImport avec les enregistrements restant.
    Puis transfert dans tblDeces.
    Après transfert, vidage de la tblDecesImport pour recommancer avec d'autres fichiers Xls
    Merci

  14. #14
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour hyperion13,

    Effectivement j'ai même répondu, j'avais oublié. Alors si on parle aux bonnes tables, votre code ou celui de User devrait fonctionner. De plus on pourrait sauter une étape avec votre code en prenant des "LeftJoin" et injecter seulement les lignes qui n'existent pas dans la table tblDeces avec un "WHERE IsNull ".

    Bonne journée

  15. #15
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    Re
    Pourriez-m'expliquer un peut plus ,en reprenant mes lignes de code, si ce n'est pas trop abuser.
    J’essaie de construire une base pour une association et étant autodidacte et ne maitrise pas tout, j'essaye de ma débrouiller avec le forum
    Merci pour le temps passé.

  16. #16
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    Nous avons bien compris que la tblDecesImport,est alimentée à chaque fois que vos importez des données d'Excel.
    Là où il subsiste un doute c'est la localisation de la tblDeces.
    - dans votre Post#9, le 3ème code (INSERT INTO) nous indique que tblDeces,est située dans une bdd externe et que tblDecesImport,est dans la bdd en cours d'utilisation. Code ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     'On met à jour la table
        CurrentDb.Execute "INSERT INTO tblDeces" _
            & " In " & Chr(34) & CheminFichier & Chr(34) _
            & " SELECT tblDecesImport.*" _
            & " FROM tblDecesImport", dbFailOnError
    - dans votre Post#13, la capture est à contrario, car tblDeces,et tblDecesImport, sont dans la même bdd.
    Citation Envoyé par Pascalpir Voir le message
    ...
    Nom : Tables.png
Affichages : 315
Taille : 4,9 Ko
    La tblDecesImport me sert pour l'import Xls.

  17. #17
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    Re
    votre réponse :dans votre Post#13, la capture est à contrario, car tblDeces,et tblDecesImport, sont dans la même bdd.
    C'est ceci qui est bon, j'ai du me tromper dans l'autre post 9.
    Excuser moi

  18. #18
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    re
    - img1 classeur Excel qui contient les données que l'on souhaite importer dans une tbl.
    - img2 tblDeces formatée tel le classeur. Tous les champs sont de type texte, sauf dte (date) et id (NumAuto).
    (contient déjà 91 enregistrements- 1ère importation)
    - img3 tblDecesImport à l'identique de tblDeces et qui est alimentée à chaque importation puis vidée.
    (contient 1 enregistrement qui n'existe pas dans tblDeces - 2ème importation)
    Le code qui anime tout ceci.
    Dans un module standard
    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
    Option Explicit
    Function GetFilePath() As String
    'Référence VBA :    Microsoft Office xx.x Object Library
    Dim strFilePath As String, strSlash As String, strFolder As String, strFileName As String
     
    strFilePath = CurrentProject.Path
    strSlash = "\"
    strFolder = "fichiersXL"
    strFilePath = strFilePath & strSlash & strFolder & strSlash 'C:\Users\Public\Documents\bdd\fichiersXL\
     
    With Application.FileDialog(1)
        .AllowMultiSelect = False
        .Title = "Sélectionnez un fichier"
        .ButtonName = "Sélectionner"
        .InitialFileName = strFilePath
        .InitialView = msoFileDialogViewDetails
        With .Filters
            .Clear
            .Add "Fichiers Excel", "*.xls, *.xlsx"
        End With
            If .Show Then
                GetFilePath = .SelectedItems(1)
            End If
    End With
    End Function
    Sur un event Click() d'un form
    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
    Private Sub btnImportXL_Click()
    On Error GoTo Err_btnImportXL_Click
    Dim strFilePath As String
     
    ' active la boite de dialogue de sélection d'un fichier Excel
    strFilePath = GetFilePath()
     
    'exécute la méthode d'importation des données Excel vers la tblDecesImport
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel97, "tblDecesImport", strFilePath, True
     
    'supprime dans tblDecesImport les enregistrements déjà présents dans tblDeces
    'img3 : 1 enregistrement subsiste, il n'existe pas dans tblDeces
    'proposition de @User qui est fonctionnelle
    strSql = "DELETE" _
        & " FROM tblDecesImport" _
        & " WHERE Exists (" _
            & " SELECT * FROM tblDeces" _
            & " WHERE (tblDecesImport.noms = tblDeces.noms)" _
            & " AND (tblDecesImport.adresses = tblDeces.adresses)" _
            & " AND (tblDecesImport.villes = tblDeces.villes)" _
            & " AND (tblDecesImport.nam = tblDeces.nam)" _
            & " AND (tblDecesImport.dte = tblDeces.dte))"
    'ou fonctionnelle également
    'strSql = "DELETE tblDecesImport.*" _
        & " FROM tblDecesImport" _
        & " INNER JOIN tblDeces ON (tblDecesImport.noms = tblDeces.noms)" _
        & " AND (tblDecesImport.adresses = tblDeces.adresses)" _
        & " AND (tblDecesImport.villes = tblDeces.villes)" _
        & " AND (tblDecesImport.nam = tblDeces.nam)" _
        & " AND (tblDecesImport.dte = tblDeces.dte)"
        CurrentDb.Execute strSql, dbFailOnError
     
    strSql = "INSERT INTO tblDeces (noms, adresses, villes, nam, dte)" _
        & " SELECT noms, adresses, villes, nam, dte" _
        & " FROM tblDecesImport"
        CurrentDb.Execute strSql, dbFailOnError
     
    strSql = "DELETE * FROM tblDecesImport"
        CurrentDb.Execute strSql, dbFailOnError
     
    Exit_btnImportXL:
        Exit Sub
    Err_btnImportXL_Click:
        MsgBox Err.Description & " (" & Err.Number & ")", vbExclamation, "Error"
        Resume Exit_btnImportXL
    End Sub
    Images attachées Images attachées  

  19. #19
    Nouveau membre du Club
    Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 66
    Points : 28
    Points
    28
    Par défaut Recherche doublons entre tables
    RE
    Je planche sur le code, mais je n'arrive pas à le faire fonctionner.
    Sur la première importation, intègre les 1020 enregistrements dans la tblDeces , mais m'indique la suppression de 501 enregistrements ? dans la tblDecesImport.
    Il devrait ni avoir aucune suppression car la table tblDeces était vide
    Sur 2ème importation exactement le même comportement transfert des 1020 enregistrement dans la tblDeces et suppression de 501 enregistrement tblDecesImport.
    Donc tblDeces 2040 enregistrements.
    Mes syntaxes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'supprime dans tblDecesImport les enregistrements déjà présents dans tblDeces
    strSQL = "DELETE" _
            & " FROM tblDecesImport" _
            & " WHERE Exists (" _
            & " SELECT * FROM tblDeces" _
            & " WHERE (tblDecesImport.Jour = tblDeces.Jour)" _
            & " And (tblDecesImport.Mois = tblDeces.Mois)" _
            & " And (tblDecesImport.Annee = tblDeces.Annee))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strSQL = "INSERT INTO tblDeces (Jour , Mois, Annee)" _
        & " SELECT Jour , Mois, Annee" _
        & " FROM tblDecesImport"
    Les champs Jour, Mois sont numérique octet
    Le champ Annee est numérique entier
    Dans fichier Xls jour, mois annee nombre.

    Merci

  20. #20
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    re,
    Sérieusement, vous n'enregistrez que des dates ! Mais alors que sont devenus ces 20 champs de données que vous vouliez importer selon votre Post#1 ?
    Citation Envoyé par Pascalpir Voir le message
    Bonjour,
    J'ai 2 tables: A (table Access avec une vingtaine de champs) et une seconde B (issue de l'importation de fichiers Xls)...
    Et cette capture ! Une erreur de comptage peut-être ?
    Je viens de faire un essai avec la nouvelle donne, et cela fonctionne parfaitement à condition de modifier l'ordre des égalités comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'supprime dans tblDecesImport les enregistrements déjà présents dans tblDeces
    strSQL = "DELETE" _
            & " FROM tblDecesImport" _
            & " WHERE Exists (" _
            & " SELECT * FROM tblDeces" _
            & " WHERE (tblDecesImport.Annee = tblDeces.Annee)" _
            & " And (tblDecesImport.Mois = tblDeces.Mois)" _
            & " And (tblDecesImport.Jour = tblDeces.Jour))
    Peut-être serait-il temps de nous donner tous les éléments.

Discussions similaires

  1. [AC-2003] Eviter les doublons entre deux tables
    Par soleil_levant dans le forum Modélisation
    Réponses: 1
    Dernier message: 23/06/2009, 17h29
  2. Recherche doublons entre 2 champs
    Par zenzolarticho dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/07/2007, 09h52
  3. rechercher et éliminer doublons dans table
    Par patbeautifulday1 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/05/2007, 10h27
  4. [Oracle 8i]Recherche doublon sur une même table
    Par fmoriet dans le forum Oracle
    Réponses: 3
    Dernier message: 01/08/2006, 10h09
  5. [Oracle] Recherche de doublons entre 2 tables
    Par Isa31 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/02/2006, 14h23

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