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

Requêtes et SQL. Discussion :

Requete SQL avec critere Between & DiffDate [AC-2010]


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut Requete SQL avec critere Between & DiffDate
    Bonjour à tous

    Je rencontre un petit souci sur du code VBA sous Access 2010
    Je cherche a actualiser le Rowsource d'une zone de liste en fonction des choix de filtre de l'utilisateur.
    Aprés chaque UPDATE, ma requete est construite en fonction des filtres

    Exemple :
    Si je choisis usine : TP
    L'evenement After UPDATE se déclenche, et construira la requete " SELECT * FROM MALADIE WHERE USINE = 'TP' "

    Etc

    Mon probleme survient lorsque je veux choisir des maladies dont la durée est entre 1 et 7 jours, car les criteres de périodes sont également présent.

    Je vous fournis le bout de requete :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM MALADIE
     WHERE LOCAL = 'TP' AND #07/01/2014# BETWEEN DEBUT AND FIN  IN (SELECT * FROM MALADIE WHERE DateDiff('d',DEBUT, FIN) < 9)

    Le DateDiff permet de sélectionner des maladies dont la duée est entre 1 et 7 jours.
    Le between permet de prendre en compte des maladies qui auraient commencées avant la date de période, mais qui ont une partie de la maladie comprise dans la période, car ces gens sont malades au moment de la période.

    J'ai pensé construire ma requete de cette facon mais ca ne fonctionne pas
    si je ne fais pas de critere de periode entre 1 et 7 jours, les résultats sont correct.

    Je vous demande donc votre aide :
    - Est il possible de faire une requete sur le resultat du rowsource, et si oui comment?
    - Sinon comment puis-je faire pour améliorer ma requete afin que mes criéteres ne fassent pas planter la requete?

    Merci à tous pour vos réponse

    Ted'

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 853
    Par défaut
    Bonjour,

    Je pense que ce n'est pas vraiment le SQL qui te pose problème, mais la logique du résultat voulu.
    Essaies de décomposer ce que tu veux avec des critères simples d'abord et après tu combines tes critères.
    Si j'ai bien compris, tu veux par étape :
    1- les enregistrements dont Local = "TP"
    2- les enregistrements dont Local ="TP" ET DateEnregistrement (un champ de la table) se trouve entre Début et Fin.
    3- les enregistrements dont Local = "TP" ET DateEnregistrement (un champ de la table) se trouve entre Début et Fin ET DateEnregistrement est dans IN (SELECT * FROM MALADIE WHERE DateDiff('d',DEBUT, FIN) < 9) .

    Ce qui donnerait à peu près :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM MALADIE
     WHERE LOCAL = 'TP' AND (DateEnregistrement BETWEEN DEBUT AND FIN) AND DateEnregistrement   IN (SELECT * FROM MALADIE WHERE DateDiff('d',DEBUT, FIN) < 9)
    Cordialement,

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Merci de ta réponse

    Effectivement c'est peut être ma méthodologie qu'il faut revoir.

    Je teste ca et je te redis la réponse.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    En fait, je me pose deux questions :
    1) Tu reprends mon IN SELECT, mais peut-être il y a une autre méthode?

    2) Tu utilise un champ de la table pour le DiffDate, mais moi je n'ai pas ce champ a utiliser.
    Si je traduis ma requete :
    Je veux les maladies
    Des gens qui travaillent à TP
    Dont la pèriode de maladie est comprise entre les intervalles choisis
    Et dont la durée n'excede pas 8 jours

    Moi je le traduis en SQL comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM MALADIE
    WHERE USINE = 'TP'
    AND DebutIntervalle Between DateDeDebut AND DateDeFin
    (Idem pour la date de fin d'intervalle)
    And DiffDate('d', DateDebutMaladie, DateFinMaladie) < 9
    C'est pourquoi le DateEnregistrement ( ou le champ x bref...) me pose probleme dans ta réponse
    Je me suis peut être mal exprimé dans mon premier message, ou je n'ai pas compris ta réponse mais aurais tu la gentillesse de m'expliquer un peu plus?

    Merci

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 853
    Par défaut
    En fait, j'ai mis le champ DateEnregistrement pour exemple, donc t'inquiètes pas parce qu'à priori tu as compris ce que je voulais dire.

    A ce que j'ai compris dans ton code SQL :
    1- USINE, DateDebutMaladie et DateFinMaladie sont des champs de la table MALADIE. Et DebutIntervalle (à vérifier),
    2- DateDeDebut et DateDeFin sont des paramètres (seront 2 champs d'un formulaire je pense).

    Pour simplification, je te conseille de commencer ta requête d'abord pour les données dont USINE ='TP' Et dont la durée n'excède pas 8 jours.

    Après, tu vérifies celles qui sont dans l'intervalle DateDeDebut et DateDeFin. Parce que l'énoncé est insuffisant actuellement :
    J'imagine donc que ton DebutIntervalle serait plutôt DateDebutMaladie.
    Donc, si DateDeDebut = 01/08/2014 et DateDeFin = 15/08/2014.
    Est ce qu'une données avec USINE = 'TP', DateDebutMaladie = 12/08/2014 et DateFinMaladie = 16/08/2014 devrait être affiché ???

    Comment traiter les cas des données qui ont une durée inférieure à 8 jours, mais dont les début ou fin sortent de l'intervalle DatedeDebut et DateDeFin.

    A méditer avant de continuer je pense.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Merci de ta réponse

    Trier les resultat par usine, c'est geré
    Trier les maladies dans la période choisie aussi
    Ton exemple :
    Periode du 01/08 au 15/08
    Maladie du 12/08 au 16/08 ==> doit être affichée car personne malade dans cette periode
    Idem si la maladie avait eté du 20/07 au 10/08
    Le probleme se pose lors du diffdate, lorsque je veux que les maladies qui s'âffichent, soit comprise dans une durée allant de 1 a 8 jours
    Donc, pour une période allant du 01/08 au 15/08 :
    Maladie du 20/07 au 10/08 => non affichée car superieure a 8 jours
    Maladie du 29/07 au 03/08 => affichée car inferieure a 8 jours

    La date de fin de période c'est le meme principe

    En gros, c'est le calcul des periodes de maladie le probleme
    Je sais trier si elles depassent ou non de la pèriode et si elles doivent être affichée,
    mais si je le combine avec Diffdate, rien ne va plus

    DatedeDebut = DateDebutMaladie et DateDeFin = DateFinMaladie sont 2 champ de la table maladie
    DebutIntervalle = Debut de la periode de recherche ( parametre de formulaire)
    En gros ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM MALADIE
    WHERE USINE = 'TP'
    AND DebutIntervalle Between DateDebutMaladie AND DateFinMaladie
    (Idem pour la date de fin d'intervalle)
    And DiffDate('d', DateDebutMaladie, DateFinMaladie) < 9
    signifie :
    Je veux toutes les maladies
    De l'usine TP (inutile de s'attarder dessus, c'est un parametre optionnel, bref...)
    Qui ont au moins un jour dans l'intervalle de recherche
    Et dont la durée n'excede pas 8 jours

    J'espere avoir été plus clair cette fois ci.

    Merci pour tes reponses madefemere, mais il m'en faut d'autre haha

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

Discussions similaires

  1. Requete SQL avec critere dans 2 tables
    Par Mathieu51 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 25/03/2011, 12h08
  2. [MySQL] requete sql avec between
    Par kate59 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 18/09/2009, 17h44
  3. [SQL - Oracle 9i] Requete Sql avec filtre sur critere
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 05/12/2007, 08h45
  4. requete sql avec between sur des champs de type Date
    Par ersoufiane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/08/2006, 19h43
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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