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

Requêtes et SQL. Discussion :

Recherche anniversaire entre deux dates [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 57
    Points : 47
    Points
    47
    Par défaut Recherche anniversaire entre deux dates
    Bonsoir à tous et meilleurs voeux.

    Je me trouve devant un nouveau problème. J'ai une table dans laquelle se trouve un champ "dateAnniversaire".

    J'ai créé un formulaire "RechercheDateAnniv" dans lequel se trouve deux champ. Le 1er "dateDébut" et le second "dateFin". Un bouton avec une macro liée me permet de lancer une requête dans laquelle je récupère la valeur "date anniversaire".

    Ce que j'essaie d'obtenir c'est qu'une fois les deux champ date du formulaire "RechercheDateAnniv", c'est extraire tous les anniversaires quelque soit l'année de naissance, compris entre ces deux dates.

    J'espère avoir été suffisamment clair. J'attends avec impatience vos solutions.

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 612
    Points
    58 612
    Billets dans le blog
    11
    Par défaut
    Salut,

    Il te suffit de mettre tes deux champs du formulaire dans ta requête et d'utiliser la fonctionnalité between sur le champ dateAnniversaire.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  3. #3
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Mobydisk21 bonjour,

    zoom61 je pense que Mobydisk21 souhaite filtrer uniquement sur la période concernant un mois et un jour à partir de deux valeurs dates saisies dans un formulaire (l'année devenant donc caduque dans le filtre de recherche).

    Je te propose la technique suivante :

    Inverser le moisjour sur tes filtres de recherche ainsi la date du 10/01/2015 deviendrait 0110. En agissant de la même manière sur le champ issue de ta table dateAnniversaire (de type date je suppose ert correspondant à la date de naissance). Si date anniversaire n'est pas de type date, tu appliqueras la même technique en modifiant quelque peu ta requête

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCTROW [tClients].nomClient, Format(Nz(Month([DateAnniversaire]),0),"00") & Format(Nz(Day([DateAnniversaire]),0),"00") AS t
    FROM [tClients]
    WHERE (((Format(Nz(Month([DateAnniversaire]),0),"00") & Format(Nz(Day([DateAnniversaire]),0),"00"))>=Format(Month([forms]![monForm]![DateDebut]),"00") & Format(Day([forms]![monForm]![DateDebut]),"00") And (Format(Nz(Month([DateAnniversaire]),0),"00") & Format(Nz(Day([DateAnniversaire]),0),"00"))<=Format(Month([forms]![monForm]![DateFin]),"00") & Format(Day([forms]![monForm]![DateFin]),"00")))
    WITH OWNERACCESS OPTION;

    A toi de jouer maintenant

    jimmy
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Merci pour ces explications. Effectivement ma requête ne doit porter que sur les éléments jours et mois.

    Cependant mes connaissances en VB étant plus que Basic... je je sais pas ou je vais pouvoir placer ces lignes de code. Auriez vous une autre solution peut être un peu plus à ma portée?

    Merci d'avance

  5. #5
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 869
    Points : 3 448
    Points
    3 448
    Par défaut
    Bonjour Mobydisk21,

    Tu copies le code de Jean-Marie directement dans le QBE d'Access. Ensuite tu modifies "Format(Month([forms]![monForm]![DateDebut]),"00")" par le nom de ton formulaire. La requête ainsi créée va te retourner les anniversaires entre 2 date choisies.

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  6. #6
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Robert

    je profite de l'occasion pour te souhaiter les meilleures choses pour cette nouvelle année !

    ps. j'ai validé chez moi l'exemple, il fonctionne à merveille (plus qu'à transposer de ton côté Mobydisk21)

    Jean-Marie
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Bonjour
    Tout d'abord merci pour toutes ces explications. Cependant mes migres connaissances en SQL ne m'ont pas permis de solutionner mon problème. Je pense qu'il ne doit s'agir que d'erreur de syntaxe alors, pouvez vous encore me guider?

    Je vous donne donne tout d'abord quelques précisions:
    Le nom de la table dans laquelle se trouve les données est "ATTESTATION"
    Le champ ou l'on trouve les noms des personnes est "NOM"
    Le champ ou l'on trouve les dates de naissance est "date naissance"
    Le formulaire dans lequel je saisi les dates de début et fin de requête se nomme "EditionAnniversaire"
    Les deux champs dates se nomment "DateDébutDep" et "DateFinDep".

    Ci dessous voici le code que j'ai saisi et cela ne fonctionne pas.

    J'attends à nouveau vos conseils avisés.

    Merci d'avance

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCTROW [ATTESTATION].NOM, Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00") AS t
    FROM [ATTESTATION]
    WHERE (((Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00"))>=Format(Month([forms]![EditionAnniversaire]![DateDébutDep]),"00") & Format(Day([forms]![EditionAnniversaire]![DateDébutDep]),"00") And (Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00"))<=Format(Month([forms]![EditionAnniversaire]![DateFinDep]),"00") & Format(Day([forms]![EditionAnniversaire]![DateFinDep]),"00")))
    WITH OWNERACCESS OPTION;

  8. #8
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Mobydisk21,

    le plus simple ne serait-il pas de me fournir un extrait de ta base (hors données sensibles) ?

    jm
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Je ne pense pas que cela soit possible car elle est très lourde.

    Alors il va falloir essayer de composer sans cette dernière.

    Encore une question qui pourrait éclairer ma lanterne.

    À quoi correspond le "t" en bout de première ligne dans la solution SQL fournit ?

    Merci d'avance

  10. #10
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    il s'agit d'un alias !

    tu peux le remplacer par n'importe quoi ?

    J'ai lancé ta requête dans mon projet test, et elle fonctionne


    le requête améliorée :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCTROW ATTESTATION.NOM, ATTESTATION.[date naissance]
    FROM ATTESTATION
    WHERE (((Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00"))>=Format(Month([forms]![EditionAnniversaire]![DateDébutDep]),"00") & Format(Day([forms]![EditionAnniversaire]![DateDébutDep]),"00") And (Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00"))<=Format(Month([forms]![EditionAnniversaire]![DateFinDep]),"00") & Format(Day([forms]![EditionAnniversaire]![DateFinDep]),"00")))
    WITH OWNERACCESS OPTION;

    et ici la base exemple

    bonne réception

    jm
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Un bon dessin vaut mieux que de grands discours.

    Ca y est tout fonctionne comme je le souhaitais.

    Grand merci à toi.

    Cordialement

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Désolé j'ai parlé un peu trop vite.

    Ca fonctionne, oui mais lorsque les date de début et de fin de requête sont de la même année. Dans le cas contraire, aucune donnée n'apparait.

    Aurais tu une idée pour solutionner ce problème

    Merci par avance.

  13. #13
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Mobydisk21

    Ca fonctionne, oui mais lorsque les date de début et de fin de requête sont de la même année. Dans le cas contraire, aucune donnée n'apparait.
    Etant donné que la requête ne traite en aucun cas de l'année, j'avoue être perplexe ? La recherche s'effectue uniquement sur le mois et le jour. Le but de la requête, sauf erreur de ma part étant bien de sélectionner des clients dont l'anniversaire serait dans la borné fixée hors année.

    Ce que j'essaie d'obtenir c'est qu'une fois les deux champ date du formulaire "RechercheDateAnniv", c'est extraire tous les anniversaires quelque soit l'année de naissance, compris entre ces deux dates.
    Un exemple avec des données précises serait le bienvenu, n’hésites pas à enrichir la base de quelques exemples si nécessaire

    jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Je m'explique :
    Critères de recherche "DateDébutDep" : 29/12/2014 - "DateFinDep" : 28/01/2015

    Lorsque je saisi cet exemple dans la base que tu m'a envoyé, la requête est vide alors que le résultat devrait contenir 2 enregistrements.

    Cependant si je modifie mes critères de recherche comme suit : "DateDébutDep" : 01/01/2015 - "DateFinDep" : 28/01/2015,
    les 2 enregistrements apparaissent.

    Aurais tu une solution ou une explication à ce problème?

    Merci de ta patience envers mon ignorance.

  15. #15
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Mobydisk21,

    Effectivement oui, j'attendais ta réponse sur ce point...

    Redécoupons le problème : dans la solution apportée j'ai décomposée les dates saisies sur ton formulaire en mois-année ainsi la date du 29/12/2014 devient 1229 et la date de fin (28/01/2015) devient 0128. Le principe de regroupement sur la date de Naissance est assujettie aux mêmes règles (imaginons 07/05/1985 -> 0507)

    donc 0507 ne peut >= à 1229 et <=0128. La règle n'est donc applicable que sur une année pleine !

    Alors le principe se complique un petit peu mais diverses solutions s'offrent à nous, deux techniques peuvent être utilisées

    1. principe de requête union (on traite une requête du 29/12 au 31/12 puis une du 01/01 au 28/01) et on agrège les résultats,
    2. Passage de deux filtres dans une requête unique : dans le cas ou la borne inférieure et inférieure à la borne supérieure le deuxième filtre devient inopérant (valeur pivot 9999 par exemple), dans le cas contraire on décompose comme dans le principe de la requête union et on transmets les deux valeurs de la requête)

    Je te propose la mise en place de la deuxième solution en agissant sur le formulaire afin de contrôler les bornes...

    Réponse dans la journée

    jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  16. #16
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Mobydisk21,

    Voilà la réponse apportée :

    j'ai donc décider d'apporter la décomposition des filtres dans le formulaire EditionAnniversaire en positionnant 4 valeurs permettant le découpage des dates. Donc en reprenant mon idée de base, si la valeur début moisjour est antérieure à la valeur fin moisjour, le deuxième filtre s’opérera sur des valeurs fictives (9999 et 9999). Dans ce cas aucune date de naissance ne répondra à ce deuxième filtre (inutile).

    Si la valeur début moisjour est supérieure à la valeur fin moisjour (ton exemple) nous effectuerons donc une recherche des clients nés entre ta date début et le 31/12 puis ceux du 01/01 à la date de fin.

    J'ai donc crée 4 champs indépendants (que tu pourras rendre visible à false) afin de positionner les valeurs de mes filtres (notés F1_PivotDebut, F1_PivotFin, F2_PivotDebut et F2_PivotFin). F1 ou F2 spécifiant les filtres utilisés dans notre requête future.

    Nom : filtres.JPG
