Update dd'un dgv avec jointure

p.delbrayelle Messages postés 13 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 31 mars 2017 - 30 mars 2017 à 23:50
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 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.

7 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mars 2017 à 07:25
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é.
0
p.delbrayelle Messages postés 13 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 31 mars 2017
31 mars 2017 à 13:17
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
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mars 2017 à 13:55
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?
0
p.delbrayelle Messages postés 13 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 31 mars 2017
31 mars 2017 à 17:48
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"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mars 2017 à 18:46
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.
0
p.delbrayelle Messages postés 13 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 31 mars 2017
31 mars 2017 à 19:43
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mars 2017 à 22:12
Ha j'ai mal compris, ça je ne sais pas faire.
0
p.delbrayelle Messages postés 13 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 31 mars 2017
31 mars 2017 à 22:27
merci pour ton temps.
Bon week end
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
1 avril 2017 à 19:11
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
0
Rejoignez-nous