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

WinDev Discussion :

Extraire les doublons dans une table mémoire [WD14]


Sujet :

WinDev

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut Extraire les doublons dans une table mémoire
    Bonjour,

    j'ai une table Fichier qui contient les mouvements du personnel,
    (Id_mouv, Matricule, Type_mouv, Date_début_mouv, Date_fin_mouv)

    je veux extraire dans une table mémoire tous les enregistrements qui se répète pour (Matricule, Date_début_mouv, Date_fin_mouv), sachant que cela est appliqué également si les deux dates (Début et fin) se coïncide dans un jour ou plus.

    Un exemple est montré dans le fichier excel ci-joint.

    j'ai essayé comme suit mais ça ne marche pas:
    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
     
    Date_d_mouv, Date_f_mouv sont des Dates
    POUR i = 1 A TableOccurrence(TABLE_Mouvement_Personnel)
        Date_d_mouv = COL_Date_début[i]
        Date_f_mouv = COL_Date_fin[i]
        SI COL_Matricule[i] = COL_Matricule ALORS
            TANTQUE dDate_d_mouv <= dDate_f_mouv
                SI COL_Date_début[i] = COL_Date_fin[i] ALORS
                    TableAjouteLigne(TABLE_Mouvement_Doublé,COL_Id_mouvement[i],COL_Matricule[i],COL_Type_mouvement[i],COL_Date_début[i],COL_Date_fin[i])
                FIN
                Date_d_mouv++    
            FIN
        FIN
     
    FIN
    Merci.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Bonjour,
    A mon avis, ça ne fonctionne pas à cause de la ligne 5.
    Je ne comprends pas non plus l'intérêt de la boucle entre les lignes 6 et 11. Le code dans la boucle ne dépend pas de la variable de la boucle...

    Bref tout est à revoir...

    Tatayo.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    c'est pour cette raison que j'ai posté le message, il ne fonctionne pas et je sais qu'il est erroné.

    je n'arrive pas à trouver une solution.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Qu'est-ce que tu entends par "si les deux dates (Début et fin) se coïncide dans un jour ou plus" ?

    Tatayo

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut
    Re,

    si un enregistrement est comme suit:
    (Matricule,Type_mouv,date_d_mouv,date_f_mouv)
    (00000001,Type1,01/09/2014,05/09/2014)
    et un autre enregistrement:
    (00000001,Type2,03/09/2014,03/09/2014)

    donc les deux enregistrements se coïncide dans la journée du 03/09/2014, ce qui est impossible.

    Voila

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 451
    Points
    2 451
    Par défaut
    Bonjour,

    Vous voulez donc dire que les périodes sont mutuellement exclusives et ne peuvent pas se chevaucher.

    Je proposerais de travailler cela dans un tableau et de commencer par le trier sur le matricule et la date de début de mouvement.
    Cela simplifierait le code et accélérerait certainement le traitement.

    Bon travail

    Hemgé

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Je sais que la question porte sur une table mémoire, mais c'est faisable via une requête SQL:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct t1.id
    from LaTable t1
    inner join LaTable t2 on t1.id = t2.id and t1.datedeb between t2.datedeb and t2.datefin

    Tatayo.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut
    Re,

    Tatayo,

    dans mon cas, je n'ai qu'une seule table Mouvement, et dans la requête que tu as cité, je pense qu'il faut deux tables.

    Hemgé,

    je veux détecter les périodes qui se chevauchent, afin de permettre à l'utilisateur de supprimer celle de son choix.

    sachant la table mouvement contient un nombre d'enregistrements important.

    peux-tu me donner un bout de code sur l'utilisation des tableaux.

    Merci.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Citation Envoyé par compteabdou Voir le message
    Re,

    Tatayo,

    dans mon cas, je n'ai qu'une seule table Mouvement, et dans la requête que tu as cité, je pense qu'il faut deux tables.
    Pas du tout, je n'ai utilisé qu'une seule table (LaTable), mais avec 2 alias différents (t1 et t2).

    Tatayo

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 451
    Points
    2 451
    Par défaut
    Je proposais de travailler sur un tableau pour ce qui concerne le traitement de détection des mouvements qui posent problème.
    Il est évident que cela devait aboutir à l'affichage de votre seconde table qui récapitule les diverses anomalies détectées.

    Travailler avec un tableau est plus rapide qu'avec une table, notamment parce qu'il n'y a pas d'affichage (on peut aussi supprimer temporairement l'affichage d'une table, pour accélérer son remplissage et éviter les effets visuels).
    D'autre part, TableTrie rencontre quelques limites s'il s'agit d'une table fichier.
    Cela suppose aussi que vos utilisateurs n'ont pas besoin de voir la table complète quand ils traitent les mouvements anormaux, auquel cas il faudrait d'emblée trier la table avant de l'afficher (requête ou filtre ou clé composée).
    On peut aussi effectuer le tri avant d'alimenter la table ou le tableau.

    Le tri préalable va diminuer de manière très importante le nombre d'itérations de balayage et de comparaisons sur les lignes (de la table ou du tableau), puisque les mouvements seront déjà regroupés par matricule.

    Quant au traitement des tableaux, il n'y a rien de sorcier et vous les traitez à peu près comme les tables en vous référant aux instructions TableauXXX().

    LA question à poser est aussi de savoir s'il ne serait pas possible de porter l'effort de développement sur la détection et la prévention de ces anomalies au moment de l'encodage, ce qui serait certainement mieux sur tous les plans.

    Hemgé

    NB : sauf si vous n'êtes pas familier avec les requêtes, réfléchissez bien à la proposition de tatayo.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut
    Afin de remplir la table mémoire, j'ai besoin de récupérer les éléments (type_mouvement,date_début,date_fin)

    est ce que c'est possible de garder la requête en ajoutant les champs que je veux récupérer:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct mouvements1.Matricule
    from Mouvement_Personnel as mouvements1
    inner join Mouvement_Personnel as mouvements2 on mouvements1.Matricule = mouvements2.Matricule and mouvements1.date_début between mouvements2.date_début and mouvements2.date_fin

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Oui, il suffit de les ajouter dans la clause SELECT.

    Par contre il faut préfixer les colonnes en question avec l'alias de la table (ici Mouvements1), sinon le moteur ne saura pas résoudre l'ambiguïté (mouvements1 ou mouvements2 ?).

    Tatayo.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Oui, il suffit de les ajouter dans la clause SELECT.
    Après une lecture sur la fonction DISTINCT, elle s'applique sur tous les champs de SELECT, donc si j'ajoute les champs désirés à SELECT, le résultat va être modifié.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Citation Envoyé par compteabdou Voir le message
    Après une lecture sur la fonction DISTINCT, elle s'applique sur tous les champs de SELECT, donc si j'ajoute les champs désirés à SELECT, le résultat va être modifié.
    Oui, et alors ? Le but du distinct était de ne pas renvoyer 3 fois la même ligne si elle possède 3 doublons.

    En fait la question est: quel est le but final de cette demande ? Si les lignes A B et C sont des doublons, Est-ce que tu veux récupérer:
    1. Une seule ligne, de façon arbitraire
    2. Une seule ligne précise, en fonction d'un critère particulier (date, id...)
    3. Les 3


    Il est simple d'adapter la requête aux trois cas, mais il faut juste savoir ce dont tu as besoin.

    Tatayo.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par tatayo Voir le message

    En fait la question est: quel est le but final de cette demande ? Si les lignes A B et C sont des doublons, Est-ce que tu veux récupérer:
    1. Une seule ligne, de façon arbitraire
    2. Une seule ligne précise, en fonction d'un critère particulier (date, id...)
    3. Les 3

    Tatayo.
    Bonsoir,

    Désolé si je n'étais pas clair en ce point, en fait, j'ai besoin de récupérer seulement les doublons dans la table mémoire, donc les 3 dans ton exemple.
    je ne suis pas fort en SQL, mais j'aime bien c'est très efficace, et avec la requête que tu m'as donné, ça me récupère toutes les enregistrements sans doublons. et mois je veux le contraire (seulement les doublons) pour permettre à l'utilisateur de détecter les anomalies.

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Dans ce cas, la modification à apporter est assez simple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select distinct t1.id
    from LaTable t1
    inner join LaTable t2 on t1.col1 = t2.col1 and (t1.datedeb between t2.datedeb and t2.datefin or t1.datefin between t2.datedeb and t2.datefin) 
    where t1.id <> t2.id

    En relisant ma requête je me suis aperçu qu'il faut faire en sorte de différencier les lignes (ici avec l'Id que je considère unique pour chaque ligne) sous peine de récupérer toute la base...

    Mais le principe est là: deux périodes se chevauchent si la date de début ou de fin de la première se retrouve entre la date de début et la date de fin de la seconde.

    Tatayo.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut
    Bonsoir,

    ça marche mieux maintenant, mais sur l'image suivante:
    Nom : Doublons.jpg
