Probleme lors de l'enregistrement sur base access

Signaler
-
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
-
j'ai appliqué le tutoriel n°1133, qui est très bien fait, mais j'ai ce problème dans le code du boutton "save":

"La résolution de surcharge a échoué, car aucun 'Update' accessible n'accepte ce nombre d'arguments."

Que dois je faire? (voir code ci-dessous ligne en orange)

Merci de me filer un coup de pouce!!!!

Public Class Form1

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

Me.REBUTTableAdapter.Fill(Me.VoirieDataSet.REBUT)
Me.ActionsTableAdapter.Fill(Me.VoirieDataSet.actions)
Me.ReferenceTableAdapter.Fill(Me.VoirieDataSet.reference)

filtre.SelectedIndex = 0
Call RefreshDataSource()

OK.Visible = True
warning.Visible = False
Label1.Visible = False
Label2.Visible = False
Label3.Visible = True

End Sub

Private Sub RefreshDataSource()

Me.REBUTTableAdapter.Fill(Me.VoirieDataSet.REBUT)
Me.ActionsTableAdapter.Fill(Me.VoirieDataSet.actions)
Me.ReferenceTableAdapter.Fill(Me.VoirieDataSet.reference)

End Sub



Private Sub attente_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles attente.CheckedChanged
If attente.Checked = True Then
warning.Visible = True
OK.Visible = False
Label2.Visible = True
Label1.Visible = False
Label3.Visible = False
End If
If attente.Checked = False Then
warning.Visible = False
OK.Visible = True
Label2.Visible = False
Label1.Visible = False
Label3.Visible = True
End If

End Sub

Private Sub encours_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles encours.CheckedChanged
If encours.Checked = True Then
warning.Visible = True
OK.Visible = False
Label1.Visible = True
Label2.Visible = False
Label3.Visible = False
End If
If encours.Checked = False Then
warning.Visible = False
OK.Visible = True
Label1.Visible = False
Label2.Visible = False
Label3.Visible = True
End If

End Sub

Private Sub resolu_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles resolu.CheckedChanged
If resolu.Checked = True Then
OK.Visible = True
warning.Visible = False
Label1.Visible = False
Label2.Visible = False
Label3.Visible = True
End If

If resolu.Checked = False Then
OK.Visible = False
Label3.Visible = False
End If

End Sub

Private Sub Filtre_Change() Handles searcharg.TextChanged, filtre.SelectedIndexChanged

Dim FilterArgs As String = filtre.Text & " LIKE '" & searcharg.Text & "%'"
ReferenceBindingSource.Filter = FilterArgs

End Sub

Private Sub DGV2_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV2.CellContentClick
btn_del.Enabled = (DGV2.RowCount <> 0)
btn_save.Enabled = (DGV2.RowCount <> 0)
End Sub

Private Sub DGV1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV1.CellContentClick
btn_del.Enabled = (DGV1.RowCount <> 0)
btn_save.Enabled = (DGV1.RowCount <> 0)
End Sub

Private Sub DGV3_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV3.CellContentClick
btn_del.Enabled = (DGV3.RowCount <> 0)
btn_save.Enabled = (DGV3.RowCount <> 0)
End Sub

Private Sub btn_save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_save.Click
Dim haserror As Boolean = False
EP.Clear()

If produit.Text.Length = 0 Then
EP.SetError(produit, "le champ "" Produit"" doit être renseigné! ")
haserror = True
End If

If type.Text.Length = 0 Then
EP.SetError(type, "le champ "" type"" doit être renseigné!")
haserror = True
End If

If haserror Then
Exit Sub
End If

Dim index As Guid = CType(DGV1.SelectedRows(0).Cells(0).Value, Guid)

Try
Dim Nbline As Integer = ReferenceTableAdapter.Update(produit.Text, type.Text, poids.Text, classe.Text, revetement.Text, information.Text, index)

