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. 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)
    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...
      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.
    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
      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
    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.
      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)
      2. Opération annulé en signalant la ligne du if notisnull :(
      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 & "'"))
      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 ?
      5. Modérateur
        listbox.requery ???