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

VBA Access Discussion :

Faire un cumul dans une requete [AC-2000]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut Faire un cumul dans une requete
    Bonjour à tous , j'aie besoin d'un petit coup de main pour faire un
    cumul dans le champ d'une requete .
    Pour l'instant je n'arrive pas à lire correctement les cellules d'un champ
    et je ne parviens pas non plus à les enregistrer .

    Voici mon code

    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
    33
    Private Sub cumul1()
     
    Dim mabase As DAO.Database
    Dim monrstreq As DAO.Recordset
    Dim matable As DAO.TableDef
    Dim marequete As DAO.QueryDef
    Dim monchamp As DAO.Field
     
    Set mabase = CurrentDb
    Set matable = mabase.TableDefs("Achat")
    Set monchamp = matable.Fields("Quantité")
    Set monrst = mabase.OpenRecordset("Achat", dbOpenTable)
    Set monrstreq = mabase.OpenRecordset("ACHAT", dbOpenDynaset)
     
    monrstreq.MoveFirst
     
     Do While Not monrstreq.EOF
     
     Debug.Print monrstreq.Fields(7).Value  ‘ici la fenetre affiche des valeurs null  au fur et à mesure que je boucle alors que le champ de la requete contient des chiffres .En revanche le 1 er enregistrement affiche correctement la valeur .Si je prend fields(6) à la place de fields(7) 
    Les valeurs sont affichées correctement .En revanche je ne parviens pas à les enregistrer dans le champ 8 avec update
     
                 monrstreq.MoveNext
     
     With monrstreq
     .AddNew
     .Fields(8).Value = monrstreq.Fields(7).Value
     .Update  'ici erreur d'execution 3314
     End With
     Loop
     
      monrstreq.Close
      Set monrstreq = Nothing
    End Sub

  2. #2
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello
    je ne vois pas bien le but de ta prograammation
    essaye avec une requête tout bête, tu devais y arriver de manière beaucoup plus simple
    Joyeuses Pâques

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Pour l'instant , je n'aie pas trouvé spontannement une requete faisant un cumul et puis j'aime bien me compliquer la vie avec vba .

    J'aie remanié mon code comme ceci avec toutefois encore une coquille sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set monrstreq = marequete.OpenRecordset(dbOpenDynaset)  ‘erreur d’execution 28 inconnu
    .Pas moyen d'ouvrir mon recordset

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Public Function cumul1() As Currency
    'Portée en public pour que le générateur d'expression détecte la fonction cumul1
     
    Dim mabase As DAO.Database
    Dim monrstreq As DAO.Recordset
    Dim matable As DAO.TableDef
    Dim marequete As DAO.QueryDef
    Dim monchamp As DAO.Field
     
    Set mabase = CurrentDb
    Set marequete = mabase.QueryDefs("ACHAT")
    Set matable = mabase.TableDefs("Achat (PASSE)")
    Set monchamp = matable.Fields("Quantité")
    Set monrstreq = marequete.OpenRecordset(dbOpenDynaset)  ‘erreur d’execution 28 inconnu
     
    Dim nbdonnee As Long
               monrstreq.MoveLast ' nécessaire d'aller à la fin du tableau pour obtenir le nb delignes avec recordcount
    nbdonnee = monrstreq.RecordCount
               monrstreq.MoveFirst 'nécessaire de retourner au début sinon la boucle for plantera
     
    Dim tableau As Variant
    ReDim tableau(nbdonnee)
     
    Dim i As Integer
    For i = 1 To nbdonnee
        If i = 1 Then
            tableau(1) = monrstreq("Montant net de l'achat")
        Else
            tableau(i) = monrstreq("Montant net de l'achat") + tableau(i - 1)
        End If
        monrstreq.MoveNext
     
     With monrstreq
     
     .Edit
     .Fields(8).Value = tableau(i) 
     .Update
     .MoveNext
     
     End With
     
    Next i
     
      monrstreq.Close
      mabase.Close
      Set monrstreq = Nothing
      Set mabase = Nothing
     
    End Function

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 064
    Points : 24 673
    Points
    24 673
    Par défaut
    Bonjour,

    Peux-tu poster la requete ?

    Cordialement,

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Voici la requete SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT [Achat (PASSE)].Quantité, [Achat (PASSE)].Prix, [Quantité]*[Prix] AS [Montant net de l'achat], cumul1() AS Expr1
    FROM [Achat (PASSE)];
    Le bug sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set monrecordsetsurreq = marequete.OpenRecordset() 'ouvre un recordset sur la requete
    Ne veut pas que j’ajoute une colonne dans le générateur d’expression et que je me branche sur la fonction cumul1 .
    Autrement dit il faut supprimer cumul1() AS Expr1 dans la requete SQL pour que la macro fonctionne .Que faire ?

    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
    33
    34
    35
    36
    37
    Option Compare Database
    Option Base 1
    Option Explicit
     
    Public Function cumul1() As Currency
     
    Dim mabase As DAO.Database
    Set mabase = CurrentDb
     
    Dim marequete As DAO.QueryDef
    Set marequete = mabase.QueryDefs("ACHAT")
     
    Dim champrequete As DAO.Field
    Set champrequete = marequete.Fields(2)
     
    Dim monrecordsetsurreq As DAO.Recordset
    Set monrecordsetsurreq = marequete.OpenRecordset() 'ouvre un recordset sur la requete
     
    Dim nbdonnee As Long
    monrecordsetsurreq.MoveLast ' nécessaire d'aller à la fin du tableau pour obtenir le nb delignes avec recordcount
    nbdonnee = monrecordsetsurreq.RecordCount
               monrecordsetsurreq.MoveFirst 'nécessaire de retourner au début sinon la boucle for plantera
     
    Dim tableau As Variant
    ReDim tableau(nbdonnee)
     
    Dim i As Integer
    For i = 1 To nbdonnee
        If i = 1 Then
            tableau(1) = monrecordsetsurreq(3)  'ou monrecordsetsurreq("Montant net de l'achat")
        Else
            tableau(i) = monrecordsetsurreq(3) + tableau(i - 1)
        End If
        monrecordsetsurreq.MoveNext
    Next i
     
    End Function

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 064
    Points : 24 673
    Points
    24 673
    Par défaut
    Tu réouvre la requete "achat (passe)" dans la fonction cumul1() qui est appelée depuis "achat (passe)". Je ne comprend pas trop se que tu veux faire mais ceci ne peut pas fonctionner.

    Cordialement,

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    C'est simple , je veux juste faire un cumul du champ "Montant net de l'achat" .
    "Montant net de l'achat" est calculé automatiquement avec la requête .

    Ensuite il faudrait que j'ajouter un nouveau champ vide de donnée nommé "Cumul".
    Je boucle sur le champ "Montant net de l'achat" en sommant la valeur courante i avec la valeur i-1 précedente .Et j'envoie le résultat dans la colonne "Cumul" au fur et à mesure .

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 064
    Points : 24 673
    Points
    24 673
    Par défaut
    Pour faire la somme d'un champ d'une table on utilise habituellement ceci :

    Y-t-il une raison technique pour que tu ne l'utilises pas ?

    A moins que je n'ai pas tout compris.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Pas de problème à ce que j'utiliser la fonction sum([champ]) ...
    (dans les TCD je suis quasi sur qu'il existe une fonction "cumuler" probablement cum() )

    Voici un exemple de cumul

    Quantité prix Montant net de l'achat Cumul
    2 3,5 7 7
    1 4 4 11
    10 10,6 106 117
    15 7,5 112,5 229,5
    Pour le calcul de "Montant net de l'achat" j'y arrive spontanément via une requete .
    Par contre une fonction sum([champ]) toute bête je n'y arrive pas !(un bug d'access 2000 ?!)

    voici ce que j'aie tenté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [Achat (PASSE)].Quantité, [Achat (PASSE)].Prix, [Quantité]*[Prix] AS [Montant net de l'achat], Sum([Achat (PASSE)]![Quantité]*[Achat (PASSE)]![Prix]) AS Expr1
    Et je recois le message d'erreur

    Vous avez essayer d'executer une requete ne comprenant pas l'expression spécifiée "Quantité" comme une partie de la fonction agrégat

  10. #10
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 064
    Points : 24 673
    Points
    24 673
    Par défaut
    Un bug ! Surement pas...

    Il te manque le Group by tout simplement. Obligatoire quand tu utilises des fonctions de regroupement.

    Si tu as du mal avec SQL ACCESS utilise le QBE (générateur de requête).

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Bonjour , voici ma solution .Le calcul du cumul est correct .
    Ce que je ne comprend pas c’est comment me brancher à ma fonction cumul1 lorsque
    Je double clique sur ma requete …
    Il me faudrait un événement double click qui lance ma macro «*cumul1*» .Cad en bon français «*Lorsque je double clique sur ma requête nommée «*Cumul*» lance ma fonction cumul1*»
    Pour cela j’aie pensé à utiliser un module de classe avec public event ou public withevent .
    Mais la programmation de module de class n’est pas ma tasse de thé …(Ce qui me gêne sur Access c’est que je ne trouve pas d’événements sur des objets comme des tables ou des requetes .)

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Option Compare Database
     
    Public Function cumul1() As Currency
     
    Dim mabase As DAO.Database
    Set mabase = CurrentDb
     
    Dim marequete As DAO.QueryDef
    Set marequete = mabase.QueryDefs("Cumul")
     
    Dim champrequete, champcumul As DAO.Field
    Set champrequete = marequete.Fields(2)
     
    Dim monrecordsetsurreq As DAO.Recordset
    Set monrecordsetsurreq = marequete.OpenRecordset(dbOpenDynaset) 
     
    Dim nbdonnee As Long
    monrecordsetsurreq.MoveLast 
    nbdonnee = monrecordsetsurreq.RecordCount
                       monrecordsetsurreq.MoveFirst 
     
    Dim tableau As Variant
    ReDim tableau(nbdonnee)
     
    'monrecordsetsurreq.MoveFirst
     
    Dim i As Integer
    For i = 1 To nbdonnee 
    monrecordsetsurreq.Edit
        If i = 1 Then
            tableau(1) = monrecordsetsurreq(2)  
        monrecordsetsurreq.Fields("Cumul Test") = tableau(1)
        Else
            tableau(i) = monrecordsetsurreq(2) + tableau(i - 1) 
            monrecordsetsurreq.Fields("Cumul Test") = tableau(i)
        End If
     
        monrecordsetsurreq.Update
        monrecordsetsurreq.MoveNext
    Next i
     
    End Function

  12. #12
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 064
    Points : 24 673
    Points
    24 673
    Par défaut
    Parcequ'il n'y a pas d'événements sur ces objets.
    A partir de 2010 on trouve les triggers.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Ok merci ...

  14. #14
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello
    ayant mieux compris ce que tu veux, il suffit de passer ta requête dans un formulaire
    avec un bouton cumul en haut et cette petite programmation simpliste (c'est plus fort que moi)
    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
    Private Sub Cumuler_Click()
    Me.Requery
    DoCmd.GoToRecord , , acFirst
    Cumul = Valeur
    cumul_mémo = Cumul
    DoCmd.GoToRecord , , acNext
    Do Until NewRecord
        If IsNull(Valeur) Then
            Cumul = cumul_mémo
        Else
            Cumul = cumul_mémo + Valeur
            cumul_mémo = Cumul
        End If
        DoCmd.GoToRecord , , acNext
    Loop
    End Sub
    c'est ce que j'utilise pour ma prévision de trésorerie

  15. #15
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Re Hello
    comme cette chose m'a titillé un peu trop, voici un exemple vite fait:
    une table avec un seul champ: N°
    et des valeurs de 1 à 11 dans les 11 lignes la requête suivante donne bien le cumul
    à partir de cet exemple simpliste (eh oui, je m'appelle Simplifi), tu trouveras certainement la bonne adaptation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Table1.N°, DSum("N°","Table1","N°<=" & []) AS Expr1
    FROM Table1;

  16. #16
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2005
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2005
    Messages : 164
    Points : 99
    Points
    99
    Par défaut Cumul colonne selectif
    Bonjour
    Je suis interressé par la methode mais sur 2 table.avec la clé primaire et secondaire.
    Comment indiquer le chemin de la 2eme table ?
    Table1 cle primaire IMMA
    Table 2 cle secondaire IMMA
    Je voudrai realissé le cumul selectif en utilisant Imma
    J'applique la requete decrite dans un champ de la table2 sur sa clé primaire mais additionne tous les enregistrements.
    Je voudrai le faire sur l'imatriculation d'un vehicule de la table 1
    Merci de votre aide

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

Discussions similaires

  1. faire un filtre dans une requete sql
    Par EFFLYINGJOKER dans le forum Développement
    Réponses: 1
    Dernier message: 02/04/2009, 16h22
  2. Peut-on faire des cumuls dans une requete ?
    Par kikidrome dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 20/03/2008, 16h12
  3. faire un arrondi dans une requete
    Par popofpopof dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/10/2007, 20h35
  4. Réponses: 1
    Dernier message: 28/03/2007, 12h23
  5. faire plusieurs having dans une requete mysql
    Par sirbaldur dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/11/2006, 10h22

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