Code VBA qui fonctionne bien pour un UPDATE mais pasplusieur

Bonjour,

Je viens vers vous car je n'arrive pas a résoudre mon problème, enfaite pour faire simple j'ai un formulaire ou je coche les commandes que je souhaite exporter vers un autre formulaire mais avant de les exporter une requête UPDATE a lieu sur ces enregistrements précédemment coché afin d'aller chercher la valeur du champ Laquage, Ref et NumFiliere par rapport à la référence....

Le code fonctionne lorsque je coche un enregistrement et que j'exporte mais ce code ne fonctionne plus quand je coche plusieurs enregistrement car le champ Laq,Ref et NumFiliere sont tous identique car j'ai l'impression que la requête fait le même UPDATE sur tous les enregistrements coché alors que les valeurs sont à chaque fois différente.

Private Sub Exporter_Click()

Dim base As Database
Dim SQL As String
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSql As String
Dim Valeur As String
Dim test
Dim extraitD As Variant

Dim extraitG As Variant





Set base = Application.CurrentDb

                   
                   
             LongueurCh = Right([NumArticle], 4)

             
                 Set dbs = CurrentDb
 
                strSql = "SELECT * FROM Commande " _
                & " WHERE Selection = True "
 
                Set rst = dbs.OpenRecordset(strSql, dbOpenDynaset)
 
                extraitD = Right(rst.Fields("NumArticle"), 6)
                extraitG = Left(rst.Fields("NumArticle"), InStr(rst.Fields("NumArticle"), extraitD) - 1)
                 
                

                RefLaq = Left([extraitD], 2)
                'MsgBox (Laquage)
                
                               
                
                
                                    
             CurrentDb.Execute "UPDATE Commande " & _
                               "SET Commande.Laquage = '" & RefLaq & "'  Where Selection=True ;"
                               
                
             test = DLookup("[PoidsTH]", "base", "[Référence] = '" & extraitG & "' ")
 
             CurrentDb.Execute "UPDATE Commande " & _
                               "SET Commande.PoidsTH = '" & test & "' Where Selection=True ;"
           ' MsgBox (test)
            
                
              

             CurrentDb.Execute "UPDATE Commande " & _
                               "SET Commande.Ref =  '" & extraitG & "'  Where Selection=True ;"
             
             
             
             CurrentDb.Execute "UPDATE Commande " & _
                               "SET Commande.Longueur = " & LongueurCh & " Where Selection=True ;"
                               
                               
            Filière = DLookup("[Filiere]", "Feuil2", "[Référence] = '" & extraitG & "' ")
            
            CurrentDb.Execute "UPDATE Commande " & _
                              "SET Commande.NumFiliere= '" & Filière & "' Where Selection=True ;"
                              
                               
           

    
           '  CurrentDb.Execute SQL
            

            
DoCmd.RunSQL " INSERT INTO EnAttPlanification(NumOrigine,Numero,NumArticle,CodeVariante,DateCommande,DateLivDemander,QteManquante,QteRestante,QtePretDepart,PoidsManquant,Observations,NomDestinataire,NumDestination,Qte,Longueur,Ref,PoidsTH,Laquage,NumFiliere) " & _
             "SELECT   Commande.NumOrigine, Commande.Numero, Commande.NumArticle, Commande.CodeVariante, Commande.DateCommande, Commande.DateLivDemander, Commande.QteManquante, Commande.QteRestante, Commande.QtePretDepart, Commande.PoidsManquant, Commande.Observations, Commande.NomDestinataire, Commande.NumDestination, Commande.Qte, Commande.Longueur, Commande.Ref, Commande.PoidsTH, Commande.Laquage, Commande.NumFiliere  " & _
              "FROM Commande " & _
              "WHERE Selection=-1;"

DoCmd.RunSQL " DELETE FROM Commande " & _
             " WHERE Selection=-1;"
             

             

base.Close

Me.Requery
Me.Refresh



End Sub

Comme vous pouvez le voir sur la capture les enregistrements ont tous la même valeur alors que ce n'est pas censé être le cas. 

J'espère que je me suis bien exprimer, merci par avance.
Windows / Chrome 107.0.0.0

1 réponse

  1. Contributeur

    bonjour,

    peux-tu choisir le langage, "basic", quand tu partages du VBA?

    Dans le code, tu fais en effet une requête UPDATE qui affecte tous les enregistrements.

    La première chose à modifier dans ton code, c'est de faire une boucle afin de parcourir tous les enregistrements de ton recordset, et les traiter un par un. 

    0
    1. Contributeur

      La seconde chose à modifier, ce sera d'utiliser .edit et .update, au lieu de tous ces CurrentDb.Execute.

      0
    2. Contributeur
      @yg_be

      Plus ou moins ceci:

      Set rst = dbs.OpenRecordset(strSql, dbOpenDynaset)
      do while not rst.EOF 
                      rst.edit
                      extraitD = Right(rst.Fields("NumArticle"), 6)
                      extraitG = Left(rst.Fields("NumArticle"), InStr(rst.Fields("NumArticle"), extraitD) - 1)
                     RefLaq = Left([extraitD], 2)
                      rst!Laquage =  RefLaq 
                   test = DLookup("[PoidsTH]", "base", "[Référence] = '" & extraitG & "' ")
                   rst!PoidsTH =  test 
                   rst!Ref =  extraitG   
                   rst!Longueur = LongueurCh 
                  Filière = DLookup("[Filiere]", "Feuil2", "[Référence] = '" & extraitG & "' ")
                  rst!NumFiliere=  Filière 
                  rst.update
                  rst.movenext
      loop
                                    
      0