Problème d'ajout d'un enregistrement dans une table ACCESS [Résolu]

basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 15 avril 2007 à 17:11 - Dernière réponse :  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
Afficher la suite 

34 réponses

Répondre au sujet
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 16 avril 2007 à 01:10
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de chaibat05
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 15 avril 2007 à 17:41
0
Utile
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...
Commenter la réponse de chaibat05
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 15 avril 2007 à 18:03
0
Utile
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:

Adodc1.Recordset.AddNew
Commenter la réponse de basamir
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 15 avril 2007 à 18:14
0
Utile
excuses moi mais j' ai pas compris ce que tu as fait...
Mets tout le code modifié...
Commenter la réponse de chaibat05
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 15 avril 2007 à 18:17
0
Utile
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
Commenter la réponse de basamir
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 15 avril 2007 à 18:31
0
Utile
non non, on s' est mal compris...!
e parlais de la partie AddNew...
tu as dit que tu as mis Update et supprimé quelque chose

et tu parles de Adodc1.Recordset.AddNew...
c' est ce ue je n' ai pas compris...
Commenter la réponse de chaibat05
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 15 avril 2007 à 19:57
0
Utile
En fait non j'ai pas toucher la partie de AddNew par contre j'ai supprimer la requête au niveau de la commande Enregistrer
Commenter la réponse de basamir
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 15 avril 2007 à 20:06
0
Utile
Alors tu refais la même chose

c' est au niveau de la commande Enregistrer que tu dois avoir

oRS.AddNew
     oRS.Fields("code_produit") = enr1  ' remplacer Champ1 par le vrai nom du champ
     oRS.Fields("Libellé") = enr2
 ORS.Update
Commenter la réponse de chaibat05
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 15 avril 2007 à 20:58
0
Utile
c'est ce que j'ai fait, mais le compilateur me renvoie une erreur au niveau de Addnew du bouton Ajouter!!!!
Commenter la réponse de basamir
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 15 avril 2007 à 21:06
0
Utile
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
Commenter la réponse de chaibat05
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 15 avril 2007 à 21:18
0
Utile
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

Merci
Commenter la réponse de basamir
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 15 avril 2007 à 21:33
0
Utile
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
Commenter la réponse de chaibat05
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 15 avril 2007 à 21:58
0
Utile
Ok, mais jusqu'à maintenant je ne sais pas qoui mettre dans :

Private Sub Ajouter_Click()
Adodc1.Recordset.AddNew
--------------------------------
End Sub
 pour mettre à jour ma table?
Commenter la réponse de basamir
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 15 avril 2007 à 23:34
0
Utile
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
Commenter la réponse de chaibat05
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 16 avril 2007 à 00:18
0
Utile
voila j'ai mis ce code:

Adodc.RecordSet.Fields("code_produit") = TextBox1.Text 
  Adodc.RecordSet.Fields("Libellé") = TextBox2.Text
  Adodc.RecordSet.Update

mais une fois je veux enregistrer voici l'erreur qui apparait:
""l'opération doit utiliser une requête qui peut être mise à jour.""

j'ai tout fait et ça ne marche pas j'ai meme essayer le deuxième cas avec oRS le meme problème et le meme message
Commenter la réponse de basamir
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 16 avril 2007 à 00:30
0
Utile
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!!!!
Commenter la réponse de basamir
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 16 avril 2007 à 00:36
0
Utile
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

sinon je ne vois pas trop, déslé pour toi ...
Commenter la réponse de chaibat05
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 16 avril 2007 à 00:45
0
Utile
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.
Commenter la réponse de basamir
basamir 335 Messages postés vendredi 21 octobre 2005Date d'inscription 8 mars 2008 Dernière intervention - 16 avril 2007 à 00:45
0
Utile
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.
Commenter la réponse de basamir
chaibat05 1884 Messages postés samedi 1 avril 2006Date d'inscription 20 novembre 2007 Dernière intervention - 16 avril 2007 à 00:52
0
Utile
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
Commenter la réponse de chaibat05

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.

Problème d'ajout d'un enregistrement dans une table ACCESS - page 2