Cumul dans Access

Comment calculer un cumul ligne à ligne dans Access ?

Exemple

Dans l’exemple ci-dessous, la colonne [Cumul] est une addition de la colonne nommée [La Durée], dans la table [tbl Durées]. Plusieurs méthodes sont envisageables, tout dépend du résultat souhaité et de l’endroit où l’utiliser.

Méthode 1 : Fonction de domaine

  1. Créez une requête basée sur la table [tbl Durées].
  2. Dans la grille de requête, placez les champs qui vous intéressent. Dans notre exemple : [La Date] et [La Durée].
  3. A droite des deux champs, tapez le calcul suivant, sans vous fourvoyer dans les parenthèses, points-virgules et autres joyeusetés !

La requête devrait ressembler à ceci (exécutez-la pour la tester) :

Notes

  • La fonction SomDom() (DSum() en anglais) additionne les données d’une tables ou d’une requête en fonction d’un critère.
    Consultez l’aide en ligne d’Access sur les fonctions dites de « domaine » : DSum(), DCount(), DLookup() et consorts…
  • La fonction CDbl() placée « autour » du SomDom() convertit le résultat en Réel double, de façon à aligner les résultats à droite et à produire un résultat explicitement numérique. Dans le cas contraire, le résultat est de type Variant, aligné à gauche.
  • Pour simplifier (!) la syntaxe, nous utilisons une fonction de conversion de dates, DateUS() qui doit être tapée dans un module Visual Basic. Cliquez ici pour plus de détails.
  • J’ai basé le calcul du cumul sur la date (on additionne toutes les données antérieures à chaque ligne). D’autres champs peuvent remplacer la date, à condition qu’ils permettent un classement et donc un cumul logique.
  • Les fonctions de domaine sont puissantes mais relativement lentes. Un tel calcul risque de « mouliner » sur des tables de grande taille.

Méthode 2 : Etat

On peut obtenir un résultat équivalent (et peut-être plus simplement !) dans un état. Encore une fois, tout dépend de l’objectif à atteindre !

  1. Créez à l’aide de l’Assistant Etat un état basé sur la table [tbl Durées].
  2. Passez en mode Création sur cet état, et ajoutez une nouvelle fois le champ [La Durée]. C’est ce dernier qui va calculer le cumul.
  3. Faites apparaître les propriétés de cette zone de texte, cliquez sur l’onglet Données et réglez la propriété Cumul sur « En continu » (ou « Par groupe » selon les besoins ; ce dernier réglage est utile si vous avez des regroupements dans votre état).

Vous aimerez aussi...

