basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008
-
15 avril 2007 à 17:11
hajourawm -
23 févr. 2010 à 10:51
Bonjour les amis,
je bute contre un problème que je ne comprends pas, j'ai mis sur une feuille des boutons pour ajouter des enregistrements dans une table ACCESS, mais celà m'affiche une erreur, voici mon code:
Ajouter:
Private Sub Command3_Click()
Adodc1.Recordset.AddNew
End Sub
Enregistrer:
Private Sub Command4_Click()
' Chemin complet et nom de la base
strDB = "C:\pesageo.mdb"
' Nom de la table
strTable = "Produit"
' Ouverture connexion vers la base
Set oConn = New ADODB.Connection
oConn.Provider = "Microsoft.Jet.OLEDB.4.0"
oConn.Open strDB
' Optionnel : Vide la table
'oConn.Execute "DELETE FROM " & strTable
' Ouverture recordset sur la table
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
'For i = 4 To 9 ' Début de Boucle, à partir de la ligne index 0 et ce, jusqu'à la dernière
enr1 = Text1(0).Text ' Extraction de la ligne en cours
enr2 = Text1(1).Text
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
'Next ' Fin de Boucle
If oRS.EditMode = adEditAdd Or _
oRS.EditMode = adEditInProgress Then
oRS.Update
End If
' Fermeture et libération des objets
'If oRS.State <> adStateClosed Then oRS.Close
'Set oRS = Nothing
'oConn.Close
'Set oConn = Nothing
oConn.Execute "SELECT * FROM " & strTable
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
oRS.MoveFirst
'Do While oRS.EOF = False
' List1.AddItem.Fields (1)
' oRS.MoveNext
'Loop
End Sub
l'erreur est la suivante:
L'opération doit utiliser une requête qui peut être mise à jour.
Merci les amis
A voir également:
Ajouter un enregistrement dans une table access vba
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 16 avril 2007 à 01:10
Maintenant tu ajoutes ton Adodc1 et tu le lies à ton tableau
(mais seulement à ton tableau, et pas aux textbox , hein !)
Après l' enregistrement
(ors.Update tu ajoutes la ligne
Adodc1Refresh pour réactualier ton tableau
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 15 avril 2007 à 17:41
Bonjour,
pourquoi tu testes sur EditMode alors que tu sais pertinament
que tu as utlisé AddNew ?
Fais un Update juste après
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
oRS.Upfate
l' erreur vient du fait que plus loin tu as oConn.Execute "SELECT * FROM " & strTable
alors que ta table n' a pas encore été mise à jour...
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 15 avril 2007 à 18:03
Merci pour ta réponse, voici ce qui j'ai mis:
j'ai rajouté: oRS.Update après
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
j'ai supprimer
oConn.Execute "SELECT * FROM " & strTable
mais toujours lors de l'execution, le compilateur me renvoie une erreur au nivau de cette ligne:
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 15 avril 2007 à 18:17
OK Merci:
La commande Enregistrer:
Private Sub cmdOK_Click()
Dim oConn As ADODB.Connection, oRS As ADODB.Recordset
Dim strDB As String, strTable As String
strDB = "C:\pesageo.mdb"
' Nom de la table
strTable = "connexion"
' Ouverture connexion vers la base
Set oConn = New ADODB.Connection
oConn.Provider = "Microsoft.Jet.OLEDB.4.0"
oConn.Open strDB
' Optionnel : Vide la table
'oConn.Execute "DELETE FROM " & strTable
' Ouverture recordset sur la table
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
Do While oRS.EOF = False
If oRS.Fields("Login") = Login.Text Then
'MsgBox ("Faux login!")
'Else
If oRS.Fields("Mdp") = MDP.Text Then
Form1.Show
Unload Me
End If
End If
oRS.MoveNext
'MsgBox ("Fauw mot de passe!!")
Loop
End Sub
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 15 avril 2007 à 21:06
c' est ce que je dis...:
tu as d' une part
Ajouter:
Private Sub Command3_Click()
Adodc1.Recordset.AddNew
'Quoi ?
End Sub
tu sors de ta Sub sans rien faire.
Il attend toujours un UpdateEt tu continue plus loin
avec Enregistrer en reformulant denouveau AddNew por enregistrer...
Je comprend que tu veux préparer ton Adodc à un nouvel enregistrement
mais c' est là que tu dois le faire.Ou tu fais tout d' un bloc ou rien
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 15 avril 2007 à 21:18
je sais que tu veux m'aider mais le problème est à mon niveau pour éviter les malentendus, voici mes deux commandes 'Ajouter et Enregistrer):
Private Sub Ajouter_Click()
Adodc1.Recordset.AddNew
End Sub
-----------------------------------------------------------------------------------
Private Sub Enregistrer_Click()
strDB = "C:\pesageo.mdb"
strTable = "Produit"
Set oConn = New ADODB.Connection
oConn.Provider = "Microsoft.Jet.OLEDB.4.0"
oConn.Open strDB
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
enr1 = Text1(0).Text ' Extraction de la ligne en cours
enr2 = Text1(1).Text
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
oRS.Update
If oRS.EditMode = adEditAdd Or _
oRS.EditMode = adEditInProgress Then
oRS.Update
End If
oConn.Execute "SELECT * FROM " & strTable
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
oRS.MoveFirst
End Sub
Merci de me montrer ou est ce que je dois intervenir
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 15 avril 2007 à 21:33
ce que j' essaye de te faire comprendre c' est que.
Private Sub Ajouter_Click()
'ton Adodc est lié à "Produits" qui est plus loin strTable
Adodc1.Recordset.AddNew
'Adodc attend Update
End Sub
Private Sub Enregistrer_Click()
strDB = "C:\pesageo.mdb"
strTable = "Produit"
Set oConn = New ADODB.Connection
oConn.Provider = "Microsoft.Jet.OLEDB.4.0"
oConn.Open strDB
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
tu tentes d' ouvrir strTable qui est "Produits" alors qu' elle
n' est pas encore mise à jour par l' intermédiaire de Adodc.
Soit tu utilises Adodc partout sit ORS mis pas les deux à la fois
ou bien fais un Adodc.CanceUpdte avant oRS.Open strTable,,...
et tu continues avec ORS
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 15 avril 2007 à 23:34
tu as le chois entre rien mettre ou juste cette ligne
Private Sub Ajouter_Click()
Adodc1.Recordset.AddNew
End Sub
mais continuer plus loin
Private Sub Enregistrer_Click
'le AddNew tu l' as déjà fait dans Ajouter
'il ne rte reste plus que le Update.Mais tout dépend
'> si tes TextBox sont liés
Adodc.RecordSet.Update
'> s'ils ne le sont pas
Adodc.RecordSet.Fields("code_produit") = TextBox1.Text
Adodc.RecordSet.Fields("Libellé") = TextBox2.Text
Adodc.RecordSet.Update
End Sub
2° cas si tu comptes utiliser ORS
> ne mets rien dans Ajouter
Mais dans Enregistrer tu fais
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
enr1 = Text1(0).Text ' Extraction de la ligne en cours
enr2 = Text1(1).Text
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
oRS.Update
Maintenant il ne te mettras rien sur oRS.Open strTable,...
avant le Ors.Addnew parce qu' il n' attend pa de mise à jour avec Adodc
puisqu il n' ya plus de Adodc.RecordSet.AddNew
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 16 avril 2007 à 00:30
et avec
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
enr1 = Text1(0).Text ' Extraction de la ligne en cours
enr2 = Text1(1).Text
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
oRS.Update
on ne fait que mettre à jour le premier champ et on ne rajoute aucun nouvel enregistrement!!!!
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 16 avril 2007 à 00:36
Franchement je ne vois pas...
le message parle de requête...
Quelle requête ?
strTable est une table ou une requête ?
Et à quoi est lié Adodc à une table ou à une requête ?
Quand tu utilises
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
oRS.Update
As tu supprimer
Private Sub Ajouter_Click()
<strike>Adodc1.Recordset.AddNew
</strike>End Sub
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 16 avril 2007 à 00:45
ok je vais répondre à tes questions une par une et excuses moi tu t'es mis en colère car tu vois pas d'ou sort cette erreur et c'est le cas pour moi:
strTable est une table nommée Produit
Quand j'ai utilisé ceci:
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
oRS.Update
j'ai bel et bien supprimé
Private Sub Ajouter_Click()
<strike>Adodc1.Recordset.AddNew
</strike>End Sub
et pourtant ça ne marche pas car cette méthode n'ajoute pas d'enregistrements mais modifie celui sélectionné sinon le premier enregistrement!!!
si tu veux je peux t'envoyer mon projet et tu verras par toi même.
basamir
Messages postés335Date d'inscriptionvendredi 21 octobre 2005StatutMembreDernière intervention 8 mars 2008 16 avril 2007 à 00:45
ok je vais répondre à tes questions une par une et excuses moi tu t'es mis en colère car tu vois pas d'ou sort cette erreur et c'est le cas pour moi:
strTable est une table nommée Produit
Quand j'ai utilisé ceci:
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
oRS.Update
j'ai bel et bien supprimé
Private Sub Ajouter_Click()
<strike>Adodc1.Recordset.AddNew
</strike>End Sub
et pourtant ça ne marche pas car cette méthode n'ajoute pas d'enregistrements mais modifie celui sélectionné sinon le premier enregistrement!!!
si tu veux je peux t'envoyer mon projet et tu verras par toi même.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 16 avril 2007 à 00:52
Mais non je ne me suis pas mis en colère, arrêtes ...!
C' est l' erreur qu' on arrive pas à trouver qui m' énèrve
et ce qui m' énèrves le plus c' est ce que je n' ai pas pu t' aider...c' est tout..
Bon voilà ce que je ferais moi à ta places.
1° enlève Adodc1 de ton Formulaire
2°si tes TextBox sont liés , supprimes .DataSource et .DataField
Private Sub Ajouter_Click()
'prépares tes textbox à recevoir des données
Text1.Text=""
Text2.Text=""
End Sub
Private Sub Enregistrer_Click()
Set oRS = New ADODB.Recordset
oRS.CursorLocation = adUseClient
oRS.Open strTable, oConn, adOpenDynamic, adLockOptimistic, adCmdTable
enr1 = Text1(0).Text ' Extraction de la ligne en cours
enr2 = Text1(1).Text
oRS.AddNew
oRS.Fields("code_produit") = enr1 ' remplacer Champ1 par le vrai nom du champ
oRS.Fields("Libellé") = enr2
oRS.Update
End Sub