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

Signaler
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008
-
 hajourawm -
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

34 réponses

Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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...
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
excuses moi mais j' ai pas compris ce que tu as fait...
Mets tout le code modifié...
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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...
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

c'est ce que j'ai fait, mais le compilateur me renvoie une erreur au niveau de Addnew du bouton Ajouter!!!!
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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?
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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!!!!
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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 ...
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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.
Messages postés
335
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2008

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.
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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