VBA recordset

Bonjour,

voila j'utilise une requête ajouter une taille tous en comparant avec ma table s'il elle n'existe pas. J'utilise donc un recordset, le problème est qu'il me met l'erreur 3021 "Il n'y a pas d'enregistrement en cours" et je ne comprends pas pk.

Voici mon code :

Dim RST1 As Recordset
Set RST1 = CurrentDb.OpenRecordset("select * from TAILLE where code_taille = ' " & Me.new_taille & " '")

If RST1.RecordCount <> 0 Then
    MsgBox ("Cette taille existe déjà")

End If
RST1.MoveFirst

    
    ' Execution de la requete
DoCmd.RunSQL "INSERT INTO TAILLE (code_taille) VALUES ('" & new_taille.Text & " ') "
MsgBox ("La taille à été ajouter avec succès")


5 réponses

  1. un petit bump pour essayer de m'aider :(
    0
    1. Bonjour,

      Voilà un exemple :

      Dim db As DAO.Database
      Dim rs As DAO.Recordset
      Dim query As String
      
          Set db = CurrentDb
          query = ""select * from TAILLE where code_taille = ' " & Me.new_taille & " '")
              
          Set rs = db.OpenRecordset(query)
          
          If rs.RecordCount <> 0 Then
              MsgBox "Cet enregistrement existe déjà !!!"
          Else
              With rs
                  .AddNew
                  .Fields("code_taille") =  Me.new_taille
                  .Update
              End With
              rs.Close
              db.Close
              Set rs = Nothing
              Set db = Nothing
              MsgBox ("La taille à été ajouter avec succès")
          End If
      


      Bon courage.

      ;o)
      0
      1. Modérateur
        Salut,

        plutôt que de faire un recordset pour compter le nombre d'occurrences, fais un dlookup, ça va beaucoup plus vite...
        0
        1. En faites je suis en stage, et on me demande de le faire avec un recordset pour voir les différente manière. Mais je t'avouerai que je ne comprends pas pourquoi on me demande ça si tu dit qu'avec un dlookup ca va beaucoup plus vite.
          0
      2. Merci pour ta réponse Polux31. Ca fonctionne en partie, je m'explique.
        Quand je rentre une taille non existante, tous marche impeccablement.
        Cependant quand je rentre une taille déja existante ca me met une erreur (erreur 3022) en disant qu'il ne peux pas faire de modification car il y aurai un risque de doublon.
        Mais en faites j'ai l'impression qu'il ne rentre meme pas dans la boucle du IF (c'est à dire ici :
        If rs.RecordCount <> 0 Then
                MsgBox "Cet enregistrement existe déjà !!!"
            Else

        Quand je fait un debog, ca me surligne le .Update
        0
        1. Ajoute un Exit Sub (ou Function) après le msgbox.

          C'est étrange parce que je viens de faire un test et je n'ai pas ton message d'erreur.

          En fait j'ai fait ça de tête mais la bonne façon de faire serait plutôt :

          Sub AjoutTaille()
          Dim db As DAO.Database
          Dim rs As DAO.Recordset
          Dim query As String
          
              Set db = CurrentDb
              query = ""select * from TAILLE where code_taille = ' " & Me.new_taille & " '")
                  
              Set rs = db.OpenRecordset(query)
              
              If rs.RecordCount <> 0 Then
                  MsgBox "Cet enregistrement existe déjà !!!"
              Else
                  With rs
                      .AddNew
                      .Fields("code_taille") =  Me.new_taille
                      .Update
                  End With
                   MsgBox ("La taille à été ajouter avec succès")
              End If
          
              rs.Close
              db.Close
              Set rs = Nothing
               Set db = Nothing
                 
          End Sub
          0
      3. Toujours le même message d'erreur. Peut etre un problème au niveau de ma table mais ca me paratrer bizzarre.
        Voici ma table :

        table TAILLE avec un champ qui est code_taille qui est clé primaire et son type est de type texte.
        0
        1. Modérateur
          Essaye ça :

          if not isnull(dlookup("code_taille","taille","code_taille = " & me.new_taille)) then
          msgbox "taile existante
          else
          'ajout ligne
          end if

          Par contre, ton recordset tel que décrit actuellement ne te permettra pas de faire une insertion de ligne. Il faut le traiter en type table.

          Set rs = CurrentDb.OpenRecordset("TAILLE", dbOpenTable)
          0
        2. Opération annulé en signalant la ligne du if notisnull :(
          0
        3. Modérateur
          j'ai pas fait attention, mais si code_taille est alphanum, il faut l'enquoter :

          if not isnull(dlookup("code_taille","taille","code_taille = '" & me.new_taille & "'"))
          0
        4. Effectivement ça marche maintenant, c'est vrai que j'ai du mal a enquoter tous :/

          Juste une dernière petite indication si tu sais (je demande pas la solution) :

          Dans mon formulaire d'ajout, j'ai aussi une listbox avec la table table. et j'aimerai que quand j'appuis sur le bouton Ajouter (que je viens de faire grace a votre aide), la listBox ce mette a jour. Car je suis obligé une fois une taille ajouter, de quitter puis de rouvrir pour voir la mise a jour.

          Faut il faire une requête update ou autre ?
          0
        5. Modérateur
          listbox.requery ???
          0