Se connecter avec
S'enregistrer | Connectez-vous

Requêtes sql en Access avec dates

Dernière réponse : dans Programmation

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

Lassé par la pub ? Créez un compte

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
Expert Programmation

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é)

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
Expert Programmation

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?

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 ?



Expert Programmation

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.

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
Lassé par la pub ? Créez un compte
Tom's guide dans le monde