Se connecter / S'enregistrer
Votre question

Requêtes sql en Access avec dates

Tags :
  • Sql
  • Programmation
Dernière réponse : dans Programmation
27 Mai 2006 21:01:28

Bonsoir,

Voila j'ai un problème, je n'arrive pas selectionner tous les champs d'une table
en selectionnant un enregistrement parmis plusieurs enregistrements propre à un même ID.
Et ça en fonction de la date la plus récente.

Je m'explique, j'ai deux tables:


TBL_ENQUETES :

ID_ENQUETE ID_CONTACT ID_ASOCIALE ENQ_DATE ENQ_CAT
2 19 2665 1/11/1995 1
3 20 2665 1/11/1996 2
4 21 2663 1/12/1996 2
5 2 2665 1/01/1997 3
6 19 2661 6/11/1998 1
7 11 2665 1/11/1998 1
8 10 2665 7/12/1998 2
9 3 2665 1/04/1999 1
10 4 2665 1/10/1999 1
11 10 2662 1/11/1999 3
12 10 2665 15/11/1999 2



TBL_CONTACTS :

ID_CONTACT CONT_debut CONT_fin
2 1/11/1996
3 11/12/1996 1/11/1998
4 1/11/1997
5 4/11/1997 3/12/1998
6 1/10/1998
7 4/04/1999
8 1/10/1999 1/11/1999
9 1/11/1999
10 12/11/1999 1/11/2000
11 7/06/2000
12 13/04/2001




Chaque ENquête est unique mais peut representer un même contact.
Comment faire pour selectionner le dernier enregistrement (en date )
d'une enquête parmis les eventuels autres enquêtes qu'aurait pu avoir une
même personne et afficher aussi le champ ID_ENQUETE?

Rmq: Il s'agit des contacts dont le champ CONT_fin est nul.




J'ai un code sql:


SELECT TBL_ENQUETES.ID_CONTACT, Max(TBL_ENQUETES.ENQ_DATE) AS ENQ_DATE
FROM TBL_CONTACTS INNER JOIN TBL_ENQUETES ON TBL_CONTACTS.ID_CONTACT = TBL_ENQUETES.ID_CONTACT
GROUP BY TBL_ENQUETES.ID_CONTACT;


Il me sort les enregistrements des dernières dates mais je n'arrive pas
à faire apparaitre le champ ID_ENQUETE associé ?

un autre code:

SELECT TBL_ENQUETES.ID_ENQUETE, TBL_ENQUETES.ID_CONTACT, Max(TBL_ENQUETES.ENQ_DATE) AS ENQ_DATE
FROM TBL_CONTACTS INNER JOIN TBL_ENQUETES ON TBL_CONTACTS.ID_CONTACT = TBL_ENQUETES.ID_CONTACT
GROUP BY TBL_ENQUETES.ID_CONTACT;

mais j'obtient message d'erreur (agregat...)


Comment faire, pouvez vous m'aider?



Pour la suite:

-Je devrais comparer ces dates à la date d'aujourd' hui
et donc calculer une difference de temps et en fonction de la categorie
enquête (ENQ_CAT) si cette difference est supérieur à 6 mois ou 1 an
faire un message d'alerte pour faire une nouvelles equête pour les contacts
concernés.

-Ensuite par regroupement envoyer le résultats avec les coordonnées et
dernière date d'enquête des personnes vers un rapport pour Inmpression.



Merci beaucoup




Autres pages sur : requetes sql access dates

17 Mai 2008 09:10:30

bonjour Alibuzzer

votre message sur tom's guide date de 2006 et peut être avez vous trouver la réponse.


Je recherche à faire la même requete, si vous avez trouver la solution pourriez vous m'aider ?

je dois dans une requete qui contient plusieurs fois le meme id contact et plusieurs dates retrouver l'enregistrement de la date la plus ancienne. C'est exactement ce que vous aviez demander à l'époque.

Merci d'avance
a b L Programmation
17 Mai 2008 13:22:03

