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

cs_jolicoeur79 60 Messages postés samedi 2 octobre 2004Date d'inscription 12 février 2017 Dernière intervention - 11 févr. 2017 à 01:49 - Dernière réponse : Whismeril 10556 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention
- 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
Afficher la suite 

6 réponses

Répondre au sujet
cs_JMO 1816 Messages postés jeudi 23 mai 2002Date d'inscription 7 décembre 2017 Dernière intervention - 12 févr. 2017 à 00:45
0
Utile
2
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
vb95 1387 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention - 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
Whismeril 10556 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 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.
Commenter la réponse de cs_JMO
cs_jolicoeur79 60 Messages postés samedi 2 octobre 2004Date d'inscription 12 février 2017 Dernière intervention - 12 févr. 2017 à 01:55
0
Utile
1
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
vb95 1387 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 14 décembre 2017 Dernière intervention - 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
Commenter la réponse de cs_jolicoeur79
ucfoutu 18022 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 12 févr. 2017 à 08:24
0
Utile
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
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.