Filtrage sur mois() dans ACCESS

Résolu
JV-Vierzon -  
Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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
    0
    1. JV-Vierzon
       
      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
      0
    2. castours
       
      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]);
      0
  2. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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
    0
  3. Jean_Jacques
     
    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
    0
  4. JV-Vierzon
     
    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
    0
    1. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
       
      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
      0