Par rapport à sa dernière requête, il fallait peut-être déplacer la fonction d'agrégation Max(...) dans un HAVING.

http://msdn.microsoft.com/en-us/library/66dhb85f(VS.80).aspx#fogrfconsiderationsforsqlselectstatementsanchor2

  1. SELECT TBL_ENQUETES.ID_ENQUETE, TBL_ENQUETES.ID_CONTACT, TBL_ENQUETES.ENQ_DATE AS ENQ_DATE
  2. FROM TBL_CONTACTS INNER JOIN TBL_ENQUETES ON TBL_CONTACTS.ID_CONTACT = TBL_ENQUETES.ID_CONTACT
  3. GROUP BY TBL_ENQUETES.ID_CONTACT
  4. HAVING Max(TBL_ENQUETES.ENQ_DATE);

(non testé)
Contenus similaires
17 Mai 2008 13:57:51

Merci pour votre réponse mais ca ne fonctionne pas

vois ma requete
  1. SELECT T_CONTRAT.ID_CONTRAT, T_SITE.SITE, T_SOUSTRAITANT.SOUSTRAITANT, Max(T_DEMANDE_DOCS.DEMANDE_DOCS_DU) AS MaxDeDEMANDE_DOCS_DU, IIf([DKBIS]=Yes,"ATTENTE ST",[CKBIS]) AS VKBIS, IIf([DURSSAF]=Yes,"ATTENTE ST",[CURSSAF]) AS VURSSAF, IIf([DQUALIF]=Yes,"ATTENTE ST",[CQUALIFREF]) AS VQUALIFREF, IIf([D3666DC7]=Yes,"ATTENTE ST",[C3666_OU_DC7]) AS V3666_OU_DC7, IIf([DCP]=Yes,"ATTENTE ST",[CCONGES_PAYES]) AS VCONGES_PAYES, IIf([DDHONNEUR]=Yes,"ATTENTE ST",[CD_HONNEUR]) AS VD_HONNEUR, IIf([DAHONNEUR]=Yes,"ATTENTE ST",[CA_HONNEUR]) AS VA_HONNEUR
  2. FROM (T_CONTRAT_SITE INNER JOIN (T_SOUSTRAITANT INNER JOIN (T_SITE INNER JOIN (T_CONTRAT INNER JOIN R_FPAPIER ON T_CONTRAT.ID_CONTRAT = R_FPAPIER.ID_CONTRAT) ON T_SITE.ID_SITE = R_FPAPIER.ID_SITE) ON (T_SOUSTRAITANT.ID_SOUSTRAITANT = T_CONTRAT.ID_SOUSTRAITANT) AND (T_SOUSTRAITANT.ID_SOUSTRAITANT = R_FPAPIER.ID_SOUSTRAITANT)) ON (T_CONTRAT.ID_CONTRAT = T_CONTRAT_SITE.ID_CONTRAT) AND (T_SITE.ID_SITE = T_CONTRAT_SITE.ID_SITE) AND (T_CONTRAT_SITE.ID_CONTRAT_SITE = R_FPAPIER.ID_CONTRAT_SITE)) INNER JOIN T_DEMANDE_DOCS ON T_CONTRAT_SITE.ID_CONTRAT_SITE = T_DEMANDE_DOCS.ID_CONTRAT_SITE
  3. GROUP BY T_CONTRAT.ID_CONTRAT, T_SITE.SITE, T_SOUSTRAITANT.SOUSTRAITANT, IIf([DKBIS]=Yes,"ATTENTE ST",[CKBIS]), IIf([DURSSAF]=Yes,"ATTENTE ST",[CURSSAF]), IIf([DQUALIF]=Yes,"ATTENTE ST",[CQUALIFREF]), IIf([D3666DC7]=Yes,"ATTENTE ST",[C3666_OU_DC7]), IIf([DCP]=Yes,"ATTENTE ST",[CCONGES_PAYES]), IIf([DDHONNEUR]=Yes,"ATTENTE ST",[CD_HONNEUR]), IIf([DAHONNEUR]=Yes,"ATTENTE ST",[CA_HONNEUR]), T_CONTRAT_SITE.ID_SITE;