87 réponses

  1. tony dit :

    Du génie. Merci beaucoup

  2. Issouf dit :

    Slt, votre site est très intéressante. j’ai eu ici les réponses a presque toutes mes questions alors merci infiniment.
    je viens d’essayer votre methode 1 pour avoir un solde progressif dans mon etat. lorsque j’execute, la colonne stock affichait type. Alors j’ai crée un module où jai mis ce code:
    Function DateUS(ByVal dt As Variant)
    If IsNull(dt) Then Exit Function
    DateUS = « # » & Month(dt) & « / » & Day(dt) & « / » & Year(dt) & « # »
    End Function
    je l’ai copié sur votre site. mais lorsque j’exécute l’etat , un boite de dialogue s’affiche avec ceci: entrer une valeur de paramètres DateUS.
    lorsque c’est la requête que je veux exécuter ce message s’affiche: Fonction DateUS non définit dans l’expression.
    que faire alors? merci de m’aider encore une fois.

    • Hervé Inisan dit :

      La fonction DateUS() est bien dans un module standard de la base de données ?
      Il ne faut pas qu’elle soit dans un module de formulaire ou d’état, notamment.

      • issouf dit :

        Tient ça marche, au fait je n’avais pas activé les macros mais il y a un autre problème qui a surgit.
        j’ai le solde progressif du stock sauf que lorsque deux dates identiques se suivent par exemple le stock est faux comme ceci:

        —Date—————Libellé——————-Qté————-Stock
        01/01/2015———Entrée Transfert —- —–(+)40000———-40000
        02/01/2015———Entrée Transfert ——— (+)11000———-51000
        03/02/2015———Vente a crédit ———— (-) 2000———–46000
        03/02/2015———Vente a crédit ———— (-) 3000———–41000

        c’est a dire qu’il cumul les quantités de la même date et les déduit du stock sur chaque ligne. Vous constatez que le 03/02/2015 j’ai deux ventes a credit qui font au total 5000 donc il fait 51000-5000=46000 ensuite il fait encore 46000-5000=41000.
        ce qui n’est pas bon.
        Auriez vs une solution? merci d’avance

        • Hervé Inisan dit :

          Le cumul calcul se fait bien par date, ce qui est donné dans la 3ème partie du DSum().

          Maintenant, le scénario est différent : il s’agit d’un cumul par date ET par opération de stock.
          Donc on doit pouvoir ajouter un critère dans le Where du DSum() – la 3ème partie du DSum() – pour affiner le cumul.
          Si les opérations sont numérotées par un champ Id (par exemple), on doit pouvoir faire :

          A vérifier (je n’ai pas de quoi tester sous la main)… 😉

          • Issouf dit :

            j’y ai pensé aussi mais les opérations ne sont pas numéroter (pas de ID). Maintenant je souhaite ajouter un ID dans la requête UNION pour numéroter automatiquement les enregistrements. est ce que c’est possible et comment le faire.
            NB: je ne veux pas ajouter un ID dans les tables sources car ça ne résoudra pas mon problème. la requête faisant L’union de plusieurs autres requêtes, il peut arriver que dans 2 tables différentes les ID soient les même et se retrouvent dans ma requête UNION , ce qui ne résoud pas mon problème mais le déplace.
            voivi ma requete:
            SELECT [DateD’edition] AS [Date], [N°BE] AS [N° Doc], [Naturedel’Entrée]& » de « &[Fournisseur] AS [Libéllé], [CodeArt] As [Code], [NomArt] As [Désignation],[QuantitéE] As [Quantité], [Unitmes] As [Unité], [CodeMagA] As [Code Mag], [NomMagA] As [Magasin], [NomMagP] As [Zone], [N°Véhicule] As [N° Véhicule], [Observations] As [Observation]
            from R_Entrée where [CodeArt]=forms!Mouvements![Art] and [CodeMagA]=forms!Mouvements![Mag] and forms!Mouvements![du]<=[Dated'edition] and [Dated'edition]<= forms!Mouvements![Au]
            UNION
            SELECT [DateDesortie] AS [Date], [N°BS] AS [N° Doc], [NatureSortie]& " vers " & [MagA1] & " " & [MagpR] AS [Libéllé], [CodeArt] As [Code], [NomArt] As [Désignation],[QtéS] As [Quantité], [Unitmes] As [Unité], [CodeMagA] As [Code Mag], [NomMagA] As [Magasin], [NomMagP] As [Zone], [N°Véhicule] As [N° Véhicule], [Observations] As [Observation]
            from R_Sortie where [CodeArt]=forms!Mouvements![Art] and [CodeMagA]=forms!Mouvements![Mag] and forms!Mouvements![du]<=[DateDesortie] and [DateDesortie]<= forms!Mouvements![Au]
            UNION
            select [DateFactureD] AS [Date], [N°Doc] AS [N° Doc], [NatureFact]&" à "&[Nomclient] AS [Libéllé], [CodeArt] As [Code], [NomArt] As [Désignation],[QtéF] As [Quantité], [Unitmes] As [Unité], [CodeMagA] As [Code Mag], [NomMagA] As [Magasin], [NomMagP] As [Zone], [N°Véhicule] As [N° Véhicule], [Observations] As [Observation]
            from R_Facture where [CodeArt]=forms!Mouvements![Art] and [CodeMagA]=forms!Mouvements![Mag] and forms!Mouvements![du]<=[DateFactureD] and [DateFactureD]<= forms!Mouvements![Au]
            UNION
            select [DateFactureA] AS [Date], [N°Doc] AS [N° Doc], [NatureFact]&" de "&[Nomclient] AS [Libéllé], [CodeArt] As [Code], [NomArt] As [Désignation],[QuantitéA] As [Quantité], [Unitmes] As [Unité], [CodeMagA] As [Code Mag], [NomMagA] As [Magasin], [NomMagP] As [Zone], [N°Véhicule] As [N° Véhicule], [Observations] As [Observation]
            from R_Avoir where [CodeArt]=forms!Mouvements![Art] and [CodeMagA]=forms!Mouvements![Mag] and forms!Mouvements![du]<=[DateFactureA] and [DateFactureA]<= forms!Mouvements![Au]
            UNION
            select [Datetransf] AS [Date], [N°DocExp] AS [N° Doc], [NatureTransf] & " reçu de "&[Expr1] AS [Libéllé], [CodeArt] As [Code], [NomArt] As [Désignation],[QtéTE] As [Quantité], [Unitmes] As [Unité], [MagDest] As [Code Mag], [NomMagA] As [Magasin], [NomMagP] As [Zone], [N°Véhicule] As [N° Véhicule], [Observations] As [Observation]
            from R_Transfert_Entrant where [CodeArt]=forms!Mouvements![Art] and [MagDest]=forms!Mouvements![Mag] and forms!Mouvements![du]<=[Datetransf] and [Datetransf]<= forms!Mouvements![Au]
            UNION
            select [Datetransf] AS [Date], [N°DocExp] AS [N° Doc], [NatureTransf] & " à " & [expr2] AS [Libéllé], [CodeArt] As [Code], [NomArt] As [Désignation],[QtéTS] As [Quantité], [Unitmes] As [Unité], [MagExp] As [Code Mag], [NomMagA] As [Magasin], [NomMagP] As [Zone], [N°Véhicule] As [N° Véhicule], [Observations] As [Observation]
            from R_Transfert_Sortant where [CodeArt]=forms!Mouvements![Art] and [MagExp]=forms!Mouvements![Mag] and forms!Mouvements![du]<=[Datetransf]and [Datetransf]<= forms!Mouvements![Au];

          • Issouf dit :

            J’ai trouvé, il suffit d’attribuer la propriété date,générale aux champs date des tables qui sont utilisés dans la requête union ainsi la somme se fera par date et partez heure. Merci à tous.

          • Hervé Inisan dit :

            Du moment qu’on a effectivement un niveau plus fin que la date, ça peut passer. Content que ça marche ! 🙂
            Sinon, la requête l’UNION me fait penser qu’il y a plusieurs tables de structure très proche : est-ce qu’il n’y aurait pas moyen de les fusionner pour simplifier la base ?
            Mais c’est une autre question ! 😉

  3. Juliane dit :

    Bonsoir,
    Je souhaiterais pour ma part intégrer un solde dans un graphique : Montant de départ – toutes les dépesenses – reste le solde. Mon graphique (camenbert) donnerait donc les dépenses cumulées par code d’article et le solde non utilisé. Ex : utilisation du budget : service A : 500 – service B : 200 – Service C : 100 – solde non utilisé : 200. Quelqu’un pourrait-il m’aider ?
    Merci d’avance,
    Juliane

    • Hervé Inisan dit :

      Je ne connais pas la structure des tables, mais a priori, ça pourrait se faire par un état (mais dans ton cas, ce n’est pas un cumul ligne par ligne, c’est un autre scénario)? Dans les grandes lignes, il faudrait :
      1. Une requête de regroupement pour faire les totaux par service.
      2. Un état basé sur cette requête.
      3. Un champ calculé pour le total des services : =Somme([Total Service])
      4. Un autre champ pour afficher le budget. Je ne sais pas où est stockée cette info, je suppose donc qu’un DLookup() (ou RechDom()) fera l’affaire.
      5. Un champ calculé final qui est : =[Nom du champ du point 4] – [Nom du champ du point 3]
      Ouala !

  4. SODRE Kassoum dit :

    Hervé. Encore merci pour le résultat que j’ai attend la semaine passée par votre assistance. J’ai un autre souci. Dans la construction de ma BD, j’ai utilisé cette formule :
    =SomDom(« [Solde] »; »R_situation_execution2″; »[Code_Budget3]= » & ([Code_Budget3]))

    qui a bien marché. Mais il se trouve que là où le « Code_Budget3 » n’est renseigné le champ est vide. Comment me prendre avec cette formule pour que les champs vides soient égale à zéro (0). Merci d’avance!

    • Hervé Inisan dit :

      La fonction Nz() fait cette conversion. Par exemple :

      • SODRE Kassoum dit :

        Bonjour! En reprenant cette formule dans DB, j’ai les montants, mais les champs ne reçoivent pas le zéro (0). Au fait, je veut un zéro (0) dans les champs par défaut.
        Merci d’avance.
        A vous!

        • Hervé Inisan dit :

          Est-ce que tu peux reformuler la question (je ne connais pas le projet) ?
          Merci.

          • SODRE Kassoum dit :

            Le projet est une BD pour suivre l’exécution d’un budget dont je suis entrain de préparer les états. Sur l’état que je suis entrain de faire il y a entre autres les colonnes suivantes :

            Colonne 1 : Dotation
            Le nom de la table est « Budget3 »
            Les codes des lignes budgétaires sont «Code_Budget3 ».
            Le montant des sont « Dotation »
            Les informations de cette colonne sont obtenues à partir de la table Budget3 à l’élaboration du budget en début de période. Avec la formule :
            =SomDom(« [Dotation] »; »Budget3″; »[Code_Budget3]= » & ([Code_Budget3]))
            Le calcul de cette colonne avec cette formule est bon.

            Colonne 2 : Exécution cumulée
            Le nom de la requête est « R_situation_execution2 »
            Les codes des lignes budgétaires sont «Code_Budget3 ».
            Le montant des sont « Solde »
            Les informations de cette colonne sont obtenues à partir de la saisie au jour le jour des opérations budgétaires. Avec la formule suivante :
            =SomDom(« [Solde] »; »R_situation_execution2″; »[Code_Budget3]= » & ([Code_Budget3]))
            Là aussi le calcul de cette colonne (colonne 2) avec cette formule est bon.
            Avec cette formule, les champs des lignes de la colonne 1 correspondant aux champs des lignes de la colonne 2 qui n’ont pas encore était concernées par des opérations budgétaires restent vides. Cette situation est normale. Maintenant, je voudrai que ces champs vides reçoivent par défaut le nombre zéro (0) en attendant des opérations budgétaires les concernant.
            Est-ce avec cette formule on peut associer une fonction de condition pour atteindre cette objectif ? Ou m’aider à trouver une autre formule.
            Merci d’avance!

          • SODRE Kassoum dit :

            Bonjour Hervé! Avez vous compris mon problème?

          • SODRE Kassoum dit :

            Hervé c’est ok effectivement avec la fonction Nz(). J’ai essayé cette formule qui a finalement donné le résultat que je voulais.
            =Nz(SomDom(« [Solde] »; « R_situation_execution2 »; « [Code_Budget3]= » & ([Code_Budget3]; 0)))
            Merci bcp pour ton assistance.

          • Hervé Inisan dit :

            Content que tu aies pu trouver une solution grâce à Nz(). 🙂

  5. Patrick dit :

    Erreur reçue …

    Rectification de mon post précédent …
    Fonction DateUS non définie dans l’expression.

  6. Patrick dit :

    Bonjour,
    j’ai créé une table (tbl_test) avec les champs suivant:
    ID_Test : NuméroAuto
    La_date : date/heure (format date générale)
    Test : numérique (entier long, fixe)

    Quand je crée ma requête, j’ai une erreur :
    *Fonction <> non définie dans l’expression …

    Voici le code dans ma requête:
    Cumul: CDbl(SomDom(« [Test] »; »tbl_test »; »[La_date]<=" & DateUS(La_date)))

    Quelqu'un peut m'aider ?

    Merci à vous.

    Patrick

  7. SODRE Kassoum dit :

    Hervé, je précise que je travail sur ACCESS 2007. Est ce pas là le problème aussi ?

  8. SODRE Kassoum dit :

    Merci Hervé pour avoir sauvé mon émail.
    Pour mon problème, j’ai vraiment au bout.
    En exécutant la commande « ? DateUS(Now) », je reçois un message d’erreur disant « Les macros de ce projet sont désactivés…. ».
    Je ne sais plus comment procéder.

    • Hervé Inisan dit :

      Quand tu ouvres une base de données qui contient du code VBA, il y a un avertissement qui s’affiche sous le ruban. A cet endroit, il faut activer les macros, sinon effectivement aucun code VBA ne pourra être exécuté. Le problème vient sans doute de là.

  9. SODRE Kassoum dit :

    Bonjour Hervé. Comment « recuperer la fonction DataUS », comment tu l’as dit?

    • Hervé Inisan dit :

      La fonction DateUS() est traitée dans un autre article du blog. Cet article-ci donne un lien direct (voir au paragraphe « Notes »).

      • SODRE Kassoum dit :

        Merci Hervé pour ton aide. J’ai respecter les instructions en écrivant la fonction de conversion en Visual Basic. Mais apres exécution je recois ce message. « La fonction DateUS non définie dans l’expression ». J’ai le meme resultat que quand je n’avait pas mis la fonction dans Visual Basic. Venez à mon aide:

        Ma table est nommée : « Saisie_operation »: avec pour champ:
        – N°: NumeroAuto
        – DateJour : Date/heure
        – DateSaisie : Date/heure
        – Ncheque: Numérique
        – Nmatricule: Texte
        – CodeBudget: Numerique
        – Intitulé : Texte
        – Mtdebit: Monétaire
        – Mtcredit: Monétaire
        – Observation: Memo
        – Copiecheq: Piece jointe

        Je cherche a faire le cumul les champs Mtdebit et Mtcredit par rapport aux dates de saisie opération (DateSaisie).
        En voici ma formule qui a donné au message « La fonction DateUS non définie dans l’expression »:
        Cumul: CDbl(SomDom(« [Mtcredi] »; »Saisie_operation »; »[DateSaisie]<=" & DateUS([DateSaisie])))

        Merci pour votre patience!

        • Hervé Inisan dit :

          A priori, la fonction n’est pas trouvée.
          Est-ce qu’elle est bien stockée dans un module de la base ? (un module standard, pas un module de formulaire ou d’état).

          • SODRE Kassoum dit :

            Oui la fonction n est pas trouvée. Pourtant j’ai essayé de suivre les instructions.

            Cliquez sur l’onglet Modules de la base de données.
            Cliquez ensuite sur le bouton Nouveau.
            Tapez le code ci-dessous dans le module.
            Enregistrez le module en le nommant par exemple mod Dates.

            Pourrai vous envoyez une capture de mon écran? Mon émail est xyz@yahoo.fr .
            Merci encore.

          • Hervé Inisan dit :

            Si tu ouvres la fenêtre Exécution (Ctrl + G), et que tu tapes dedans :

            puis Entrée pour valider. Est-ce que ça affiche une date entre dièses ? Ou une erreur ?
            S’il y a une erreur, c’est que le bloc Function DateUS() ... End Function n’est pas correctement stocké dans la base.
            PS : J’ai masqué ton email dans le commentaire, pour ne pas l’exposer aux spammeurs. 😉

        • issouf dit :

          il faut activer le contenu. j’avais le meme probleme.

  10. Standal dit :

    Bonjour,

    Tout d’abord merci beaucoup pour ce grenier vraiment très utile

    J’ai donc appliqué la fonction somdom comme indiqué sur laquelle j’ai inclus un second critère, le souci est que je me retrouve avec un #erreur alors qu’en ne prenant la date j’ai bien un résultat cohérent.

    SomDom(« Valeur »; »Table mouvement de stock »; »Date<=" & DateUs([Date]) & "and Article=" & [Article])

    Merci pour votre aide

  11. Hervé Inisan dit :

    mel > Même réponse que pour Yeo : la question est trop spécifique pour être traitée ici. Le forum du site sera plus adapté.

  12. mel dit :

    J’ai le même problème que YEO

  13. Hervé Inisan dit :

    kiprix > Quelle est ta formule de cumul actuelle ?

  14. Hervé Inisan dit :

    dzben > Merci pour le retour ! 🙂

  15. dzben dit :

    je viens de prendre connaissance de votre grenier. Je le trouve formidable et très instructif. Merci

  16. kiprix dit :

    Bonjour à tous

    je suis sur le meme type de besoin sur une calcul de ventes cumulées jour mais avec un cumul sur 7 jours ( à la semaine) et sur un produit et en essayant les differentes formaules je me retrouve toujours avec des #erreur ou un global des ventes sur cahqu ligne … et je ne sais pas pourquoi

    j ai une requete : « test » où j ai en colonne :

    jour semaine ref vtesjour refsem
    01/01/2014 201401 aaaa 2 aaaa201401
    02/01/2014 201401 aaaa 0 aaaa201401
    03/01/2014 201401 aaaa 1 aaaa201401
    04/01/2014 201401 aaaa 3 aaaa201401
    05/01/2014 201401 aaaa 0 aaaa201401
    06/01/2014 201402 aaaa 1 aaaa201402
    07/01/2014 201402 aaaa 2 aaaa201402
    08/01/2014 201402 aaaa 0 aaaa201402
    09/01/2014 201402 aaaa 1 aaaa201402

    et je voudrais devant chaque « ref jour sem » avoir les ventes cumulées et reprendre en debut de semaine le calcul
    cela parait facile ( pour vous) mais j ai un souci dessus meme en utilisant la concatenation
    qqn peut il m eclairer ?
    Merci d avance
    kiprix

  17. Hervé Inisan dit :

    vinch > Super 🙂

  18. vinch dit :

    A 1ère vue, cela fonctionne parfaitement !

    Merci infiniment pour ton aide

  19. Hervé Inisan dit :

    vinch > Le fait que le numéro ne soit pas ordonné (dans l’absolu) complique un peu le filtre. Cette formule devrait faire l’affaire (sur une seule ligne de requête) :

  20. vinch dit :

    Merci encore pour le suivi.

    si je reprends mon précèdent post, je souhaiterais voir afficher :

    ladate numero val cumul
    01.01.2013 1 10 10
    10.01.2013 2 20 30
    10.01.2013 9 1000 1030
    15.01.2013 7 1000 2030
    20.01.2013 3 50 2080
    30.01.2013 4 101 2181
    01.02.2013 5 5 2186
    10.02.2013 6 10.5 2196.5
    15.03.2013 8 15 2211.5

    C’est à dire simplement la fonction « cumul » disponible dans les propriété d’Etat.

    Je suis en train de créer un compta simple pour entreprise où je veux afficher un extrait de compte sur la base d’écriture saisie.

    Les dates d’écriture vont varier(ne pas être uniquement croissante ou ordonnée). C’est pourquoi j’utilise un champ numéroauto pour faciliter le tri (Date+numéro) dans l’affichage de mon extrait.

    Les champs de mon extrait seront très proches de mon exemple et je ne souhaiterais pas (si possible) en ajouter un nouveau pour que la procédure fonctionne …

    Est-il possible de regrouper (somdom) seulement par ligne (sous-entendu enregistrement affiché … Record …)

    Merci d’avance pour la réponse

  21. Hervé Inisan dit :

    vinch > Avec un numéro seul, ça pourrait fonctionner. Mais à condition que celui-ci soit ordonné (ce qui n’est pas nécessairement le cas dans ton exemple). En d’autres termes, est-ce que tu as un champ ordonné qui puisse être utilisé comme repère pour le calcul ?

    Pour faire plus clair, est-ce que tu peux poster un exemple de tes données d’origine, et du résultat attendu ?

  22. vinch dit :

    Merci beaucoup Hervé pour la réponse.

    J’ai essayé cette formule car, avec uniquement le cumul par date, j’ai le même résultat par jour (logique vu la formule).

    Mon but n’est pas d’avoir un regroupement par jour mais uniquement une valeur cumulée par ligne d’écriture … (comme la fonction cumul dans les Etats)

    J’ai essayé avec le numéro en pensant que je forcerais le système à différencier les valeurs sur la date et, donc, à donner un résultat cumulé différent si j’ai plusieurs valeurs le même jour …

    Encore merci pour l’aide précieuse.

  23. Hervé Inisan dit :

    vinch > Dans ta formule, tu demandes de cumuler tout ce qui est inférieur à la date, ainsi que tous les numéros inférieurs. Or, pour la date du 15/01, le numéro de référence est 7, ce qui fait qu’on exclut le 9 de la ligne précédente. Le 1030 est donc logique (par rapport à ta formule). Si tu supprimes la condition sur le numéro et que tu gardes celle sur la date, ça doit être exact.

  24. vinch dit :

    Si j’ose abuser, je sèche franchement soit sur la syntaxe, soit sur la logique de cette formule.

    Je teste le solde cumulé sur des dates et selon des nos de pièces car j’ai des valeurs aux même dates. (comme ton exemple en haut)

    Le but postérieur sera d’appliquer la syntaxe dans un formulaire d’extrait de compte (comptable).

    Selon les champs que j’ai indiqués hier et avec la formule suivante :

    cumul: CDbl(SomDom(« [val] »; »test »; »[ladate]<= » & DateUS([ladate]) & « AND » & « [numero]<= » & [numero]))

    J’obtiens le résultat suivant :

    ladate numero val cumul
    01.01.2013 1 10 10
    10.01.2013 2 20 30
    10.01.2013 9 1000 1030
    15.01.2013 7 1000 1030
    20.01.2013 3 50 80
    30.01.2013 4 101 181
    01.02.2013 5 5 186
    10.02.2013 6 10.5 196.5
    15.03.2013 8 15 1211.5

    Jusqu’à la 3è ligne, c’est parfait. Après, ça part en vrille …

    Le but étant, bien sûr, d’avoir simplement un cumul par ligne …

    Merci d’avance de ton aide

  25. Hervé Inisan dit :

    vinch > Super. Content que ça marche ! 🙂

  26. vinch dit :

    Je viens de le faire et cela fonctionne maintenant. MERCI BEAUCOUP !!

  27. Hervé Inisan dit :

    vinch > Est-ce que tu as récupéré la fonction DateUS() comme indiqué dans l’article ?

  28. vinch dit :

    Bonjour Hervé et merci d’avance pour vos précieux conseils.

    Je tourne sur Windows 7 avec Access 2003.

    J’ai reproduis votre fonction de cumul mentionnée tout en haut. Malheureusement, je croche sur la date …

    J’ai créer une table test avec champs :
    – ladate (Date/Heure)
    – numero (NuméroAuto)
    – val (numérique)

    Dans ma requête test1, j’ajoute un champ cumul comme suit :

    cumul: CDbl(SomDom(« [val] »; »test »; »[ladate]<= » & [ladate]))

    le resultat dans le champ cumul donne #Erreur (pour faciliter le test, j’ai mis toute des dates différentes)

    Si j’ajoute DateUS([ladate]), j’ai un message d’erreur : « Fonction ‘DateUS non définie dans l’expression’ …

    Par contre, si je base le cumul sur le numero comme suit :
    cumul: CDbl(SomDom(« [val] »; »test »; »[numero]<= » & [numero]))
    le résultat est concluant.

    Quel est le problème de syntaxe avec la date ?

    Parce qu’en pratique, je vais devoir baser mon « cumul » sur la date + sur le numéro …

    Je précise d’avance que je suis une pomme en SQL … Merci d’avance

  29. Hervé Inisan dit :

    esto > Quelque chose comme ceci devrait faire l’affaire :

  30. esto dit :

    Bonjour à tous,
    j’ai ma table COMPTA qui se présente comme ceci:
    COMPTE DEBIT CREDIT LIGNE
    401100 50000 0 2
    401100 0 200000 1
    401100 25000 0 3
    Et je veux écrire une requête qui me permettra d’obtenir ceci

    COMPTE DEBIT CREDIT SOLD LIGNE
    401100 0 200000 -200000 1
    401100 50000 0 -150000 2
    401100 25000 0 -125000 3
    Voici ce que j’ai écris dans ma requête et ça na marche

    SELECT Requête1.COMPTE, Requête1.DEBIT, Requête1.CREDIT, Sum(Requête1.DEBIT-Requête1.CREDIT) AS SOLD, Requête1.LIGNE,
    CDbl(SomDom(« [SOLD] », »Requête1″, »[COMPTE]= » & [COMPTE] & « , »[DEBIT]= » & [DEBIT] & « , »[CREDIT]= » & [CREDIT] &  » Et  » & « [LIGNE]<= » & [LIGNE]))
    FROM Requête1
    GROUP BY COMPTA.COMPTE, COMPTA.DEBIT, COMPTA.CREDIT, COMPTA.LIGNE;

    Merci pour votre aide.

  31. Hervé Inisan dit :

    Berenice > A priori, je dirais que non (les valeurs de mon exemple sont aussi des réels doubles). Mais est-ce que toutes les valeurs sont renseignées dans la table ?

  32. Berenice dit :

    Bonjour,
    Merci beaucoup pour ce blog d’astuces sur Access, c’est top!
    Grâce à vos explications j’ai pu créer facilement mon cumul, par contre dans le résultat j’ai parfois des #Erreur lorsqu’il s’agit d’un réel double, est-ce la virgule qui le perturbe?
    Comment contourner ce problème?
    Par avance merci pour votre aide.

  33. Hervé Inisan dit :

    LandryGildas > Pour info : la base est transmise aux personnes, ou présente sur une seule machine ?

    Sinon, il faut savoir qu’à partir d’Access 2007, le format .accdb ne gère plus la « sécurité utilisateur » (cette partie est laissée au serveur SharePoint… quand on en a un !). Ça veut dire qu’on ne peut plus avoir d’utilisateurs différents sur la base (des comptes avec des mots de passe différents). Les solutions sont :

    1. De travailler en MDB plutôt qu’ACCDB (et de mettre en place la « sécurité utilisateur »).
    2. De mettre un mot de passe unique (malheureusement).
    3. De gérer la sécurité par SharePoint (pas applicable).
  34. LandryGildas dit :

    Salut à tous.. je crée des DB sous ACCESS 2007 et je suie entrain de monter une app pour ma famille et mes amies; je voudrai que chaque membre puisse avoir une ID unique (et non un password..) de plus de 4 chiffres attribué au hasard lors de l’enregistrement d’un nouveau membre..Aidez moi. A +

  35. Hervé Inisan dit :

    Thorgi74 > « Aucun résultat » : ça veut dire qu’il y a un message d’erreur ? Ou qu’une valeur Null s’affiche ? Ou qu’une valeur 0 s’affiche ?

  36. Thorgi74 dit :

    Bonjour,

    Je souhaite faire le cumul d’un poids en fonction de la date. Chaque our j’ai un poids different rentre dans la table. je souhaite en faire le cumul chaque jour. Le probleme est que quand je rentre la ligne de commande, cela ne fonctionne pas ou ca m’affiche le total du cumul sur chaque ligne : j’ai le meme chiffre sur chaque lignes.
    Puisque je travail sur un ordinateur americain et que j’utilise access2010 en version americaine, je suppose que je n’ai pas besoin de rentrer la ligne de commande VBA pour passer en date US puisque c’est le format que j’utilise.
    Voici la fonction que j’ai ecrit basee sur ce qui a ete dit plus haut et ce que j’ai trouve sur le net :
    Cumulative_Pull: DSum(« [Pull_US1] », »DailyInf_US1″, »[Day_Date] <= » & [Day_Date])
    Et je n’obtient aucun resultat. Ma cle primaire est la date et sur cette table je ne peux pas avoir de doublons sur la date.
    De plus je voudrais effectuer le calcul a partir d’une valeur qui n’est pas nulle.
    Pouvez vous me dire pourquoi ca ne marche pas?

    Merci

  37. Hervé Inisan dit :

    DAMA TCHETCHAI NOEL > Je ne peux pas envoyer une réponse spécifique par mail à chaque lecteur du blog, j’espère que tu comprendras. 😉

    D’autre part, la question est un peu vague : quelles appréciations applique-t-on ? En fonction de quelles moyennes ? Comment décide-t-on des orientations ?

    A priori, il faudra sans doute des tables de correspondances pour permettre ces décisions automatiquement, mais ça dépend de leur complexité…

  38. DAMA TCHETCHAI NOEL dit :

    comment calcule -t-on la moyenne des élèves, leur rang, leur appréciation,leur orientation en fonction de leur moyenne,si possible envoyer moi un exemple que je dois pour réussir ce travail sous Access 2007.Merci pour tous vos efforts, que Dieu vous bénisse.

  39. DAMA TCHETCHAI NOEL dit :

    j’ai le même problème que yeo aider moi

  40. kino44 dit :

    bonjour, merci pour ces supers info ! c’est top.
    Malheureusement, je bloque totalement… Je dois également insérer un critère complémentaire (nom de commercial) et en prenant le modèle plus haut, ça ne fonctionne pas (par contre tout fonctionne correctement avec juste le critère de date)
    ma formule est :
    Cumul CA: CDbl(SomDom(« [CA] »; »CA PAR COMMERCIAUX »; »[cial]= » & [cial] &  » Et  » & « [date facturation]<= » & dateUS([date facturation])))
    Si vous pouviez m’aider, ça serait top! merci d’avance

  41. Hervé Inisan dit :

    NM > J’ai vérifié (rapidement) sur Access 2003 : je ne pense pas que ce changement soit possible (mais j’ai fait vite ;-)). Pas eu le temps de vérifier non plus sur Access 2007 ou 2010 pour l’instant…

  42. NM dit :

    Bonjour,

    Je pense ne pas être au bon endroit mais j’essaie quand même..
    J’ai créé des nombreuses pages de graphiques croisés dynamiques et j’ai un gros problème avec la légende…
    Il m’affiches des « Somme de », « moyenne de » … (du au calcul automatique de mes données) que je souhaiterais enlever de ma légende.. Cela fait 2 jours que je me penche sur ce seul problème et je commence à craquer !

    Pouvez-vous m’aider ?

    Merci !

  43. NM dit :

    C’est bon en fait j’avais une erreur dans la syntaxe de l’instruction SQL.
    Merci !

  44. Hervé Inisan dit :

    NM > En fait, un champ n’est pas à la fois numérique et texte, il ne peut être que l’un ou l’autre. Dans ton cas, il est uniquement Texte.

    Autre possibilité (comme je ne connais pas la table) : il peut s’agir d’une Date/Heure, formatée en jj-mmmm. C’est la structure de la table qui doit te confirmer ça.

    Si par contre c’est vraiment du texte, la structure est sans doute mauvaise : tu as moins de possibilités de tri sous la forme que tu donnes. En triant sur plusieurs années, tu aurais tous les 09-Septembre (de toutes les années) ensemble, ce qui n’est pas l’objectif, j’imagine. 😉

  45. NM dit :

    Bonjour,

    Et si on a un champ qui est de type a la fois numérique et texte (par exemple, 09-Septembre)… ??

    Merci de ton aide !

  46. Hervé Inisan dit :

    Id > Je n’ai pas de quoi tester, mais en ajoutant le numéro de magasin dans le critère du SomDom(), ça devrait passer. Du style :

    "[La Date]<=" & DateUS([La Date]) & " AND " [Champ Magasin] = " & [Champ Magasin]

    J’ai supposé que le [Champ Magasin] était de type Numérique.

  47. ld dit :

    bonjour, j’ai besoin de faire un cumul et la méthode 1 marche tres bien mais j’ai un critère de plus (un numero de magasin) et je voudrais que le cumul reprenne a zero a chaque magasin ?
    merci pour votre aide

  48. Hervé Inisan dit :

    @castours Il y a un espace dans l’un des [N°], est-ce que ça pourrait venir de là ?

  49. castours dit :

    Appliquer l’exemple de cumul avec acess 2003.
    Cela ne fonctionne pas
    Ou est mon erreur?

    SELECT T_Achat.N°, T_Achat.achat, T_Achat.prix,
    DSum(« [prix] »; »T_Achat « ; »[ N°] <= » & [N°]) AS cumul
    FROM T_Achat
    ORDER BY T_Achat.N°;

  50. Hervé Inisan dit :

    Mathieu > Le 3ème argument de DSum() est une clause WHERE SQL. Par concaténation, on peut donc ajouter autant de critères qu’on veut. Ca peut donner quelque chose comme :

    Cumul: CDbl(SomDom("[Quantite]";"R_MvtJour";"[SKU]='" & [SKU] & "' AND [Date] <= " & DateUS([Date])))

    J’ai supposé que SKU était de type Texte. Si c’est un nombre, il faut enlever les apostrophes.

  51. Mathieu Journeau dit :

    Bonjour,

    Je dois reconstituer un stock jour par jour et par article à partir d’une table de mouvement ( entrée et sortie par jour ). Pour se faire, la fonction SomDom me parait incontournable et je me suis basé sur votre exemple ci-dessus.
    En prenant en compte le critère date, votre formule avec mes critères fonctionne :
    Cumul: CDbl(SomDom(« [Quantite] »; »R_MvtJour »; »[Date]<= » & dateUS([Date])))
    Cependant, je n’arrive pas au résultat escompté, il me faut un solde par jour et par article (champ « SKU » dans ma requête d’origine) et la formule avec le seul critère « Date » me donne logiquement qu’un cumul par date (tout « SKU » confondu).
    Est-il possible d’ajouter un critère à cette fonction?

  52. YEO dit :

    MERCI pour le conseil et rendez vous au FORUM.

  53. Hervé Inisan dit :

    Yeo > La question porte sur un autre sujet que l’article, merci de la reposer sur le forum Access, ce sera plus facile d’en discuter.

  54. YEO dit :

    Salut Monsieur Hervé et merci pour ce blog
    Je crève sur une base que un exercice depuis une 6 mois mais je contact que le bout du tunnel est encore loin, alors je voudrais demander de l’aide a tous. Le stress peut me rendre fou.
    Je veux créer une requête pour calculer les moyennes mais je n’arrive pas a trouver la formule exact. Parce que Pour le Calcul des Moyennes: Il faut noter que chaque matière a un cœfficient qui varie selon le type d’évaluation; ainsi pour les notes de devoir le cœfficient peut être 1; 2; 3 ou même 4 selon la matière et la classe.
    Type d’evaluation: Devoir= notes sur 20, coef (1-2-3-4)
    Interrogation: Notes sur 10. coef (0.5)
    Rapport de fin de trimestre: Faire le classement par Ordre d’excellence de tous les élèves par classe et Déterminer par la suite ceux qui sont Admis en classe supérieur, ceux qui sont Admis et ceux qui sont exclut. Le calcul des moyennes par matières se compliquent a 3 niveaux: Il faut tenir compte des dispensent dont certains élèves font l’objet et les heures d’absences. 3 h d’absences vaut un point sur la moyennes Disciplinaire qui elle ne varie pas et as pas besoin d’évaluation tous les élèves y ont droit et enfin les cœfficients des 3 Trimestres. Trim1 coef1; Trim2 Coef2; Trim3 coef3. La moyenne Annuelle se calcul de la manière suivante: MoyTrim1+MoyTrim2+MoyTrim3/5. Le 5 est la somme des 3 cœfficients, des 3 Trimestres que compte l’année scolaire. A partir de cette moyenne Annuelle un nouveau Rapport de fin d’année est Etablit pour l’année suivant
    Voici les Tables; les clé Primaire en gras
    T_Eleves: N°Matricule ; NomEleve ; Prenom ; Date de Naissance………..
    T_Matière: N°Matiere ; Français ; Math ; Physique ; Anglais ; ………………
    T_Contenu-Bulletin : N°Bulletin ; CoeficientTrimestre ; Date Debut Trimestre ; Date Fin Trimestre ;
    T_Evaluation: N°Evaluation ; DateEvaluation; Coeficient; Type Evaluation(Devoir,Interro); Note.
    T_Classe: N°Classe ; 6è ; 5è ; 4è………..

    Je solliciter auprès de vous une aide.
    COORDIALEMENT
    YEO

  55. Hervé Inisan dit :

    eiffel > Dans l’exemple, j’ai effectivement supposé que la date est unique. Comme tu dis, on peut utiliser un autre type de clef, ou affiner la date avec une date/heure, si ça peut suffire. A aménager selon les contraintes de la table. Pour ce qui des performances, on peut aussi utiliser un SubSelect.

  56. eiffel dit :

    sur la première méthode, s’il y a 2 lignes avec la même date, alors le résultat sera faux !
    Dans ce cas, il faut introduire un champ NumeroAuto, et faire la selection du somdom sur ce numéro

    Cela dit, cette fonction est relativement gourmande et la rapidité d’Access, assez mauvaise, s’en ressentira…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *