Update dd'un dgv avec jointure

p.delbrayelle 14 Messages postés vendredi 25 avril 2014Date d'inscription 31 mars 2017 Dernière intervention - 30 mars 2017 à 23:50 - Dernière réponse : Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention
- 1 avril 2017 à 19:11
Bonjour,
Je suis bloqué pour faire un update d'un datagridview vers une table access.

J'ai trouvé plusieurs fois ce problème sur internet sans réussir à faire la liaison avec mon cas. Du coup je mets plusieurs tableau qui résume bien mon exemple.

Table : Clients
ID_CLIENT NOM
1 NOM1
2 NOM2
3 NOM3


Tables : Offres
ID_OFFRE ID ID_CLIENT MONTANT
1 1 1 1000
2 1 3 2000
3 3 3 3000


Tables : Affaires

ID REFERENCE VILLE
1 REFERENCE 1 PARIS
2 REFERENCE 2 LYON
3 REFERENCE 3 MARSEILLE


DGV
ID ID_CLIENT NOM MONTANT
1 1 NOM1 1000
1 3 NOM3 3000


J'obtiens mon DGV avec :



strSql2 = "SELECT * FROM Clients Right JOIN Offres ON Clients.ID_CLIENT = Offres.ID_CLIENT where ID = " & Clé

Try
ObjetConnection.Open()
ObjetCommand = New OleDbCommand(strSql2)
ObjetDataAdapter2 = New OleDbDataAdapter(ObjetCommand)
ObjetCommand.Connection() = ObjetConnection
ObjetCB2 = New OleDbCommandBuilder(ObjetDataAdapter2)
ObjetDataAdapter2.Fill(ObjetDataSet2, "Offres")
ObjetDataTable2 = ObjetDataSet2.Tables("Offres")





et je suis bloqué pour le update avec le message d'erreur suivant :

"la génération sql dynamique n'est pas prise en charge pour plusieurs tables de la base"

merci pour votre aide.
Afficher la suite 
14Messages postés vendredi 25 avril 2014Date d'inscription 31 mars 2017 Dernière intervention

9 réponses

Répondre au sujet
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 31 mars 2017 à 07:25
0
Utile
Bonjour