Je n'arrive pas à écrire le HAVING en question, lorsque je l'ajoute directement dans le sql, il me répond qu'il manque un opérateur


merci CRicky

isabelle
a b L Programmation
17 Mai 2008 17:52:27

Je pense que le having attend une condition. Et en ajoutant ce qui suit ?
  1. HAVING DEMANDE_DOCS_DU = Max(T_DEMANDE_DOCS.DEMANDE_DOCS_DU)


Sinon, avec ta requête de base, quelle erreur est retournée?
17 Mai 2008 19:40:52

bonsoir,

j'y suis de depuis ce matin et je ne m'en sors pas...

en fait il n'y a pas d'erreur retournée mais il ne me renvoit pas juste la ligne de la demande la plus récente

comme j'ai des conditions vrai faux dans vkbis vurssaf etc... il me rajoute toutes les lignes

En fait j'enregistre la date du kbis du sous traitant dans la T_SOUSTRAITANT

Le kbis n'est valable que 6 mois aussi en fonction du chantier qu'il va faire, j'effectue un calcul (très savant) :pt1cable:  pour qu'il affiche, "ok", ou "à renouveler" c'est le champ [ckbis] avec (c pour calcul) 'dans une requete

puis je demande au sous traitant via une demande de docs (si son kbis est périmé) en cochant une autre case nommée 'dkbis' (d pour demande) - il peut y avoir plusieurs demandes, mais celle qui m'intéresse est la plus récente

Je reprends l'ensemble Kbis, ckbis et dkbis dans une requete et Si [dkbis] est coché, je demande dans un champ calcul [Vkbis] (v pour validation) d'afficher "En Attente St", ou la valeur de ckbis

Il se peut donc que la valeur de ckbis passe de "ok" à "a renouveler" dans l'intervalle entre ma dernière demande et aujourd'hui. C'est cela que je veux surveiller.

dans ma requete je souhaite afficher si le kbis est à renouveler entre ma dernière demande de docs et aujourd'hui (car il arrive souvent que le sous traitant mette du temps à renvoyer ses documents) et de m'avertir en affichant les documents à renouveler que je n'aurais pas demander

malheureusement je pense qu'il faut que je lui indique que je veux la date de la dernière demande dans le critére de la requete (dans la grille opération) j'ai essayé avec max, mais ca ne fonctionne toujours pas

désolée d'avoir été si longue et merci à toi


c'est le meme procédé pour urssaf, congés payés....

est ce que tu comprends ce que je veux expliquer ?



a b L Programmation
17 Mai 2008 20:00:13

La base de données et correcte ? tu peux tester sur une fausse petite base.
Au pire, tu peux ça en 2 commandes SELECT : une pour récupérer le MAX et l'autre pour sélectionner selon le MAX.
17 Mai 2008 20:13:30

C'est ce que j'ai fait je viens de trouver à l'instant

j'ai regrouper tout mes champs à renouveler dans un seul avec dans la requete

si kbis est à renouveler, alors " renouveler", si urssaf est à renouveler alors "renouveler".....

et j'ai refait un max sur la date

eh bien, il en aura fallu du temps

mais n'est_il pas possible de faire une rechdom par exemple sur la date et l'écrire dans le critère ?

je pense que cela aurait été plus simple non ?

pb c'est que je ne sais pas l'écrire

merci de ton encouragement et ton aide
a b L Programmation
17 Mai 2008 21:12:47

Je ne connais pas rechdom. A voir au niveau des performances (peut-être mieux comme pire).
18 Mai 2008 11:47:51

Merci de ton aide

je finirais bien par le trouver

mais pour le moment ca marche

bon dimanche
18 Mai 2008 11:48:15

Merci de ton aide

je finirai bien par le trouver

mais pour le moment ca marche

bon dimanche
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS