Autres Somme et comptable sur une table access

Seb

XLDnaute Occasionnel
Bonsoir le forum.
Je viens vers vous car je n’arrive pas à faire un comptage et une somme sur une base Access.

Je travaille sur Excel et j’ai besoin d’interroger une base Access avec plusieurs champs dont un « Montant » dont je cherche à sommer en fonction d’un Critère . Le début de mon code:

Sub Test()
Exercice = 2020
Critere = "01/02/2020"

Set Base = DBEngine.OpenDatabase(ThisWorkbook.Path & "\TEST.accdb")
Set ENR = Base.OpenRecordset("SELECT * FROM " & Exercice & " WHERE DATE=" & Chr(34) & Critere & Chr(34), dbOpenDynaset).

End sub

A partir de là, j’ai besoin d’avoir le nombre de correspondances et surtout la somme d’un champs « Montant ».

Je sais faire avec une boucle, mais j’aimerais utiliser les Fonctions DSum et DCount mais je n’arrive pas à l’utiliser.

Si quelqu’un pourrait l’aiguillette!
Merci beaucoup
Seb
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir @Seb , Le Forum

Ouh la ! Ca fait un bail que je n'ai plus ouvert Access, je suis passé sur SQL Server depuis un bail, mais je pense que le principe reste le même qu'avec une requête ADO dans VBA, dans ce cas je pense qu'on pourrait passer la notion de SUM et de COUNT dans la string du RecordSet, style :

Set ENR = Base.OpenRecordset("SELECT [Mon Champ 1], [Mon Champ 2], SUM[Mon Champ Montant] ] FROM " & Exercice & " WHERE DATE=" & Chr(34) & Critere & Chr(34), & "GROUP BY [Mon Champ 1]" & , [dbOpenDynaset).

Je ne sais plus par contre pour DSum ou Dcount, typiques à Access...

Si ça peut te faire avancer...

PS je n'ai pas testé la syntax de la string, c'est juste pour l'exemple.

Bien à Toi, à Vous
@+Thierry
 

Seb

XLDnaute Occasionnel
Salut Thierry,

Je suis arrivé à avoir un debut de vba qui à l'air de fonctionner:

Sub Macro9()
Dim Chemin_BD As String
Dim ENR As Recordset: Dim Base As DataBase
Dim n: Dim Sql As String

Set Base = DBEngine.OpenDatabase(ThisWorkbook.Path & "\ZRM_Exchange.accdb")

Sql = "SELECT SECTEUR, SUM(MONTANT) FROM 2020 GROUP BY SECTEUR"
Set ENR = Base.OpenRecordset(Sql, dbOpenDynaset)

qte=ENR.RecordCount
n = ENR.GetRows



End Sub


Mais j'ai du mal à extraire mon recordset. Comment transférer un recordset dans un tableau vba? La fonction n = ENR.GetRows ne me donne qu'une partie (chez mois il me donne que la 1ere ligne), alors que ENR.RecordCount m'en decompte 7.

Merci pour ton coup de main
seb
 

Seb

XLDnaute Occasionnel
C'est bon j'ai réussi en utilisant

n= ENR.GetRows(ENR.RecordCount)
Juste une erreur d'ecriture.

Mais je bloque a nouveau.

Dans Access j'ai des champs "DATE" "SECTEUR" "TYPE" et "MONTANT"

Dans une table j'ai 1 année de travail.


Quel serait l'ecriture de mon SQL pour avoir:

-La somme par mois par secteur.
-La somme par mois par secteur trié par type.


C'est la ou je bloque.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Salut Seb

Comme je t'ai dit je ne touche plus trop Access depuis que j'utilse SQL Server (et ça fait longtemps !).

Pour SQL depuis VBA on utilise ADO, mais je crois que pour Access on est toujours en DAO...
De là je ne sais pas trop utiliser/manipuler un RecordSet obtenu pas Dynaset (Qui est, je pense propre à Access)

Regarde l'aide en ligne de Microsoft :

https://docs.microsoft.com/en-us/of...e-reference/database-openrecordset-method-dao

Bon courage
@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re re Seb

Pour le post #6 et ta question

Quel serait l'écriture de mon SQL pour avoir :

La somme par mois par secteur. :
"SELECT DatePart(Month, [DATE]) , [SECTEUR] , Sum([MONTANT])
FROM 2020
GROUP BY DatePart(Month, [DATE]) , [SECTEUR]"


La somme par mois par secteur trié par type.
"SELECT DatePart(Month, [DATE]) , [SECTEUR] , [TYPE] , Sum([MONTANT])
FROM 2020
GROUP BY DatePart(Month, [DATE]), [SECTEUR]
ORDER BY [TYPE]"

Ce devrait être quelque chose dans ce style là... J'espère qu'Access comprends la function DatePart par contre... Tu peux aussi essayer avec Month([DATE]) à la place...

Bonne fin de journée
@+Thierry
 

Statistiques des forums

Discussions
312 282
Messages
2 086 770
Membres
103 391
dernier inscrit
lrol