les bases de données c'est pas mon truc, cependant, ton titre parle de datagridview et d'update.
Or dans le code que tu montres, il n'y a pas de datagridview, il n'y a pas de requête update (si c'est ça que tu appelles update?).
Tu ne dis même pas si la ligne qui bug est dans le code présenté.
Commenter la réponse de Whismeril
p.delbrayelle 14 Messages postés vendredi 25 avril 2014Date d'inscription 31 mars 2017 Dernière intervention - 31 mars 2017 à 13:17
0
Utile
Bonjour Whismeril,

Merci pour ta rép.

En fait je lis le datatable au dgv
            DataGridView1.DataSource = ObjetDataTable2


et pour la suite avant de modifier mon code pour rajouter la jointure je fesais :

ObjetCB2 = New OleDbCommandBuilder(ObjetDataAdapter2)
' ObjetDataAdapter2.Update(ObjetDataSet2, "Offres")
' ObjetDataSet2.Clear()
' ObjetDataAdapter2.Fill(ObjetDataSet2, "Offres")
' ObjetDataTable2 = ObjetDataSet2.Tables("Offres")
' ObjetConnection.Close()


Ce qui fonctionnait bien car j'enregistrais des doublons d'infos sur les tables

aujourd'hui j'essaie de faire avec :

 Try
ObjetConnection.Open()
Dim requete As String = "UPDATE Offres SET MONTANT = Montant where ID_OFFRE= ID_Odp"
MsgBox(requete)
Dim commande As New OleDbCommand(requete, ObjetConnection)

commande.ExecuteNonQuery()
commande.Dispose()
ObjetConnection.Close()
Catch ex As Exception
MsgBox(ex.ToString)
ObjetConnection.Close()
End Try
Commenter la réponse de p.delbrayelle
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 31 mars 2017 à 13:55
0
Utile
Ok, et t'as le messagebox dans le catch qui te mets le message.

As tu mis un point d'arrêt au début du try, puis exécuté en pas à pas pour voir où ça bug?
Commenter la réponse de Whismeril
p.delbrayelle 14 Messages postés vendredi 25 avril 2014Date d'inscription 31 mars 2017 Dernière intervention - 31 mars 2017 à 17:48
0
Utile
J'ai le bug à l'exécution de ma requête. Pour moi c'est la requete qui n'est pas bonne. J'ai lu sur d'autre site qu'il fallait faire une requete paramétrée.

Le message d'erreur est celui ci :
"la génération sql dynamique n'est pas prise en charge pour plusieurs tables de la base"
Commenter la réponse de p.delbrayelle
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 31 mars 2017 à 18:46
0
Utile
Comme je te l'ai dit plus haut les bases de données, c'est pas mon fort.

Par contre, si tu charges les 2 tables (au moins les champs utiles) dans 2 list(of) ou dataTable, je peux te faire la jointure avec Linq.
Commenter la réponse de Whismeril
p.delbrayelle 14 Messages postés vendredi 25 avril 2014Date d'inscription 31 mars 2017 Dernière intervention - 31 mars 2017 à 19:43
0
Utile
2
Quand tu dis la jointure tu parles pour charger dans le datatable ?

Parce que si c'est ca la jointure fonctionne. Ce n'est vraiment que la partie mise à jour de la bdd qui ne s'enregistre pas.
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 31 mars 2017 à 22:12
Ha j'ai mal compris, ça je ne sais pas faire.
p.delbrayelle 14 Messages postés vendredi 25 avril 2014Date d'inscription 31 mars 2017 Dernière intervention - 31 mars 2017 à 22:27
merci pour ton temps.
Bon week end
Commenter la réponse de p.delbrayelle
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 1 avril 2017 à 19:11
0
Utile
Salut, j'ai tenté un truc avec Linq (ça peut s'améliorer un peu pour savoir qui a réellement été mis à jour)

	Class Client//pas utile dans l'option 2
		Public Property ID_Client() As Integer

		Public Property Nom() As String
	End Class

	Class Offre//pas utile dans l'option 2
		Public Property ID() As Integer

		Public Property ID_Offre() As Integer

		Public Property ID_Client() As Integer

		Public Property Montant() As Double
	End Class

	Class Jointure
		Public Property ID() As Integer

		Public Property ID_Client() As Integer

		Public Property Montant() As Double

		Public Property Nom() As String
	End Class


			'pour que je puisse tester chez moi
			Dim clients As New List(Of Client)() From {
				New Client With {.ID_Client = 1, .Nom = "NOM1"},
				New Client With {.ID_Client = 2, .Nom = "NOM2"},
				New Client With {.ID_Client = 3, .Nom = "NOM3"}}

			Dim offres As New List(Of Offre)() From {
				New Offre With {.ID = 1, .ID_Offre = 1, .ID_Client = 1, .Montant = 1000},
				New Offre With {.ID = 2, .ID_Offre = 1, .ID_Client = 3, .Montant = 2000},
				New Offre With {.ID = 3, .ID_Offre = 3, .ID_Client = 3, .Montant = 3000}}
			'fin d'init chez moi

			'Option1 ici faire en sorte que clients et offres soient remplies avec les 2 tables
			Dim jointures As List(Of Jointure) = (
			    From c In clients
			    Join o In offres On c.ID_Client Equals o.ID_Client
			    Where o.ID_Offre = 1
			    Select New Jointure With {.ID = o.ID_Offre, .ID_Client = o.ID_Client, .Nom = c.Nom, .Montant = o.Montant}).ToList()

			'Option2 remplir jointures avec le résultat de ta requête. DU coup les classes Client et Offre ne te servent pas
			dataGridView1.DataSource = jointures

			'Modification des données pour le test
			jointures(0).Nom = "Nouveau nom"
			jointures(1).Montant = 9999


			'création des 2 listes de mise à jour
			Dim clientsMAJ As List(Of Client) = (
			    From j In jointures
			    Select New Client With {.ID_Client = j.ID_Client, .Nom = j.Nom}).ToList()


			Dim offresMAJ As List(Of Offre) = (
			    From j In jointures
			    Select New Offre With {.ID_Offre = j.ID, .Montant = j.Montant}).ToList()

			'TODO faire les 2 requettes Upadte


Si ça te parait utile, je peux améliorer

PS: je n'ai pas réussi, avec tes données exemple à obtenir la même jointure que toi
Commenter la réponse de Whismeril

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.