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. #21
    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
    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.
    Merci Tatayo, la requête marche bien après cette modification:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT mouvements1.IDMouvements,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
    OR (mouvements2.Date_début BETWEEN mouvements1.Date_début AND mouvements1.Date_fin OR mouvements2.Date_fin BETWEEN mouvements1.Date_début AND mouvements1.Date_fin))
    AND mouvements1.IDMouvements <> mouvements2.IDMouvements

    Est ce que je peux faire un contrôle de saisie à la base de cette requête afin d'éviter la saisie des mouvements en périodes chevauchées ?

    Merci.

  2. #22
    Membre émérite
    Femme Profil pro
    .
    Inscrit en
    Janvier 2012
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : .
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 999
    Points : 2 526
    Points
    2 526
    Par défaut
    Citation Envoyé par compteabdou Voir le message
    Est ce que je peux faire un contrôle de saisie à la base de cette requête afin d'éviter la saisie des mouvements en périodes chevauchées ?

    Merci.
    C'est ce que Hemgé ne cesse de vous répéter depuis hier !!!!

  3. #23
    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 serendib Voir le message
    C'est ce que Hemgé ne cesse de vous répéter depuis hier !!!!
    Au départ, mon but étais de détecter et supprimer les anomalies dues à des erreurs de saisie,
    et après un contrôle de saisie est obligatoire, afin de ne pas avoir ces problèmes au futur.
    En tous cas, j'ai réussi à faire cela en mettant ce code quand je clique sur le bouton valider d'un nouveau mouvement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    HExécuteRequête(REQ_Doublons_mouv,hRequêteDéfaut,SAI_Date_début,SAI_Date_fin)
    HLitPremier(REQ_Doublons_mouv)
    TANTQUE PAS HEnDehors(REQ_Doublons_mouv)
         SI SAI_Matricule = REQ_Doublons_mouv.Matricule ALORS
                 Info("Cette Personne n'est pas disponible.....")
                 RETOUR
        FIN
    HLitSuivant(REQ_Doublons_mouv)
    FIN
    La requête est changée de façon à récupérer seulement les enregistrements qui ont une période chevauchée avec SAI_Date_début,SAI_Date_fin (astuce donnée par Tatayo).
    Je vous remercie beaucoup de votre aide précieuse (Tatayo, Hemgé, et serendib).
    A bientôt.

  4. #24
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 203
    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 203
    Points : 12 781
    Points
    12 781
    Par défaut
    Je dirai que tu peux optimiser ta recherche: en passant l'id en paramètre à la requête, en plus des dates, il suffira de vérifier que la requête renvoie quelque chose pour dire que la personne n'est pas disponible.

    Tatayo.

  5. #25
    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
    J'ai changé la requête, pour détecter seulement les doublons sans répétition comme suit:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT mouvements1.id_mouvement,mouvements1.Matricule,mouvements1.Type_mouvement,mouvements1.date_début,mouvements1.date_fin
    FROM Mouvement_Personnel mouvements1
    WHERE (mouvements1.date_début BETWEEN {param1} AND {param2} OR mouvements1.date_fin BETWEEN {param1} AND {param2})

    Je pense que je n'ai pas besoin d'un paramètre ID dans ce cas, et même si je veux passer l'ID comme paramètre, je ne l'ai pas puisque c'est un ID auto (Ajout d'un nouveau mouvement).
    pour la vérification du résultat de la requête, je croyais que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TANTQUE PAS HEnDehors(REQ_Doublons_mouv)
    peut jouer ce rôle non ?

    donc s'il n y a pas d'enregistrements dans la requête, on sort de la boucle, et on valide la saisie.

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 203
    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 203
    Points : 12 781
    Points
    12 781
    Par défaut
    J'avais regardé la requête en diagonale, en fait ma réflexion portait sur le matricule.
    Puisque tu lances la requêtes, puis boucle sur le résultat pour comparer le matricule renvoyé avec celui en cours, autant passer directement le matricule dans la requête.
    Ainsi tu n'as plus besoin de faire la boucle: si la requête renvoie quelque chose, c'est qu'il va y avoir "collision".

    Tatayo.

  7. #27
    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
    Merci Tatayo pour ces conseils, je vais essayer de passer le matricule en paramètre.

  8. #28
    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,

    je reviens puisque j'ai un petit problème au niveau de ma requête pour tester les périodes chevauchées,
    particulièrement quand une période est entièrement incluse dans l'autre,
    la requête marche très bien quand j'utilise les alias mais dans le cas où les dates sont saisies manuellement, je dois les passer en paramètre, donc j'ai fait:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT mouvements1.id_mouvement,mouvements1.Matricule,mouvements1.Type_mouvement,mouvements1.date_début,mouvements1.date_fin
    FROM Mouvement_Personnel mouvements1
    WHERE (mouvements1.date_début BETWEEN {param1} AND {param2} OR mouvements1.date_fin BETWEEN {param1} AND {param2}
    or ({param1} BETWEEN mouvements1.date_début AND mouvements1.date_fin OR {param2} BETWEEN mouvements1.date_début AND mouvements1.date_fin))

    mais j'ai une erreur à l'exécution disant que la requête n'est pas initialisée.

    Avez vous une idée ?

    Merci.

  9. #29
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Bonjour

    ça veut dire que l'exécution de la requête a échoué

    Il tester le retour de HExécuteRequête et afficher le message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SI HExécuteRequête(...) ALORS
       // ton code
    SINON
       Erreur(HErreurInfo())
    FIN

  10. #30
    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,

    je reçois le message suivant:

    Erreur dans le code SQL de la requête, initialisation de la requête impossible.
    l'utilisation des paramètres n'est pas autorisé avec la fonction HExecuteRequêteSQL.

  11. #31
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Je crois que le message est clair : tu utilises HExécuteRequêteSQL au lieu de HExécuteRequête

    HExécuteRequête doit être utilisée avec une requête faites sous l'éditeur
    HExécuteRequêteSQL permet d'exécuter une requête définie dans une chaîne dans le code

  12. #32
    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,

    j'ai essayé d'utiliser HexecuteRequeteSQL mais je ne sais pas comment passer les deux paramètres (sai_date_début, sai_date_fin),
    vu que la requête est une chaine.

  13. #33
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Si tu veux manipuler les paramètres (Requete.Parametre) il faut utiliser HexecuteRequete

    Pour HExécuteRequêteSQL il faut remplacer les paramètres dans la chaîne par leurs valeurs (en mettant des ' autour si c'est necéssaire)
    Tu peux utiliser la fonction Remplace() ou mieux ChaineConstruit (mais tes paramètre doivent se nommer %1, %2 etc) - voir l'aide de ces fonctions

  14. #34
    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 hpascal Voir le message
    Si tu veux manipuler les paramètres (Requete.Parametre) il faut utiliser HexecuteRequete
    Je crois que le message est clair : tu utilises HExécuteRequêteSQL au lieu de HExécuteRequête
    j'utilise actuellement HExécuteRequête, ce qui est plus rapide à mettre en place, et malgré ça, j'ai eu l'erreur citée précédemment.
    est ce qu'il y a un problème avec cette requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    SELECT mouvements1.id_mouvement,mouvements1.Matricule,mouvements1.Type_mouvement,mouvements1.date_début,mouvements1.date_fin
    FROM Mouvement_Personnel mouvements1
    WHERE (mouvements1.date_début BETWEEN {param1} AND {param2} OR mouvements1.date_fin BETWEEN {param1} AND {param2}
    or ({param1} BETWEEN mouvements1.date_début AND mouvements1.date_fin OR {param2} BETWEEN mouvements1.date_début AND mouvements1.date_fin))

  15. #35
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    A vue d’œil la syntaxe a l'air correcte
    Donc tu saisis bien ce code dans l'éditeur de requête de Windev ?

    Ensuite peux-tu montrer le code que tu utilises pour exécuter cette requête

  16. #36
    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
    le code d'exécution de la requete est:

    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
     
    res est entier 
    SI HExécuteRequête(REQ_Doublons,hRequêteDéfaut,gDate_fin,gDate_debut) ALORS
        HLitPremier(REQ_Doublons)
        TANTQUE PAS HEnDehors(REQ_Doublons)
     
            res = TableCherche(TABLE_Personnel.COL_Matricule,REQ_Doublons.Matricule)
            SI res <> -1 ALORS
                TABLE_Personnel[res]..CouleurFond = RVB(153,204,153)
            FIN
     
            HLitSuivant(REQ_Doublons)
        FIN
     
    SINON 
        Erreur(HErreurInfo)
    FIN
    ce code est mis à l’initialisation de la fenêtre, qui reçoit à son tour les deux paramètres gdate_début, gdate_fin.

  17. #37
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 203
    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 203
    Points : 12 781
    Points
    12 781
    Par défaut
    Bonjour,
    Vu que le problème ne porte plus sur une recherche de doublon, mais sur le lancement d'une requête, et qu'en plus cette discussion est résolue, je pense qu'il serait souhaitable de créer une autre discussion.

    Tatayo.

  18. #38
    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
    Bonjour,
    Vu que le problème ne porte plus sur une recherche de doublon, mais sur le lancement d'une requête, et qu'en plus cette discussion est résolue, je pense qu'il serait souhaitable de créer une autre discussion.

    Tatayo.
    Oui, vous avez raison. je vais créer une nouvelle discussion.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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