If Nbline > 0 Then
MessageBox.Show("Le produit a bien été enregistré" & "dans la base de données", "mise à jour de la base", MessageBoxButtons.OK, MessageBoxIcon.Information)
Call RefreshDataSource()
End If
Catch ex As Exception
MessageBox.Show("erreur - accès BD" & Environment.NewLine & "detail de l'erreur:" & ex.Message, "Echec accès BD!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try

End Sub
End Class

33 réponses

Messages postés
14828
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 novembre 2021
157
Bonjour,

As-tu regardé l'aide de la fonction incriminée ?

{Point 2}

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
cela vient peut être du fait que j'utilise une base access alors que le tutoriel se utilise une base interne à VB???
seul le travail rien que le travail

Pensez à régler le problème de l'option explicite
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
@lolokes>

Comme je te l'ai dit en MP c'est surement un problème de requête SQL. Le problème c'est que dans mon tuto je modifi les requêtes SQL, en as-tu fais de même ?

Les requêtes SQL se font via des assistants (celui du DataSet fortement typé) et ne sont pas visibles dans la partie code. Je ne peux donc pas faire grand chose car je ne connais pas la structure de ta base.


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
j'ai essayé de modifier la requete comme tu l'as fait en sql, mais ça n'a rien fait. En plus elle ne se présente pas pareil, donc je ne sais pas si il ne faut pas la modifier autrement...
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
OK mais t'as mis quoi au juste ? Parce que sans structure de la table et sans requête je ne peux pas deviner et donc je ne peux rien pour toi.


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Qui plus est : Si je fais rennomer les requêtes SQL dans le tuto c'est pour éviter de se retrouver avec des p1, p2, p3... dans les procédures VB. Du coup si tu as modifé ta requête UPDATE, tu dois avoir remplacé tes paramètres @p1, @p2... par les noms des tes colonnes ?

Dim Nbline As Integer = ReferenceTableAdapter.Update(produit.Text, type.Text, poids.Text, classe.Text, revetement.Text, information.Text, index) 


Je vois dans ton code, au niveau de la procédure Update que tu as bien remplacé tes champs tu ne les a pas mis par hasard ? tu as bien suivis l'intellisense ?


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Voilà la forme de la requete avant modification par exemple pour le delete...

DELETE FROM reference
WHERE ([INDEX] = ?) AND (? = 1 AND PRODUIT IS NULL OR
PRODUIT ?) AND (? 1 AND TYPE IS NULL OR
TYPE ?) AND (? 1 AND CLASSE IS NULL OR
CLASSE ?) AND (? 1 AND POIDS IS NULL OR
POIDS ?) AND (? 1 AND REVETEMENT IS NULL OR
REVETEMENT ?) AND (? 1 AND INFORMATION IS NULL OR
INFORMATION ?) AND (? 1 AND LIGNE IS NULL OR
LIGNE ?) AND (? 1 AND QUANTITE IS NULL OR
QUANTITE ?) AND (? 1 AND GRAPPE IS NULL OR
GRAPPE ?) AND (? 1 AND COMMENTAIRE IS NULL OR
COMMENTAIRE = ?)
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Ok mais quel est le rapport avec UPDATE ? Tu veux pas plutôt me donner ta requête update ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
voilà la requête UPDATE
Mais ,je me suis mal exprimé, toute la requête ne fonctionne pas...
en fait il doit y avoir un truc, je sais pas quoi qui bloque (j'ai renomé le "ID" de ton tuto en "index", mais je crois pas que ce soit ça???)

UPDATE reference
SET PRODUIT ?, TYPE ?, CLASSE = ?, POIDS = ?, REVETEMENT = ?, INFORMATION = ?, LIGNE = ?, QUANTITE = ?, GRAPPE = ?,
COMMENTAIRE = ?
WHERE ([INDEX] = ?) AND (? = 1 AND PRODUIT IS NULL OR
PRODUIT ?) AND (? 1 AND TYPE IS NULL OR
TYPE ?) AND (? 1 AND CLASSE IS NULL OR
CLASSE ?) AND (? 1 AND POIDS IS NULL OR
POIDS ?) AND (? 1 AND REVETEMENT IS NULL OR
REVETEMENT ?) AND (? 1 AND INFORMATION IS NULL OR
INFORMATION ?) AND (? 1 AND LIGNE IS NULL OR
LIGNE ?) AND (? 1 AND QUANTITE IS NULL OR
QUANTITE ?) AND (? 1 AND GRAPPE IS NULL OR
GRAPPE ?) AND (? 1 AND COMMENTAIRE IS NULL OR
COMMENTAIRE = ?)
par exemple, dans la fonction delete: il bloque sur la ligne suivante...

Dim NbLine As Integer = ReferenceTableAdapter.Delete(index)
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Effectivement non, renommer le champ n'a pas d’importance. Sauf que la tu as donner un nom (Index) utilisé par le langage SQL. Du coup chaque fois que tu fera référence à cette colonne elle devra se trouver entre crochet [] pour être échappée. C'est comme nommer une variable "if" en VB.

Aussi je constate que tu n'as pas modifié les requêtes comme je l'ai fait dans mon tuto. Lorsque je t'ai dis de le relire tu m'a affirmé l'avoir relus plusieurs fois. Si tu l'avait vraiment lu je pense que tu aurais tout de même fait attention aux modifications apportées pour les requêtes SQL qui concernent quand même une bonne partie du tuto.

UPDATE reference
SET PRODUIT ?, TYPE ?, CLASSE = ?, POIDS = ?, REVETEMENT = ?, INFORMATION = ?, LIGNE = ?, QUANTITE = ?, GRAPPE = ?,
COMMENTAIRE = ?
WHERE ([INDEX] = ?) AND (? = 1 AND PRODUIT IS NULL OR
PRODUIT ?) AND (? 1 AND TYPE IS NULL OR
TYPE ?) AND (? 1 AND CLASSE IS NULL OR
CLASSE ?) AND (? 1 AND POIDS IS NULL OR
POIDS ?) AND (? 1 AND REVETEMENT IS NULL OR
REVETEMENT ?) AND (? 1 AND INFORMATION IS NULL OR
INFORMATION ?) AND (? 1 AND LIGNE IS NULL OR
LIGNE ?) AND (? 1 AND QUANTITE IS NULL OR
QUANTITE ?) AND (? 1 AND GRAPPE IS NULL OR
GRAPPE ?) AND (? 1 AND COMMENTAIRE IS NULL OR
COMMENTAIRE = ?)

Si tu as bien défini la colonne INDEX en tant que clé primaire de ta table alors il n'est pas utile d'identifier la ligne par toutes ses colonnes. L'identifier via la clé primaire est amplement suffisant car elle est unique. Tu n'as donc aucun risque de te tromper. En suite il te faut remplacer les ? par les noms de colonnes. Je ne sais pas si ADO.Net autorise les @Var pour accès mais je suppose que oui. Ce remplacement a pour seul but de renommer les champs dans la saisie semi-automatique de VS (l'Intellisense), ainsi lorsque tu appelle ta méthode update, tu peux voir les noms des champs.

UPDATE reference 
SET PRODUIT @PRODUIT, TYPE @TYPE, [etc...]
WHERE ([INDEX] = @Index)


Voilà, normalement ça devrait fonctionner avec un truc dans le genre.

Visual Studio est bien gentil car il génère du code pour aider le développeur à être plus productif. Mais ce code SQL est un code de base et l'IDE ne peut absolument pas deviner les besoins du développeur. C'est pour cette raison qu'étudier le Transact-SQL un minima est important car VS ne peut pas tout faire à notre place, même s'il en fait déjà beaucoup.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Si je l'avais fais, mais à chaque fois je reviens à ma situation initiale pour ne pas "m'enfoncer"... tu comprends, comme ça je suis quitte de faire des modifs et de ne plus savoir quoi par la suite...

Alors OK, je vais voir comme tu as dis... et je te tiens au courant???

Merci
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
OK je comprends mieux pourquoi.

Oui tiens nous informé. D'ailleurs si ça fonctionne je te suggère de poster ta requête ici et de marqué le sujet comme résolu (Bouton "réponse acceptée"). Ainsi ceux qui tomberont ici un jour profiteront de ton expérience sans avoir à reposer la même question.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
pour le moment, ça ne marche pas, voilà ce que j'ai fait...

DELETE FROM reference
WHERE ([INDEX] = [INDEX])
(j'ai pas mis @ devant sinon quand j'execute la requete il me met une erreur et comme ça ça va... ???)

ensuite la requete UPDATE, ne fonctionne que comme ça (avec les @ ça va pas non plus)

UPDATE reference
SET PRODUIT PRODUIT, TYPE TYPE, CLASSE = CLASSE, POIDS = POIDS, REVETEMENT = REVETEMENT, INFORMATION = INFORMATION,
LIGNE LIGNE, QUANTITE QUANTITE, GRAPPE = GRAPPE, COMMENTAIRE = COMMENTAIRE
WHERE ([INDEX] = [INDEX])

Cependant, il y a toujours l'erreur dans le code...
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Heu... Je doute fort que ça fonctionne.

Comment VS peut-il savoir si tu parle de ta variable ou de ta colonne ???

WHERE ([INDEX] = [INDEX]) 


Laquelle correspond à la variable transmise à Delete et laquelle au nom de la colonne à mettre à jour ???

À mon avis c'est le transact qui diffère. Comme je te l'ai expliqué plus haut, virer les ? sert à voir les noms des champs dans les procédures VB c'est tout. Donc si les ? via Accès te marquent les noms des champs les modifier ne te sers à rien. Il faut les laisser et on gagne même du temps par rapport au MS SQL du coup car le renommage est inutile. Seul la modification de la clause WHERE reste à faire.

Si tu mets en requête delete :

DELETE FROM reference
WHERE ([INDEX] = ?) 


Que vois-tu lorsque dans ton code tu saisie :

Dim NbLine As Integer = ReferenceTableAdapter.Delete(


Qu'est-ce que intellisense te marque ?


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
il me met ça:

Value of type 'System.Guid' cannot be converted to 'Integer'.
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
J'ai du mal m'exprimer.

En fait je voulais dire, lorque tu saisie, pendant la saisie.

Dim NbLine As Integer = ReferenceTableAdapter.Delete(


Si tu tape uniquement ce code cela te mettra une errer c'est forcé car la ligne n'est pas complète. Mais lorsque tu saisi ton code sous VB, celui-ci te propose des choses et t'indique les types des paramètres à saisir. T'indique-t-il que le paramètre s'appel INDEX et que son type est GUID ?




Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
dans ce ces, il met ça:

delete (Index As Integer) As Integer




si je continue, que je commence à taper index sans le [ il met:

dim index as System Guid



Et si je le tape avec [ , il met rien du tout