Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/09/2011, 11h06   #1
Futur Membre du Club
 
Jean Pierre
Inscription : mars 2009
Messages : 63
Détails du profil
Informations personnelles :
Nom : Jean Pierre
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2009
Messages : 63
Points : 19
Points : 19
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 :
Citation:
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
jpg75014 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 13h36   #2
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 258
Points : 5 258
Salut,

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

Remplace count, par Min et Max.

A+

Denis
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 10h20   #3
Futur Membre du Club
 
Jean Pierre
Inscription : mars 2009
Messages : 63
Détails du profil
Informations personnelles :
Nom : Jean Pierre
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2009
Messages : 63
Points : 19
Points : 19
Merci pour ta réponse.

Je n'arrive pas à comprendre comment faire mon lien entre CODE de T1 et CODE de T2.
jpg75014 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h02   #4
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
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 ?
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h51   #5
Futur Membre du Club
 
Jean Pierre
Inscription : mars 2009
Messages : 63
Détails du profil
Informations personnelles :
Nom : Jean Pierre
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2009
Messages : 63
Points : 19
Points : 19
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 !
jpg75014 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 12h13   #6
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
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 ?
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 14h19   #7
Futur Membre du Club
 
Jean Pierre
Inscription : mars 2009
Messages : 63
Détails du profil
Informations personnelles :
Nom : Jean Pierre
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2009
Messages : 63
Points : 19
Points : 19
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 :
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];
jpg75014 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 14h55   #8
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
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 :
DT_Précédente : (SELECT top 1 x.DT FROM TABLE x WHERE x.DT< [TABLE].[DT] ORDER BY x.DT DESC)
Code sql :
DT_Suivante : (SELECT top 1 x.DT FROM TABLE x WHERE x.DT> [TABLE].[DT] ORDER BY x.DT)
devrait suffire.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 17h25   #9
Futur Membre du Club
 
Jean Pierre
Inscription : mars 2009
Messages : 63
Détails du profil
Informations personnelles :
Nom : Jean Pierre
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2009
Messages : 63
Points : 19
Points : 19
ça marche merci beaucoup. J'ai juste ajouté quelques crochets et un AS.

Merci, merci et ... Résolu !
jpg75014 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 17h45   #10
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Ah oui, je t'ai précisé dans le SELECT, mais, effectivement, il s'agissait du SELECT via l'assistant (":" => as, par exemple).
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 19h49   #11
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
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
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 10h22   #12
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
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.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 22h21   #13
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 18h58   #14
Futur Membre du Club
 
Jean Pierre
Inscription : mars 2009
Messages : 63
Détails du profil
Informations personnelles :
Nom : Jean Pierre
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2009
Messages : 63
Points : 19
Points : 19
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.
jpg75014 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h13.


 
 
 
 
Partenaires

Hébergement Web