Filtrage sur mois() dans ACCESS

Résolu
Bonjour,

Sous access, dans une requête, je veux filtrer des dates avec les fonctions Mois() et Année().
J'ai un champ "Date", j'ai créé 2 champs:
- Année: Année([Date]) avec condition de filtrage [Année :]
- Mois: Mois([Date]) avec condition de filtrage <[N° du mois ?]
A l'exécution de cette requête, le filtrage fonctionne pour l'année (enregistrements de l'année entrée à la question [Année:]) mais pas pour le mois: par exemple,en entrant 2 (février), l'affichage me donne les enregistrements de janvier (bon) mais aussi ceux d'ocobre (10), novembre (11) et décembre (12);
Comme si mois() était une valeur alpha-numérique...
Avec [N° du mois ?] (égal), cela fonctionne.
Où est l'erreur ?
Merci d'avance.

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonsoir JV-Vierzon,

    En adaptant cette requête, vous travaillerez uniquement sur le champ date.
    Et, donc, si vous saisissez :12 en tant que tantième et : 2010 en tant que millésime, vous listerez diredtement les enregistrement de décembre 2010.

    SELECT TRANSACTIONS.DateSaisie, TRANSACTIONS.RéfValeur, DatePart("m",[Datesaisie]) AS Mois, DatePart("yyyy",[Datesaisie]) AS Millésime
    FROM TRANSACTIONS
    WHERE (((DatePart("m",[Datesaisie]))=[ Tantième du mois ? ]) AND ((DatePart("yyyy",[Datesaisie]))=[ Millésime ? ]))
    ORDER BY DatePart("m",[Datesaisie]);

    Cordialement
    1. Bonjour Jean-Jacques

      Je vous remercie pour la rapidité de votre réponse.
      Mais j'ai toujours le même problème: cette requête fonctionne bien pour rechercher les enregistrements d'un mois donné:

      SELECT [26_01_ProduitsColis].N°Annuaire, [26_01_ProduitsColis].Date, DatePart("m",[Date]) AS Mois
      FROM 26_01_ProduitsColis
      WHERE (((DatePart("m",[Date]))=[ Tantième du mois ? ]) AND ((DatePart("yyyy",[Date]))=[ Millésime ? ]))
      ORDER BY DatePart("m",[Date]);

      Mais pour filtrer les enregistrements des mois antérieurs:

      SELECT [26_01_ProduitsColis].N°Annuaire, [26_01_ProduitsColis].Date, DatePart("m",[Date]) AS Mois
      FROM 26_01_ProduitsColis
      WHERE (((DatePart("m",[Date]))<[ Tantième du mois ? ]) AND ((DatePart("yyyy",[Date]))=[ Millésime ? ]))
      ORDER BY DatePart("m",[Date]);

      Pour un millésime de valeur 2 (février), les enregistrements des mois 2 à 9 sont effectivement bloqués mais pas pour les mois 10, 11 et 12.
      Hors ces nombres, valeur du mois, sont numériques (?) et 10 à 12 devraient ne pas être considéré comme <2.
      Le filtre semble alphabétique en considérant ces valeurs comme chaine de caractère : "2" est effectvement plus grand que "10", "11" et "12" qui commencent par 1.

      Merci d'avance pour vos lumières.
      Jean
    2. Bonjour
      Voici un exemple de requete parametre
      ou tu indique le choix du mois et de l'année

      SELECT TRANSACTIONS.Datesaisie, DatePart("m",[Datesaisie]) AS Mois, DatePart("yyyy",[Datesaisie]) AS Années
      FROM TRANSACTIONS
      WHERE (((DatePart("m",[Datesaisie]))=[Quel Mois]) AND ((DatePart("yyyy",[Datesaisie]))=[Quelle Année]))
      ORDER BY DatePart("m",[Datesaisie]);
  2. Bonjour JV-Vierzon,

    Faute de mieux, voici une solution approchante.
    Car il apparait que l'argument <= est strictement respecté, alors que, étrangement, < utilisé seul ne l'est pas......
    Je vous laisse apprécier, ou pas...

    SELECT TRANSACTIONS.DateSaisie, TRANSACTIONS.RéfValeur, DatePart("m",[Datesaisie]) AS Mois, DatePart("yyyy",[Datesaisie]) AS Millésime
    FROM TRANSACTIONS
    WHERE (((DatePart("m",[Datesaisie]))<=[ Tantième du mois ? ]) AND ((DatePart("yyyy",[Datesaisie]))=[ Millésime ? ]));

    Cordialement
    1. Bonjour JV-Vierzon,

      Les puristes n'apprécierons que modérémment, mais ... ça fonctionne ...
      - En insérant - 1 après -> [ Tantième du mois ? ]-1
      La requête liste les enregistrements antérieurs à la valeur du tantième de mois saisi ...

      SELECT TRANSACTIONS.DateSaisie, TRANSACTIONS.RéfValeur, DatePart("m",[Datesaisie]) AS Mois, DatePart("yyyy",[Datesaisie]) AS Millésime
      FROM TRANSACTIONS
      WHERE (((DatePart("m",[Datesaisie]))<=[ Tantième du mois ? ]-1) AND ((DatePart("yyyy",[Datesaisie]))=[ Millésime ? ]))
      ORDER BY DatePart("m",[Datesaisie]);

      Cordialement
      1. Bonjour Jean-Jacques.

        Merci pour votre aide qui m'a aidé dans cette recherche. La solution suivante fonctionne:

        SELECT [26_01_ProduitsColis].N°Annuaire, [26_01_ProduitsColis].Date, DatePart("m",[Date]) AS Mois, DatePart("yyyy",[Date]) AS Année
        FROM 26_01_ProduitsColis
        WHERE (((DatePart("m",[Date]))<Val([N° du mois :])) AND ((DatePart("yyyy",[Date]))=[Année :]))
        ORDER BY DatePart("m",[Date]);

        L'utilisation de la fonction VAL() force la mise ne numérique de mes données dans [N° du mois :].
        Je pense que c'est équivalent au -1 proposé (solution que j'ai déjà utilisé dans Excel lors de copier-coller pour forcer les valeurs à être en numérique: Collage spécial/Multiplier dans une colonne remplie de 1).

        Ce qui est bizarre, c'est que la valeur, toujours un chiffre, entrée dans la variable [N° du mois :] soit considérée, par défaut, comme une chaîne de caractère par ACCESS et qu'il puisse la comparer à une valeur normalement numérique: Mois().

        Mon retour dans les bases de données que j'avais quittées il y a quelques années (DBase sur Amstrad) est bien laborieux.

        Par contre, il n'y avait pas à cette époque d'Internet et de forums comme le votre qui sont d'une grande aide.

        Merci à ceux qui donne de leur temps pour nous aider.

        Amicalement.

        JV-Vierzon
        1. Bonjour JV-Vierzon,

          Val() : Je m'en veux, c'est tellement évident !

          A propos de AMSTRAD, la pédégère de la grande époque, Marion VANNIER, vit à présent de ses rentes(!). Elle évoque dans des reportages les débuts héroïques de la marque ainsi que la fin plutôt discrète de cette entreprise.
          J'ai aussi connu DBASE IV. A l'époque, je pensais qu'il n'y aurait jamais mieux .... Tout comme pour AMSTRAD d'ailleurs .....

          Conclusion : Nous vivons une époque intéressante

          Bonne journée