Affichages : 1561
Taille : 158,3 Ko

    pour le matricule 003, il récupère un seul enregistrement (4373) et moi je veux qu'il récupère aussi l'enregistrement (4370) avec qui la période se chevauche.

    voici ma requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT DISTINCT  mouvements1.id_mouvement,mouvements1.Matricule,mouvements1.type_mouvement,mouvements1.date_début,mouvements1.date_fin
    FROM Mouvements mouvements1
    INNER JOIN Mouvements mouvements2 ON mouvements1.Matricule = mouvements2.Matricule 
    AND (mouvements1.date_début BETWEEN mouvements2.date_début AND mouvements2.date_fin OR mouvements1.date_fin BETWEEN mouvements2.date_début AND mouvements2.date_fin)
    AND mouvements1.id_mouvement <> mouvements2.id_mouvement
    j'ai essayé de supprimer le type_mouvement de SELECT mais ça ne marche pas.

    est ce que je peux aussi personnaliser la requête par la suite, pour supprimer les doublons identiques et garder un seul enregistrement unique.

    Merci.

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Effectivement, je n'ai pas pensé au cas où une période est entièrement incluse dans l'autre.
    En fait la modification est simple, il faut ajouter un test sur les dates en inversant les deux tables (en plus de tester les dates de t1 par rapport à t2, il faut aussi tester les dates de t2 par rapport à t1).

    Tatayo.

  19. #19
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Hemgé Voir le message
    Je proposais de travailler sur un tableau pour ce qui concerne le traitement de détection des mouvements qui posent problème.
    Il est évident que cela devait aboutir à l'affichage de votre seconde table qui récapitule les diverses anomalies détectées.
    NB : sauf si vous n'êtes pas familier avec les requêtes, réfléchissez bien à la proposition de tatayo.
    J'ai essayé de travailler avec les tableaux mais ça prend un temps important par rapport aux requêtes.
    c'est utile quand même ...

    Merci.

  20. #20
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 451
    Points
    2 451
    Par défaut
    Pour rappel,

    Citation Envoyé par Hemgé Voir le message
    LA question à poser est aussi de savoir s'il ne serait pas possible de porter l'effort de développement sur la détection et la prévention de ces anomalies au moment de l'encodage, ce qui serait certainement mieux sur tous les plans.
    Pour autant que ce soit possible et pourquoi cela ne le serait-il pas, ce serait sans doute plus simple et plus efficace pour l'avenir.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. supprimer les doublons dans une table
    Par mavean dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/06/2019, 13h26
  2. Réponses: 10
    Dernier message: 23/11/2009, 22h49
  3. Supprimer les doublons dans une table
    Par lelectronique.com dans le forum Requêtes
    Réponses: 7
    Dernier message: 15/10/2008, 14h33
  4. Supprimer les doublons dans une table!
    Par Kirou dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/06/2008, 15h37
  5. problème pour éviter les doublons dans une table
    Par bonnet85 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/02/2008, 04h35

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