Affichages : 427
Taille : 30,6 Ko


    Sur le bouton permettant d'afficher le résultat j'ai donc inséré le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Private Sub Commande4_Click()
        Dim pivotCalculd As String, pivotCalculf As String
        '
        ' Contrôle de saisie
        '
        If Nz(Me.DateDébutDep, "") = "" Then Exit Sub
        If Nz(Me.DateFinDep, "") = "" Then Exit Sub
        '
        ' Calcul des dates pivots
        '
        pivotCalculd = Format(Month(Me.DateDébutDep), "00") & Format(Day(Me.DateDébutDep), "00")
        pivotCalculf = Format(Month(Me.DateFinDep), "00") & Format(Day(Me.DateFinDep), "00")
        '
        If Val(pivotCalculf) >= Val(pivotCalculd) Then
            ' pas de changement d'année
            Me.F1_PivotDebut = pivotCalculd
            Me.F1_PivotFin = pivotCalculf
            Me.F2_PivotDebut = "9999"
            Me.F2_PivotFin = "9999"
        Else
            ' changement d'année
            Me.F1_PivotDebut = pivotCalculd
            Me.F1_PivotFin = "1231"
            Me.F2_PivotDebut = "0101"
            Me.F2_PivotFin = pivotCalculf
        End If
        '
        DoCmd.OpenQuery "qresults"
    End Sub
    Le code est suffisamment explicite, mais tu remarqueras aisément que les pivots sont calculés directement dans le formulaire et non plus dans la requête (nous verrons sa transformation plus tard).

    Donc nous pouvons arriver aux deux cas situations suivants et matérialisés ici : regarde bien les valeurs des champs filtres dans les deux cas d'utilisation :

    Nom : exemple.jpg
