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

Access Discussion :

Requête(s) sur des enregistrements spécifiques avec dates


Sujet :

Access

  1. #1
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut Requête(s) sur des enregistrements spécifiques avec dates
    Bonjour,

    Après avoir regarder longement sur le Forum, je n'ai tout de même pas trouvé ce que je voulais, voici mon cas de figure:
    j'ai deux tables TBL_ENQUETES et TBL_CONTACTS

    TBL_ENQUETES :

    Pièce jointe 1318

    TBL_CONTACTS:

    Pièce jointe 1319

    le principe est :



    Pour chaque contacts vérifier a partir de la table TBL_CONTACTS que le bénéficiaire est actif (CON_DDF = null), vérifier la date de la dernière enquête et calculer le nombre de jours qui la sépare de la date du jour. Si le type de l'enquête concernée est "FAMILLE" , il faut retenir l'enregistrement si le nombre de jours calculé est supérieur à 6 mois.

    Si le type est autre que "famille", il faut retenir les enregistrements si le nombre de jours calculé est supérieur à 365 jours.


    Je dois créer un programme qui va avertir par une fenêtre message que les enquêtes doivent être révisées quand elles sont trop anciennes. Donc les enquêtes qui concernent les "FAMILLES" doivent être révisées tous les 6 mois. Les autres doivent être révisées tous les ans.

    Je sais pas mais je pense qu’avec uniquement du code sql on y arrivera pas je comptais faire tout d’abord une requête sql permettant de chercher la dernière date de l’enquête parmis les plusieurs enregistrements pour UN seul CONTACTS et ça pour tous les contacts,

    Actuellement j’ai fait cette requête pour obtenir la date max:

    Pièce jointe 1320

    En fait le code sql est ceci :

    SELECT TBL_ENQUETES.ID_ENQUETE, TBL_ENQUETES.ID_CONTACT, [TBL_ENQUETES].[Max(TBL_ENQUETES].[ENQ_DATE)] AS ENQ_DATE
    FROM TBL_CONTACTS INNER JOIN TBL_ENQUETES ON TBL_CONTACTS.ID_CONTACT = TBL_ENQUETES.ID_CONTACT
    WHERE (((TBL_CONTACTS.CON_DDF) Is Null));


    Mais une fenêtre me demande d’encoder une date alors que moi je veux que ce soit automatique. Bref même en entrant une date j’obtient quand même tous les enregistrements de la table ?


    N’étant pas expert dans l’affaire , je demande de l'aide.

    En vous remerciant

  2. #2
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    Salut !

    J'avoue que j'ai pas tout lu, mais une truc me parait bizarre :

    [TBL_ENQUETES].[Max(TBL_ENQUETES].[ENQ_DATE)]

    La parenthèse s'ouvre dans une paire de crochet, et se ferme dans une autre paire de crochet ?

    Ca m'est arrivé une paire de fois que la requête que je faisais me demande de saisir quelque chose, simplement parce-que j'avais une erreur de syntaxe dans ma requête.

  3. #3
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    Salut,

    Merci Temar, effectivement j'ai aussi constaté cela mais apparement
    ACCESS gère cela ? Comme tu n'as pas tout lu je voudrais que tu saches que deplus avec ce code une fenêtre me demande d’encoder une date alors que moi je veux que ce soit automatique. Bref même en entrant une date j’obtient quand même tous les enregistrements de la table alors que je veux uniquement ceux des + récentes dates ?

    Donc maintenant j'ai décomposé le problème.

    Je pense qu'avec 3 requêtes sql + du code VBA ca devrait aller.

    Mes 2 premières requêtes sont

    1. requêtes pour personnes actifs:
    SELECT TBL_ENQUETES.ID_ENQUETE, TBL_ENQUETES.ID_CONTACT
    FROM TBL_CONTACTS INNER JOIN TBL_ENQUETES ON TBL_CONTACTS.ID_CONTACT = TBL_ENQUETES.ID_CONTACT
    WHERE (((TBL_CONTACTS.CON_DDF) Is Null));

    2. requêtes pour catégorie Famille:
    SELECT [TBL_ENQUETES].[ID_ENQUETE], [TBL_ENQUETES].[ID_CONTACT]
    FROM TBL_CONTACTS INNER JOIN TBL_ENQUETES ON [TBL_CONTACTS].[ID_CONTACT]=[TBL_ENQUETES].[ID_CONTACT]
    WHERE ((([TBL_ENQUETES].[ENQ_P_A_CATEGORIE])="FAMILLE"));

    avec le code que j'ai fait :

    Sub Formload()



    dim SQLactifs as String 'requête pour sortir les enreg. des contacts toujours actifs
    dim SQLfam as String 'requête pour sortir les enreg. des contacts de la Categorie FAMILLE ceux pour
    'lesquels l'interval est de 6 mois
    dim SQLautr as String 'requête pour sortir les enreg. des autres contacts ceux pour
    'lesquels l'interval est de 1 ans




    SQLactifs= "SELECT TBL_ENQUETES.ID_ENQUETE, TBL_ENQUETES"
    SQLactifs= SQLactifs & ".ID_CONTACT FROM TBL_CONTACTS INNER JOIN"
    SQLactifs= SQLactifs & " TBL_ENQUETES ON TBL_CONTACTS.ID_CONTACT = "
    SQLactifs= SQLactifs & "TBL_ENQUETES.ID_CONTACT"
    SQLactifs= SQLactifs & "WHERE (((TBL_CONTACTS.CON_DDF) Is Null));"


    CurrentProject.Connection.Execute SQLactifs
    CurrentProject.Connection.Errors.Clear



    SQLfam= SQLactifs & "SELECT [TBL_ENQUETES].[ID_ENQUETE]"
    SQLfam= SQLfam & ", [TBL_ENQUETES].[ID_CONTACT]"
    SQLfam= SQLfam & "FROM TBL_CONTACTS INNER JOIN TBL_ENQUETES ON "
    SQLfam= SQLfam & "TBL_CONTACTS].[ID_CONTACT]=[TBL_ENQUETES].[ID_CONTACT]"
    SQLfam= SQLfam & "WHERE ((([TBL_ENQUETES].[ENQ_P_A_CATEGORIE])="FAMILLE"));"




    ?
    'ici je dois travailler sans doute avec SQLfam pour touver les dates de plus de 6
    ' mois d'intervalle en fesant attention de tenir compte de la dernière date enregistrée pour chaque
    ' contacts



    ' ensuite les contacts dont l'intervalle est de 1 an
    SQLautr=...?

    End Sub

    Voila un debut de code pour mes requetes sql , est-ce que tu vois mieux Temar? Et pourrais tu m'aider pour la structure, est elle bonne?

    Merci



  4. #4
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    Bonsoir !

    Pour savoir si une date de ta table est vieille de 6 mois, ou 1 an, il faut utiliser la fonction DiffDate.

    DiffDate("d", laDateQueTuVeuxComparer, date()

    Si le résultat est supèrieur a 365, c'est que la date est vieille de plus d'un an.
    Pour savoir si c'est vieux de 6 mois ou plus, ben tu regardes si le résultat est supèrieur 182.

    Voila, j'espère que ça va t'aider.

    Bon courage

  5. #5
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    Bonsoir,

    Merci Temar, la fonction Datediff me sera fort utile car justement pour la fonction Date max, j'y suis arrivé à sortir la plus récente date par une requête et maintenant je pourrais peut être utiliser cette date avec la fonction Datediff mais je sais pas comment l'implementer car c'est le résultat d"une requête?


    Mais suite à ce que j'ai ecrit je crois que je devrais être plus précis et systématique c'est pourquoi je reformule mon problème.


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

Discussions similaires

  1. Requête select avec jointure sur des enregistrements inexitant.
    Par faistoiplaisir dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2009, 17h36
  2. Requête MySQL sur des dates
    Par amazon dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/09/2009, 09h30
  3. Requête fausse sur des dates
    Par korrigan dans le forum SQL
    Réponses: 3
    Dernier message: 05/05/2008, 12h47
  4. Réponses: 9
    Dernier message: 18/02/2008, 11h00
  5. requete sql avec between sur des champs de type Date
    Par ersoufiane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/08/2006, 19h43

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