Aide pour creer une requête regroupment et concatination et sum

cs_jolicoeur79 Messages postés 62 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 - 11 févr. 2017 à 01:49
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 12 févr. 2017 à 13:42
salut a tous
je voudrait exécuter une requête dans visual basic sur un bd access cette requête doit regrouper et concatener et sum des champs voici exemple de ma base
jai un table client_facture qui est compose de plusieurs champs
nclient nomclient nfacture montantfacture datefacture
1 clientN Foo1 500 02/02/2017
1 clientN Foo2 400 02/02/2017
ET JE VEUX QUE LE RESULTAT DE LA REQUETE s'affiche comme ça:
1 clientN Foo2-Foo1 900 02/02/2017
c'est quelqu'un peut m'aider resolut ce probleme et merci

3 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
12 févr. 2017 à 00:45
Bonjour cs_jolicoeur79,

En regardant ton pédigrée, je constate que tu scriptes en VB6 et en .Net

Ci-dessous un exemple en .Net

J'ai créé une base



Avec l'aide de MSDN
(https://msdn.microsoft.com/fr-fr/library/bb386910(v=vs.110).aspx) et Google (http://stackoverflow.com/questions/13998258/datatable-group-by-with-linq-in-vb-net), j'obtiens :
Option Strict On
Option Explicit On
Imports System.Data.OleDb

Public Class Form1

Dim pathbase As String = "C:\Users\CS_JMO\desktop\Temp\"
Dim filebase As String = pathbase & "Database11.accdb"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
readDatabase()
End Sub

Sub readDatabase()
Dim connStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filebase

Using conn As New OleDbConnection(connStr)
conn.Open()

Dim ds As New DataSet
Dim sql As New OleDbDataAdapter(" SELECT nclient,nomclient,nfacture,montantfacture, datefacture" & _
" FROM client_facture", conn)
sql.Fill(ds, "client_facture")
conn.Close()

Dim rows As DataTable = ds.Tables("client_facture")

Dim query = From row In rows.AsEnumerable()
Group row By nclient = row.Field(Of Int32)("nclient") Into nclientGroup = Group
Select New With {
Key nclient,
.nomclient = nclientGroup.Select(Function(r) r.Field(Of String)("nomclient")),
.nfacture = String.Join("-", nclientGroup.Select(Function(r) r.Field(Of String)("nfacture"))),
.montantfacture = nclientGroup.Sum(Function(r) r.Field(Of Int32)("montantfacture")),
.datefacture = nclientGroup.Select(Function(r) r.Field(Of Date)("datefacture"))
}

For Each x In query
MessageBox.Show("nclient=" & x.nclient & Environment.NewLine & _
"nomclient=" & x.nomclient.First & Environment.NewLine & _
"nfacture=" & x.nfacture & Environment.NewLine & _
"montantfacture=" & x.montantfacture & Environment.NewLine & _
"datefacture=" & x.datefacture.First)
Next

End Using
End Sub

End Class


Débutant en .Net, ce code est très certainement améliorable (merci à Whismeril et vb95, que je salue, de me corriger).

jean-marc
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
12 févr. 2017 à 02:20
Un salut à toi aussi cs_JMO
je ne te corrigerai point car les bases de données et moi cela fait deux !
Il faut dire que je code en VB net pour mon plaisir et n'ayant jamais eu besoin de bases de données je ne m'y suis jamais intéressé de près .
Pas envie de dire des bêtises et d'induire en erreur les personnes qui viennent chercher de l'aide !
Bonne programmation à toi
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
12 févr. 2017 à 13:42
Bonjour à tous les 2 (3 avec Uc et 4 avec jolicoeur).
Un peu pareil pour moi, du coup j'aurais tendance à charger tout le contenu de la base de données dans une collection et faire du Linq dessus après.
0
cs_jolicoeur79 Messages postés 62 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 1
12 févr. 2017 à 01:55
salut cs_JMO et merci pour ton aide mais est qu'on peut adapter ce code en Visual basic 6
sachant que j ai fait des recherche dans le net et j ai trouver cette fonction
 Public Function RecupParticipant(projet As Long) As String
Dim res As DAO.Recordset
Dim SQL As String
'Selectionne les participant du projet
SQL = "SELECT nclient FROM client_facture WHERE nfacture =" & projet
Set res = CurrentDb.OpenRecordset(SQL)
'Concatene les différents enregistrement
While Not res.EOF
RecupParticipant = RecupParticipant & res.Fields(0).Value & " "
res.MoveNext
Wend
'Enleve le dernier espace
RecupParticipant = Left(RecupParticipant, Len(RecupParticipant) - 1)
'libere la mémoire
Set res = Nothing
End Function

il me signale un error 3085 fonction RecupParticipant non définie dans l'expression lorsque je clique sur boutton imprimer
Private Sub Command1_Click()
Dim db As Database
Dim rs As DAO.Recordset
Dim SQL As String
Set db = OpenDatabase("C:\facture.mdb")
SQL = "SELECT nclient,nomclient,RecupParticipant(nfacture),sum(montantfacture) FROM client_facture group by nclient,nomclient"
Set rs = db.OpenRecordset(SQL)

et merci merci infiniment
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
12 févr. 2017 à 02:31
bonsoir cs_jolicoeur79
Pour enlever les espaces tu as la fonction Trim de VB 6 qui enlève les espaces à gauche et à droite dans une chaine de caractères ainsi que LTrim pour seulement à gauche et RTrim pour uniquement à droite)

Pour le reste désolé de ne pas pouvoir t'aider : VB 6 est bien vieux pour moi ( je ne l'utilise plus depuis pas mal de temps) et les bases de données ne sont pas mon fort !
bon courage
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 févr. 2017 à 08:24
Bonjour,
Comment veux-tu que soit comprise cette ligne :
SQL = "SELECT nclient,nomclient,RecupParticipant(nfacture),sum(montantfacture) FROM client_facture group by nclient,nomclient"

alors que RecupParticipant a été construite par concaténation de champs séparés par des " " ?
RecupParticipant(nfacture) n'aurait de sens que si (à la fois) :
- RecupParticipant était une matrice
- nfacture était un index
- RecupParticipant(nfacture) était le nom d'un champ de la base de données
- tant la portée de la matrice que celle de l'index étaient telles qu'accessible lors de l'exécution de cette ligne de code.
Je ne vois dans ces conditions même pas comment (à quoi, d'ailleurs) t'aider
0
Rejoignez-nous