Affichages : 593
Taille : 54,9 Ko

    Notre requête SQL avec modification des filtres utilisant la combinaison des valeurs récupérés devient ainsi :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCTROW ATTESTATION.NOM,
           ATTESTATION.[date naissance]
    FROM ATTESTATION
    WHERE ((((Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00")))>=[forms]![EditionAnniversaire]![F1_PivotDebut]
            AND ((Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00")))<=[forms]![EditionAnniversaire]![F1_PivotFin]))
      OR ((((Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00")))>=[forms]![EditionAnniversaire]![F2_PivotDebut]
           AND ((Format(Nz(Month([date naissance]),0),"00") & Format(Nz(Day([date naissance]),0),"00")))<=[forms]![EditionAnniversaire]![F2_PivotFin])) WITH OWNERACCESS OPTION;

    Le formatage de la date issue du formulaire est donc devenu caduque, nous ne faisons ici que récupérer les valeurs du formulaire.


    Bon je te laisse digérer mes explications, et n'hésite pas à me poser des questions sur les points à élucider
    Je te fourni la base exemple ayant servie à ma réponse.

    Bonne continuation

    JimboLion
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Merci encore une fois pour ta patience et ta persévérance.

    A présent ça fonctionne sans souci.

    Au plaisir de te demander des conseils

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/04/2013, 22h44
  2. Réponses: 2
    Dernier message: 22/04/2013, 21h51
  3. [XL-2000] Somme de recherche V entre deux dates
    Par gocho dans le forum Excel
    Réponses: 3
    Dernier message: 03/06/2009, 15h37
  4. Resultat de recherche entre deux dates
    Par Titeuf_sql dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/03/2007, 15h38
  5. recherche entre deux dates dans une requête
    Par emmanuel4945 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 29/11/2006, 21h42

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