Tom's Guide > Forum > Programmation > Requêtes sql en Access avec dates

Requêtes sql en Access avec dates

Forum Programmation : Requêtes sql en Access avec dates

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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




Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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

Répondre à isabelle b

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/li [...] ntsanchor2

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

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Merci pour votre réponse mais ca ne fonctionne pas

vois ma requete

Code :
  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

Répondre à isabelle b

Je pense que le having attend une condition. Et en ajoutant ce qui suit ?

Code :
  1. HAVING DEMANDE_DOCS_DU = Max(T_DEMANDE_DOCS.DEMANDE_DOCS_DU)



Sinon, avec ta requête de base, quelle erreur est retournée?

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

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 ?



Répondre à isabelle b

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.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

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

Répondre à isabelle b

Je ne connais pas rechdom. A voir au niveau des performances (peut-être mieux comme pire).

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Merci de ton aide

je finirais bien par le trouver

mais pour le moment ca marche

bon dimanche

Répondre à isabelle b

Merci de ton aide

je finirai bien par le trouver

mais pour le moment ca marche

bon dimanche

Répondre à isabelle b
Tom's Guide > Forum > Programmation > Requêtes sql en Access avec dates
Aller à :

Il y a 1370 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens