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 :

Dates suivantes et dates précédentes [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut Dates suivantes et dates précédentes
    Bonjour tout le monde

    Dans une table TABLE, j’ai un champ CODE et un champ DATE qui constituent à eux deux la clé primaire de cette table. J’aimerais renseigner deux champs DATE SUIVANTE et DATE PRECEDENTE
    Pour DATE SUIVANTE (par exemple), j’utilise cette syntaxe dans ma requête Update :
    CDate(VraiFaux(MinDom("[Date]";"TABLE";"[Date]>#" & CDate(Format([date];"mm/jj/aaaa")) & "# and [CODE]='" & [CODE] & "'") Est Null;Date();MinDom("[Date]";"TABLE";"[Date]>#" & CDate(Format([date];"mm/jj/aaaa")) & "# and [CODE]='" & [CODE] & "'")))
    Et ça marche : OUF ! mais ça prend un temps ouf (aussi). La table ne fait que 21 000 enregistrements (avec 132 CODE(s) différents).

    Existe-t-il un moyen de la simplifier, sachant que :
    - Lorsque je suis à la DATE maximale pour mon CODE, je mets la date d’aujourd’hui (d’où le VraiFaux) et la nécessité ( ?) de calculer deux fois mon MinDom.
    - Les données dans DATE sont considérées JJ/MM/AAAA après le 12 de chaque mois et MM/JJ/AAAA avant le 12. Exemple : 12/08/2011 = 8 décembre 2011. D’où le cdate(format(DATE)…))

    L’avantage de l’utilisation de MinDom (ou MaxDom pour DATE PRECEDENTE), c’est que je n’avais besoin que d’une seule requête mise à jour. Mais à elle seule elle prend plus de temps que deux créations de tables avec des requêtes regroupement et une mise à jour de TABLE avec les deux nouvelles tables créées et dans ce cas, pas de problème de format de dates.
    L’autre solution que je n’arrive pas à appliquer serait sans doute une sous-requête, mais je n’arrive pas à la créer et faire le lien avec TABLE. Si c’est plus rapide, j’apprécierais votre aide pour sa syntaxe.

    Merci beaucoup (encore et encore).


    JPG

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 425
    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 425
    Points : 20 002
    Points
    20 002
    Billets dans le blog
    67
    Par défaut
    Salut,

    Voici des exemples d'utilisation de sous-requêtes.

    Remplace count, par Min et Max.

    A+

    Denis

  3. #3
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    Merci pour ta réponse.

    Je n'arrive pas à comprendre comment faire mon lien entre CODE de T1 et CODE de T2.

  4. #4
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Jpg75014 et User,

    Eh bien, tout est dans le lien indiqué pas User. Sauf que si tu n'arrives
    Citation Envoyé par Jpg75014
    pas à comprendre comment faire mon lien entre CODE de T1 et CODE de T2
    , il faut ajouter CODE de T1 = CODE de T2, dans la clause WHERE, puisque tu recherches les dates précédentes et suivantes pour le même CODE.

    A noter que, les fonctions MinDom() et MaxDom() sont, en final, des requêtes, donc des sous-requêtes, dans ton cas.

    Une chose que je ne comprends pas :
    Citation Envoyé par Jpg75014
    Les données dans DATE sont considérées JJ/MM/AAAA après le 12 de chaque mois et MM/JJ/AAAA avant le 12.
    ==> dans ta table initiale, toutes les valeurs du champ DATE devraient être de même format, non ?

  5. #5
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    Bonjour Richard,

    Merci pour ta réponse. Je vais essayer la clause Where.

    En ce qui concerne le format des dates, je n'ai aucun problème lorsqu'il s'agit de les classer et même de faire du SQL avec Min ou Max de Date.

    Lorsque j'utilise cette date dans mes fonctions Dmax ou Dmin le résultat les considère comme
    jj/mm/aaaa lorsqu'il n'en est pas possible autrement :
    14/09/2011 est forcément le 14 septembre 2011 (et non pas le 9è jour d'un 14ème mois)
    et mm/jj/aaaa lorsqu'il est possible d'inverser les jours et les mois
    12/09/2011 devient le 9è jour du 12è mois --> 9 décembre 2011
    Ce qui d'ailleurs ma mis la puce à l'oreille car cette date est supérieure à celle d'aujourd'hui

    par contre le résultat attendu me donne bien une date en bon format suivant ou précédant le 9 décémbre.

    Merci encore !

  6. #6
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    J'entends bien, mais tu ne réponds pas vraiment à la question
    Citation Envoyé par Richard_35
    dans ta table initiale, toutes les valeurs du champ DATE devraient être de même format, non ?
    ==> la valeur DATE de tous les enregistrements de la table est bien au même format, non ?

  7. #7
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    Oui parce qu'il ne s'agit que d'un seul champ.


    Dans ma table TABLE, j'ai un champ DT (avec comme valeurs les 12-14-15 septembre et le 10/12/2011).

    Avec Dmin, je souhaite obtenir pour le 12/09 la plus petite des dates supérieures. Dans mon cas, le 14/09/2011 donc.

    Lorsque je n'utilise pas le format mm/jj/aaaa (DT2), le résultat donne 10/12/2011 puisqu'il considère DT comme étant le 09/12/2011. Le résultat pour le 10/12/2011 n'est pas bon non plus (il devrait être Null car strictement >, mais dans ce cas la DT comparée est le 12 octobre).


    Lorque je l'utilise (DT3) j'obtiens bien le 14/09/2011 et Null pour le 10/12/2011.

    Dans DT1, je fais juste un calcul de DT+1 et j'obtiens bien 13/09/2011. Le format est donc bon ?

    ----DT---- ----DT1---- ----DT2---- ----DT3----
    12/09/2011 13/09/2011 10/12/2011 14/09/2011
    14/09/2011 15/09/2011 15/09/2011 15/09/2011
    15/09/2011 16/09/2011 10/12/2011 10/12/2011
    10/12/2011 11/12/2011 10/12/2011


    Mon SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TABLE.DT, [DT]+1 AS DT1, DMin("DT","TABLE","[DT]>#" & [DT] & "#") AS DT2, DMin("DT","TABLE","[DT]>#" & CDate(Format([DT],"mm/dd/yyyy")) & "#") AS DT3
    FROM [TABLE];

  8. #8
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Ce que je veux dire, c'est que tu ne devrais pas avoir besoin de faire tout ce mic-mac...

    Dans le SELECT :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DT_Précédente : (select top 1 x.DT from TABLE x where x.DT< [TABLE].[DT] order by x.DT desc)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DT_Suivante : (select top 1 x.DT from TABLE x where x.DT> [TABLE].[DT] order by x.DT)
    devrait suffire.

  9. #9
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    ça marche merci beaucoup. J'ai juste ajouté quelques crochets et un AS.

    Merci, merci et ... Résolu !

  10. #10
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Ah oui, je t'ai précisé dans le SELECT, mais, effectivement, il s'agissait du SELECT via l'assistant (":" => as, par exemple).

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    j'ai peut être loupé un épisode mais je ne suis pas certain que les deux requêtes proposées soient pérennes car la clef primaire de la table est composée...

    Philippe

  12. #12
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Philben,

    Merci pour ta remarque judicieuse.

    Tu as raison, j'ai oublié un test dans la clause WHERE, test que Jpg75014 n'aura pas manqué d'ajouter, je suppose. En même temps que le VraiFaux() qui teste l'absence de date précédente/suivante.

    Je me suis intéressé au principe de résolution, et non au détail... mea culpa.

    A bientôt.

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut

  14. #14
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    Bonjour,

    Me revoila après un long week-end.

    J'ai en effet ajouté le lien avec mon "CODE" dans la clause WHERE et ai testé la valeur NULL.

    Merci pour vos remarques.

    P'tite question tout de même. Mon utilisateur doit saisir ce CODE pour le lancement d'une requête. Donc la double clé primaire de ma table CODE/DATE ne me sert plus vraiment. C'est seulement la DATE qui devient unique.

    Pensez-vous que je puisse, pour gagner du temps, insérer dans le champ de ma requête, le critère de CODE (Comme"*" & MonFORM.CODE & "*") dans la sous-requête ? Ou Access fera tout de même le calcul sur toute la table.

    Mes tests n'ont pas été flagrants de réusssite et je ne sais pas si c'est ma syntaxe SQL qui est limite ou le critère CODE qui n'est pas pris en compte avant le calcul du champ DATE PRECEDENTE.

    Merci encore.

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

Discussions similaires

  1. [XL-2007] couleur cellule date differente si date passee, ou date du jour
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/03/2011, 09h24
  2. Réponses: 8
    Dernier message: 05/05/2006, 18h47
  3. Réponses: 4
    Dernier message: 27/04/2006, 10h22
  4. [formulaire] Proposition de la date suivante
    Par Duval51 dans le forum IHM
    Réponses: 11
    Dernier message: 30/03/2006, 10h20
  5. Réponses: 5
    Dernier message: 29/09/2004, 12h05

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