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 :

La somme entre 2 années successives avec jours et mois fixes [AC-2003]


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2012
    Messages : 34
    Points : 15
    Points
    15
    Par défaut La somme entre 2 années successives avec jours et mois fixes
    salut a tous
    j'ai une table tblcommandes qui contient 2 champs:

    1- DateCommande de type date.
    2- Montant de type numerique.

    Si par exemple la date la plus ancienne entreé dans le champ DateCommande ( Min([DateCommande])) est: 3/2/2008;comment faire ( dans une requete ou dans un etat ) pour avoir afficher (separement):

    - La somme des montants dont la date DateCommande est comprise entre 3/2/2008 et 3/2/2009.
    - La somme des montants dont la date DateCommande est comprise entre 3/2/2009 et 3/2/2010.
    - La somme des montants dont la date DateCommande est comprise entre 3/2/2010 et 3/2/2011.
    - La somme des montants dont la date DateCommande est comprise entre 3/2/2011 et la date en cours ( Date() ).

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonsoir,

    voici la démarche :

    la date minimum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dmin("DateCommande","tblCommandes")
    le 1er anniversaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateserial(Year(dmin("DateCommande","tblCommandes"))+1,Month(dmin("DateCommande","tblCommandes")),Day(dmin("DateCommande","tblCommandes")))
    2e anniversaire ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateserial(Year(dmin("DateCommande","tblCommandes"))+2,Month(dmin("DateCommande","tblCommandes")),Day(dmin("DateCommande","tblCommandes")))
    ….

    Dans une requête, cela devient (N.B. francisée et virgule => point-virgule) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Sum(IIf([DateCommande]>=DMin("DateCommande","tblCommandes") And [DateCommande]<DateSerial(Year(DMin("DateCommande","tblCommandes"))+1,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))),[Montant],0)) AS Année1, Sum(IIf([DateCommande]>=DateSerial(Year(DMin("DateCommande","tblCommandes"))+1,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))) And [DateCommande]<DateSerial(Year(DMin("DateCommande","tblCommandes"))+2,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))),[Montant],0)) AS Année2, Sum(IIf([DateCommande]>=DateSerial(Year(DMin("DateCommande","tblCommandes"))+2,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))) And [DateCommande]<DateSerial(Year(DMin("DateCommande","tblCommandes"))+3,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))),[Montant],0)) AS Année3, Sum(IIf([DateCommande]>=DateSerial(Year(DMin("DateCommande","tblCommandes"))+3,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))) And [DateCommande]<DateSerial(Year(DMin("DateCommande","tblCommandes"))+4,Month(DMin("DateCommande","tblCommandes")),Day(DMin("DateCommande","tblCommandes"))),[Montant],0)) AS Année4
    FROM tblCommandes;
    Si tu veux te documenter sur le traitement des dates et heures, vois ceci :

    Les Fonctions Date/Heure
    http://mhubiche.developpez.com/vba/f...ions/datetime/
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2012
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Merci Claud.

    Votre solution est valable si le nombre d'anniversaire est connu; alors que dans notre cas ce nombre (n) est variable et peut prendre n'importe quelle valeur (entier) selon Min(DateCommande) et la date du système Date().

    Donc ce que on veut faire est de laisser Access détermine ce nombre entier d'anniversaires n et d'afficher la somme de chaque anniversaire à part.

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Dans une fonction personnalisée alors, pas dans une requête.

    Explique comment tu voudrais voir le résultat affiché.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    je partirais sur une requête, avec un champs calculé et la fonction datediff (voir l'aide) qui te renverra combien d'années se sont écoulées entre deux dates.

    Ensuite, cette requête, je l'injecte dans une 2nde requête croisée dynamique, où en ligne, je met ce champ calculé, et en valeurs, je met la somme des montants.

    En espérant que ce soit une piste ...

    TALERE

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2012
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    je veut que le resultat soit afficher comme suit ( si on prend l'exemple precedent ):

    Periode La somme
    2009 1000
    2010 5000
    2011 43000
    2012 8700

    On prend l'année la plus grande de chaque periode
    Fichiers attachés Fichiers attachés

  7. #7
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Je poursuis sur ma première idée : voici une sub pour construire la requête que je t’ai d’abord proposée.

    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
    30
    31
    32
    Public Sub Rouabha(NomTable As String)
    Dim dDebut As Date
    Dim dDepart As Date
    Dim dFin As Date
    Dim sDebut As String
    Dim sfin As String
    Dim i As Integer, NbreAns As Integer
    Dim sSql As String
    Dim q As QueryDef
    'Date de départ
    dDepart = dMin("DateCommande", "tblCommandes")
    'Nombre d'années complètes
    NbreAns = DateDiff("yyyy", dDepart, Date)
    'Construction du sql de la requête
    sSql = "SELECT "
    For i = 1 To NbreAns + 1
       dDebut = DateSerial(Year(dDepart) + i - 1, Month(dDepart), Day(dDepart))
       dFin = DateSerial(Year(dDepart) + i, Month(dDepart), Day(dDepart))
       'Mise en forme string
       sDebut = "#" & Format(dDebut, "mm/dd/yy") & "#"
       sfin = "#" & Format(dFin, "mm/dd/yy") & "#"
       'construction de la clause select
       sSql = sSql & "Sum(IIf([DateCommande]>=" & sDebut & " and [DateCommande]<" & sfin & " ,[Montant],0)) AS Année" & i & ","
    Next i
    'Supprimer la dernière virgule et ajouter la clause From
    sSql = Left(sSql, Len(sSql) - 1) & " FROM " & NomTable & ";"
    'Affecter le sql à une requête
    Set q = CurrentDb.QueryDefs("tst")
    q.SQL = sSql
    'Ouvir la requête
    DoCmd.OpenQuery ("tst")
    End Sub
    Pour voir son fonctionnement
    - tu dois avoir une requête « tst » enregistrée (peu importe son sql) ;
    - dans la fenêtre d’exécution (<Ctrl + G>), tu saisis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call Rouabha("tblCommandes")
    <Enter>

    La requête « tst » est construite sur mesure : elle tient compte du nombre d’anniversaires.
    La requête tst affiche le résultat en ligne, pas tout à fait comme tu le prévoyais.
    Mais si la démarche te plait, on peut voir comment améliorer l'affichage.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2012
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Merci Claude, ça marche bien; mais j'ai besoin de quelques améliorations:

    1- Au lieu d'afficher dans la requête tst :Année1,Année2,Année3,...,Année(n) je veut avoir :Année2009, Année2010, Année2011 (si la première période est entre 2008 et 2009 on doit avoir Année2009 ... c.à.d on prend l'année la plus grande de chaque période).

    2- Comment obliger la requête tst à afficher la somme des montants sous format standard avec décimales 0 c.à.d au lieu d'avoir par exemple 23000,00 on doit avoir 23 000.

    3- Comment peut on avoir afficher les années ( Année2009, ... ) dans une colonne de la requête tst (nommé par exemple Année) et non pas dans une ligne comme c'est le cas, et aussi la somme des montants dans une autre colonne (nommé par exemple Total).

    Et merci encore une fois pour vos explications.

  9. #9
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Désolé, à part pour le 1- (en bricolant le titre de la colonne dans le code), j'ignore comment faire pour le 2 et le 3.

    Il me semble que fabriquer un état (au départ de la requête) serait plus raisonnable.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 599
    Points
    56 599
    Billets dans le blog
    40
    Par défaut
    Bonsoir à tous,

    Je viens d’avoir un début d’ébauche de brouillon d’idée quelque peu différente de celle de Claude.

    Je vous la soumets donc

    L’idée consiste à ajouter un champ calculé [Année] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    idCommande	DateCommande	Montant	      annee
    1	      03/02/2008	1 200,00 €	2009
    2	      05/02/2008	2 000,00 €	2009
    3	      15/03/2008	1 500,00 €	2009
    4	      05/02/2009	10 000,00 €	2010
    5	      08/02/2009	12 000,00 €	2010
    6	      28/06/2009	8 000,00 €	2010
    7	      02/01/2010	1 000,00 €	2010
    8	      08/02/2010	100 000,00 €	2011
    9	      10/04/2010	120 000,00 €	2011
    10	      08/01/2011	120 000,00 €	2011
    11	      07/02/2011	10,00 €	        2012
    12	      08/03/2011	12,00 €	        2012
    Il ne restera plus qu’à faire un SUM(Montant) en faisant un groupement par [Année] pour résoudre le problème.

    Pour le champ calculé [Année], j’ai ça pour le moment :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT tblcommande.idcommande, 
           tblcommande.datecommande, 
           tblcommande.montant, 
           INT (Datediff("y", Dmin("DateCommande", "TblCommande"), datecommande) / 
                366) + 1 
           + Year(Dmin("DateCommande", "TblCommande")) AS annee 
    FROM   tblcommande;

    … mais mon calcul avec INT(…/366)… est certainement approximatif, il reste donc à l’améliorer ...

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2012
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Merci Claude pour votre aide et votre, tu ma guider presque a la fin.

    Merci Fabien s'est ce que je voudrai avoir exactement ... ça marche très bien.

    Bonne nuit à tous au revoir.

  12. #12
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 239
    Points : 19 364
    Points
    19 364
    Billets dans le blog
    61
    Par défaut
    Bonjour,

    Concernant l'amélioration sur le champ année, on peut essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Annee: VraiFaux(SérieDate(Année([DateCommande]);Mois(MinDom("DateCommande";"tblCommandes"));Jour(MinDom("DateCommande";"tblCommandes")))<=[DateCommande];Année([DateCommande])+1;Année([DateCommande]))
    Ou:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Annee: -(SérieDate(Année([DateCommande]);Mois(MinDom("DateCommande";"tblCommandes"));Jour(MinDom("DateCommande";"tblCommandes")))<=[DateCommande])+Année([DateCommande])
    A vérifier...
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2012
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Merci Denis je vais essayer et je te donne le résultats.

    Mais j'ais besoin d'aide encore une fois:

    En ce qui concerne la solution du FABIEN, comment peut on éliminer ou exclure les dates qui n'ont pas encore une année complète c.à.d si la date système Date() est < 3/2/2012 ( dans l'exemple de Fabien ) nous devons éliminer les dates 07/02/2011 et 08/03/2011 ( c.à.d les commandes 11 et 12 ).

  14. #14
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 599
    Points
    56 599
    Billets dans le blog
    40
    Par défaut
    bonsoir,

    j'ai essayé avec une fonction VBA à copier/coller dans un module.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function DateMaxi() As Date
    '
    Dim Datemini As Date
    Datemini = DMin("DateCommande", "tblCommande")
    '
    If Date < DateSerial(Year(Date), Month(Datemini), Day(Datemini)) Then
            DateMaxi = DateSerial(Year(Date) - 1, Month(Datemini), Day(Datemini))
        Else
            DateMaxi = DateSerial(Year(Date), Month(Datemini), Day(Datemini))
        End If
    '
    End Function
    puis dans la requête, ajouter le critère:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ...WHERE [DateCommande]<DateMaxi();

    à voir...

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2012
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Merci Claude ça fonctionne.



    Merci Fabien pour vos solutions simples et efficaces, ça fonctionne très bien.

    J'ais besoin de vos aides sur le le problème du lien:
    http://www.developpez.net/forums/d11...ayer-commande/
    Et merci d'avance.

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par mouhamadrouabha Voir le message
    Merci Claude pour votre aide et votre, tu ma guider presque a la fin.

    Merci Fabien s'est ce que je voudrai avoir exactement ... ça marche très bien.

    Bonne nuit à tous au revoir.
    Je vous souhaite de beaux rêves

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

Discussions similaires

  1. [XL-2013] Calcule la somme entre deux dates en condition sur 6 mois
    Par undo74 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/07/2014, 17h30
  2. Tableau avec jours du mois
    Par AlexFr99 dans le forum Langage
    Réponses: 5
    Dernier message: 29/07/2011, 00h07
  3. Remplir datagrid avec jour du mois
    Par koutbino dans le forum Flex
    Réponses: 2
    Dernier message: 03/03/2010, 12h42
  4. calcul d'une somme entre deux années
    Par alex77140 dans le forum IHM
    Réponses: 5
    Dernier message: 08/07/2008, 09h00
  5. [Requete] Calcul Somme entre deux temps pour chaque jour
    Par nico33307 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/03/2006, 01h58

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