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 :

Req Access - Compter Enresistrement en affichant tous les mois (meme si pas d'enregistrement)


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Req Access - Compter Enresistrement en affichant tous les mois (meme si pas d'enregistrement)
    Bonjour,
    Je n'ai pas réussi a trouver solution à mon besoin :
    Sur Access je dispose d'une table avec plusieurs renseignements dont : le Mois et des articles.
    Il s'agit d'une BDD de ventes d'articles.
    J'ai besion de compter pour chaque mois, combien il y a d'un article précis.
    J'y arrive très bien avec la fonction compte().
    Je fait un regroupement par mois.
    J'obtient donc pour chaque mois, combien j'ai vendu d'un article précis.

    Janvier 7
    Fevrier 25
    Mars 12
    Juin 4


    Par contre, je souhaite afficher la liste de TOUS les mois, même si l'article n'est pas vendu.
    Comment faire ?
    Janvier 7
    Fevrier 25
    Mars 12
    Avril 0
    Mai 0
    Juin 4
    etc..

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    si l'année n'est pas nécessaire (ce qui me semble étonnant, sauf si tu as une table par année), tu peux créer une table contenant tous les mois et ensuite faire une jointure gauche (Left join) vers la table articles.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Expert éminent
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 262
    Points : 6 561
    Points
    6 561
    Par défaut
    Salut,
    Une question, la valeur mois est-ce une expression littérale (saisie au clavier) ou est-ce un calcul du style : Peut-être pourrais-tu joindre une capture d'écran de ton schéma des relations.
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    UR - ESIROI - GPME/CG/DCG8
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Merci de cliquer sur si la réponse vous a permis de résoudre votre problème et n'oubliez pas de clôturer le fil en cliquant sur

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Bonjour

    J'ai eu un problème un peu analogue à résoudre (alimenter un historique). En particulier d'avoir un enregistrement pour chaque mois, même sans mouvement.

    J'avais créé une table (historique) avec le couple année/mois et les valeurs à conserver ou à calculer.
    Ensuite, à chaque fermeture du formulaire d'accueil (fermeture base) et à chaque demande de lecture de cette table :
    - création de l’enregistrement pour le mois courant avec valeurs nulles, si inexistant
    - mise à jour de l’enregistrement pour le mois courant avec les nouvelles valeurs à conserver
    Une limite : comme seules les valeurs pour le mois courant sont prises en compte, toute modification sur un mois précédent ne le sera pas.

    A toi de voir si adaptable...

    Titi95
    Un problème bien posé est à moitié résolu

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Complement d'info.
    Merci pour vos retours.
    Je n'ai pas encore eu le temps de regarder, mais je pense que je vais partir sur la création d'une autre table avec en effet l'année et le mois.
    Et je ferai une jointure gauche.
    Je pensais qu'il existait une solution en natif.. mais visiblement non.
    Je pense qu'il sera necessaire de remplacer les valeurs NULL par 0.

    Pour répondre a Hypérion, il s'agit bien d'un champ Date avec lequel avec le format je sort l'année et le mois.

    La dernière solution de titi95 n'est pas adapté à mon besoin.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut De l'Aide pour comparer uniquement le mois entre deux date
    Bonjour,
    J'ai encore besoin de votre aide.
    Afin de répondre à mon besoin j'ai donc voulu créer une table avec les différentes valeurs possibles : les années et les mois.
    1 ) comment faire car les mois il n'y en a que 12, mais les années.. difficile de toutes les lister ?
    2) en admetant que mon premier point soit résolu, lorsque je fais ma jointure, ca ne match pas : je pense que Access compare la date complete, alors que je ne veux que comparer le mois et/ou l'année.

    Comment faire ?
    J'arrive a afficher uniquement le moi ou uniquement l'année, mais dans la jointure comment faire sous Access ?

    Merci pour votre aide.

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour galaxy77,
    1) pour les périodes, voici un exemple de création des 12 mois de l'année en cours, que l'on peut exécuter tout les jours, tous les mois ou une fois par an selon son envie puisque la requête contrôle que les enregistrements à ajouter n'existent pas.
    la table tbl_periodes contient 2 champs une clé primaire et une date :
    - IdPer (NuméroAuto / Unique: Oui / Primaire: Oui)
    - DtAnMois (Date, Unique: Oui / Primaire: Non)
    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
     
    INSERT INTO tbl_periodes ( DtAnMois )
    SELECT tbper.anms
    FROM (
    SELECT DateSerial(Year(Now()),1,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),2,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),3,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),4,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),5,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),6,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),7,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),8,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),9,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),10,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),11,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),12,1) AS anms FROM MSysObjects WHERE Type=2)  AS tbper
    WHERE (tbper.anms) Not In (select dtanmois from tbl_periodes);
    Un enrgistrement de Type 2 dans MSysObjects représente une base de donnée (je suppose qu'il n'y a qu'un enregistrement de ce type dans une base, sinon il faut baser la requête avec une table ne contenant qu'un seul enregistrement).

    2) Pour la jointure externe, il faut d'abord créer une sous-requête à partir de la table articles en formatant les dates sous la même forme que le champ de la table des périodes (c'est un champ de type date mais chaque date est le 1er jour de chaque mois)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DateSerial(year([datevente]),month([datevente]),1) as dtVenteMois, count(nbarticles) from tblarticles
    Ensuite faire une seconde requête avec la table tbl_periodes et la requête précédente et une jointure gauche avec la date DtAnMois vers celle de la requête (dtVenteMois).
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #8
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Bonsoir

    La dernière solution de titi95 n'est pas adapté à mon besoin.
    Pourquoi ?

    Titi95
    Un problème bien posé est à moitié résolu

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Match KO avec les dates
    Merci.
    Je n'ai pas tout compris pour la partie creation de la table, mais j'essayerai le code demain.
    Au pire, je pense que je creerai une table avec l'année 2017 et 2018 et tous les mois. J'ai pour le moment juste besoin de ces dates.

    Par contre pour la deuxieme partie qui m'interesse je bloque :
    Ok pour le principe de creer une requete1, et une seconde requete avec la table des date et la requete 1.
    Mais mes champs date ne sont pas identiques. J'ai deja essayer.
    Du coup j'ai aucun resultat.
    Mon champs date de ma table VenteArticle est de type 05/03/2017, et de l'autre coté, j'ai un 01/03/2017.
    Peut etre pour ca que ca ne match pas ?
    Je ne comprend pas comment matcher..
    J'arrive bien a extraire le mois de la bade VenteArticle pour n'afficher que le mois.
    Mais la jionture ne se fait pas que sur le mois, mais la date complete :-(
    enfin, je pense que l'erreur est la..









    Citation Envoyé par tee_grandbois Voir le message
    Bonjour galaxy77,
    1) pour les périodes, voici un exemple de création des 12 mois de l'année en cours, que l'on peut exécuter tout les jours, tous les mois ou une fois par an selon son envie puisque la requête contrôle que les enregistrements à ajouter n'existent pas.
    la table tbl_periodes contient 2 champs une clé primaire et une date :
    - IdPer (NuméroAuto / Unique: Oui / Primaire: Oui)
    - DtAnMois (Date, Unique: Oui / Primaire: Non)
    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
     
    INSERT INTO tbl_periodes ( DtAnMois )
    SELECT tbper.anms
    FROM (
    SELECT DateSerial(Year(Now()),1,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),2,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),3,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),4,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),5,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),6,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),7,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),8,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),9,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),10,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),11,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(Year(Now()),12,1) AS anms FROM MSysObjects WHERE Type=2)  AS tbper
    WHERE (tbper.anms) Not In (select dtanmois from tbl_periodes);
    Un enrgistrement de Type 2 dans MSysObjects représente une base de donnée (je suppose qu'il n'y a qu'un enregistrement de ce type dans une base, sinon il faut baser la requête avec une table ne contenant qu'un seul enregistrement).

    2) Pour la jointure externe, il faut d'abord créer une sous-requête à partir de la table articles en formatant les dates sous la même forme que le champ de la table des périodes (c'est un champ de type date mais chaque date est le 1er jour de chaque mois)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DateSerial(year([datevente]),month([datevente]),1) as dtVenteMois, count(nbarticles) from tblarticles
    Ensuite faire une seconde requête avec la table tbl_periodes et la requête précédente et une jointure gauche avec la date DtAnMois vers celle de la requête (dtVenteMois).

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,
    En fait je ne veux pas alimenter la table Access.
    Je ne veux pas alterer, modifier ou implementer ma table.
    Je veux executer une requete une fois par mois qui me sort un resultat que j'utiliserai sur un fichier excel.


    Citation Envoyé par titi95 Voir le message
    Bonsoir


    Pourquoi ?

    Titi95

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Je n'ai pas tout compris pour la partie creation de la table, mais j'essayerai le code demain.
    Au pire, je pense que je creerai une table avec l'année 2017 et 2018 et tous les mois. J'ai pour le moment juste besoin de ces dates.
    il faut créer la table avant de lancer la requête (je l'ai nommé tbl_periodes), elle contiendra 2 champs :
    - IdPer (ou un autre nom, de type NuméroAuto / Unique: Oui / Primaire: Oui)
    - DtAnMois (type Date, Unique: Oui / Primaire: Non)
    la requête union que je propose créera automatiquement les 12 enregistrements pour l'année 2018. Elle peut être lancée tous les mois, car elle n'ajoutera les nouveaux enregistrements qu'une fois par an puisqu'elle contrôle l'existence des enregistrements avant de les insérer.
    Pour 2017, il faudra dupliquer la requête et remplacer Year(Now()) par 2017:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO tbl_periodes ( DtAnMois )
    SELECT tbper.anms
    FROM (
    SELECT DateSerial(2017,1,1) AS anms FROM MSysObjects WHERE Type=2
    union
    SELECT DateSerial(2017,2,1) AS anms FROM MSysObjects WHERE Type=2
    '... etc
    Mon champs date de ma table VenteArticle est de type 05/03/2017, et de l'autre coté, j'ai un 01/03/2017.
    J'arrive bien a extraire le mois de la bade VenteArticle pour n'afficher que le mois.
    Mais la jionture ne se fait pas que sur le mois, mais la date complete :-(
    enfin, je pense que l'erreur est la..
    Dans ma proposition, il ne faut pas extraire les mois et les années, sauf pour la fonction SérieDate (DateSerial en anglais) qui va transformer toutes les dates à partir des 3 paramètres de la fonction (année, mois, jour) de façon à ne garder que l'année et le mois, le jour sera toujours 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DateSerial(year([datevente]),month([datevente]),1) as dtVenteMois, count(nbarticles) from VenteArticle
    ainsi la date 05/03/2017 sera transformée en 01/03/2017 et pourra matcher avec l'enregistrement créé dans la table tbl_periodes.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

Discussions similaires

  1. [Vxi3] Afficher tous les mois de l'année
    Par creeks66 dans le forum Webi
    Réponses: 2
    Dernier message: 30/08/2016, 16h08
  2. Comment afficher tous les objets Access ?
    Par MAXJEREM dans le forum Access
    Réponses: 8
    Dernier message: 12/05/2016, 12h34
  3. Réponses: 13
    Dernier message: 30/11/2009, 17h48
  4. [Designer V5-V6] Afficher tous les mois du calendrier
    Par San_d dans le forum Débuter
    Réponses: 5
    Dernier message: 28/03/2009, 22h10
  5. Réponses: 12
    Dernier message: 13/04/2007, 16h40

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