Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/04/2011, 10h44   #1
Membre du Club
 
Inscription : octobre 2004
Messages : 119
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 119
Points : 40
Points : 40
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 :
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
aA189 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2011, 11h45   #2
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

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

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
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
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2011, 20h02   #3
Membre du Club
 
Inscription : octobre 2004
Messages : 119
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 119
Points : 40
Points : 40
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 :
Set monrstreq = marequete.OpenRecordset(dbOpenDynaset)  ‘erreur d’execution 28 inconnu
.Pas moyen d'ouvrir mon recordset

Code :
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
aA189 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2011, 20h49   #4
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 623
Points : 11 623
Bonjour,

Peux-tu poster la requete ?

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 11h12   #5
Membre du Club
 
Inscription : octobre 2004
Messages : 119
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 119
Points : 40
Points : 40
Voici la requete SQL

Code :
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 :
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 :
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
aA189 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 12h50   #6
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 623
Points : 11 623
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,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 19h39   #7
Membre du Club
 
Inscription : octobre 2004
Messages : 119
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 119
Points : 40
Points : 40
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 .
aA189 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 20h07   #8
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 623
Points : 11 623
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.
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 20h02   #9
Membre du Club
 
Inscription : octobre 2004
Messages : 119
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 119
Points : 40
Points : 40
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

Citation:
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 :
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

Citation:
Vous avez essayer d'executer une requete ne comprenant pas l'expression spécifiée "Quantité" comme une partie de la fonction agrégat
aA189 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 09h07   #10
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 623
Points : 11 623
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).
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 10h05   #11
Membre du Club
 
Inscription : octobre 2004
Messages : 119
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 119
Points : 40
Points : 40
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 :
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
aA189 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 16h19   #12
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 623
Points : 11 623
Parcequ'il n'y a pas d'événements sur ces objets.
A partir de 2010 on trouve les triggers.
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 16h50   #13
Membre du Club
 
Inscription : octobre 2004
Messages : 119
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 119
Points : 40
Points : 40
Ok merci ...
aA189 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 18h21   #14
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

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

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
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 :
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
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 18h32   #15
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

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

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
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 :
1
2
SELECT Table1.N°, DSum("N°","Table1","N°<=" & []) AS Expr1
FROM Table1;
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 08h22   #16
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 103
Points : 39
Points : 39
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
castours est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h18.


 
 
 
 
Partenaires

Hébergement Web