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

VBA Access Discussion :

Règle pour éliminer une partie des doublons [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut Règle pour éliminer une partie des doublons
    Bonjour le forum,

    Je dois régulièrement importer un grand nombre de données d'un AS400 dans une table Access.
    Ces données contiennent certains "doublons", que je définis comme toutes lignes ayant en commun les champs suivants: "Client", "Departement", "Article", "Quantite". Ma table contient d'autres champs également dont le Champ "Date".

    Je réussis bien à écrire une requête qui me permet d'identifier ces doublons. Mais je ne voudrais pas tous les supprimer de ma table. Je voudrais garder le doublon qui a la date la plus récente pour commencer.

    Par exemple, si dans ma requête qui m'identifie les doublons (et qui compte environ 700 enregistrements), si je trouve les deux lignes suivantes:

    Client | Departement | Article | Quantite | Date
    A | 02 | 12345 |1 | 01/01/2011
    A | 02 | 12345 |1 | 31/12/2011

    Je voudrais éliminer la première ligne seulement car la date est plus ancienne.

    Je ne sais pas du tout vers quelle méthode m'orienter, alors toute suggestion est la bienvenue.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Au plus simple je créerai un index unique basé sur [Client], [Departement], [Article], [Quantite] dans ma table destination puis je ferais une requête d'ajout triés sur [Client], [Departement], [Article], [Quantite] en ascendant et ta Date en déscendant comme cela le 1er enr, celui qui a la date la plus récente serait ajouté à la table puis tous les autres rejetés par Access.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 604
    Points : 56 721
    Points
    56 721
    Billets dans le blog
    40
    Par défaut
    bonsoir,
    ou sinon créer une requête de suppression :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE FROM LaTable 
    WHERE EXISTS
    (SELECT "" FROM LaTable T WHERE
           T.Client=LaTable.Client 
              AND T.Departement=LaTable.Departement
                 AND T.Article=LaTable.Article
                    AND T.Quantite=LaTable.Quantite
                       AND T.LaDate>LaTable.LaDate);

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    Et pardon pour la réponse tardive. J'imaginais qu'il y avait une solution en SQL, mais je ne suis pas assez doué pour la trouver. Je teste ça, et je reviens vers vous.

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    Et encore une fois pardon pour la réponse tardive. Super, je ne connaissais pas bien le prédicat Exists, mais la solution marche bien.

    Est-ce que je peux ajouter un peu à la complexité? Je me suis aperçu qu'il me restait encore quelques doublons... je vois que je peux les identifier grâce aux champs texte "Niveau 1", "Niveau 2", et "Niveau 3".
    J'aimerais bien pouvoir écrire une règle qui dirait: "Pour chaque doublon, si un des deux niveaux 3 est vide, alors je le supprime. Sinon, si un des deux niveaux 2 est vide, alors je le supprime. Sinon, si un des deux niveaux 1 est vide, alors je le supprime."

    Est-ce que c'est possible en sql? (si un des admins passent par ici et qu'il veut bien bouger mon sujet dans le forum adéquat...)

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Ben tout simplement comme ça, neiluj26:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELETE FROM LaTable 
    WHERE EXISTS
    (SELECT * FROM LaTable T WHERE
           T.Client=LaTable.Client 
              AND T.Departement=LaTable.Departement
                 AND T.Article=LaTable.Article
                    AND T.Quantite=LaTable.Quantite
                       AND T.LaDate>LaTable.LaDate
                           AND (T.Niveau1>LaTable.Niveau1 OR T.Niveau2>LaTable.Niveau2 OR T.Niveau3>LaTable.Niveau3));

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Ah non, j'aurais dû mieux vérifier. Ma solution ne fonctionne pas. Évidemment, elle élimine toutes les lignes qui ont "Client", "Departement", "Article", "Quantite" en commun.

    Je rouvre donc ce topic. Je prends une solution SQL, mais aussi VBA, bien sûr.

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Ma solution avec les indexs et la requête d'ajout devrait fonctioner sans code.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    Bonjour marot_r,

    J'ai privilégié le SQL jusque maintenant parce que je ne suis pas sûr de bien comprendre ta solution (je ne suis encore qu'un débutant).

    J'ai bien créé mon index sur la table de destination, mais est-ce que tu pourrais m'expliquer cette partie de ta phrase ?
    celui qui a la date la plus récente serait ajouté à la table puis tous les autres rejetés par Access
    Comment est-ce que je fais pour n'ajouter que le premier enregistrement?

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Si tu tri tes données ajoutées en ordre décroissant. La plus récente va se retrouver en 1ère. Quand tu vas ajouter ces données à la table, la 1ière ligne va être acceptée puisqu'aucune données n'a cette clef. Toutes les suivantes, qui ont la même clef, vont être rejetées par Access pour violation de clef. Donc, au final, tu vas avoir ajouter 1 seule ligne : celle qui a la date la plus récente.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Points : 116
    Points
    116
    Par défaut
    J'ai compris. Ta solution fonctionne. Merci. C'était l'obstacle qui me posait le plus de problème jusqu'à maintenant.

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

Discussions similaires

  1. utilisation des templates pour traiter une partie d'un doc tei
    Par tigunn dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/02/2012, 16h12
  2. [AC-2007] lecture d'une requête SQL pour conserver une partie des données
    Par tibofo dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/08/2011, 09h56
  3. Réponses: 2
    Dernier message: 09/10/2004, 20h45
  4. requete pour reccuperer une parti d'un resultat
    Par ViBy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/09/2004, 09h33
  5. Exporter seulement une partie des données avec pg_dump ?
    Par Philhz dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 31/07/2004, 09h50

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