IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Code VBA qui fonctionne bien pour un INSERT mais pas plusieurs en même temps [AC-2019]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 279
    Par défaut Code VBA qui fonctionne bien pour un INSERT mais pas plusieurs en même temps
    Bonjour,

    Je viens vous voir car je viens de voir qu'il y avais un problème sur mon application, je vais déjà vous mettre mon code puis je vous expliquerai.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    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
    Pour vous expliquer lorsque que je clique sur le bouton Exporter (le code de ce couton ci-dessus) je découpe des champs (NumArticle) afin de n'avoir que certaine partie comme Longueur,RefLaq ...
    Seul problème sur ces deux champs au moment de les exporter lorsque je les sélectionne tous, Longueur et RefLaq sont tous identique par rapport au premier enregistrement (voir capture) alors que ce n'est pas censé être du tout le cas.
    Alors que si je fais un par un cela fonctionne correctement et je n'ai pas de problème sur ces deux champs.

    J'ai comme l'impression que lorsque je sélectionne tous les enregistrement et que j'exporte, il ne découpe les champs que sur le premier et applique ces même valeurs à tous les enregistrements
    Nom : aaaaa.JPG
Affichages : 203
Taille : 74,2 Ko
    Je pense que je peux résumé le problème comme cela --> La requête Update s'effectue une fois pour le premier enregistrement puis copie avec les suivants du fait que la valeur sois toujours dans la variable

    J'espère que vous avez compris mon problème sinon j'apporterai plus de précision.

    Cdlt

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 279
    Par défaut
    J'aurais penser à essayer de faire une boucle et a chaque fois qu'on a finit cette boucle pour un enregistrement par exemple les variables se remettent à 0 et le code se relance mais sur l'enregistrement suivant.
    Depuis tout à l'heure j'essai plein de chose en vain je n'y arrive pas pour le moment

  3. #3
    Membre Expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 887
    Par défaut
    Bonjour william.rodde,

    Il n'y a pas d'erreur dans le fonctionnement. Explication:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst = dbs.OpenRecordset(strSql, dbOpenDynaset)
    Ici vous ouvrez un "RecordSet" qui contient le nombre de lignes que vous avez cochées. Par défaut le curseur va au premier enregistrement du jeu d'enregistrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extraitD = Right(rst.Fields("NumArticle"), 6)
    Ici vous affectez une valeur à la variable extraitD qui provient de ce premier enregistrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CurrentDb.Execute "UPDATE Commande " & _
                                   "SET Commande.Laquage = '" & RefLaq & "'  Where Selection=True ;"
    Ici vous mettez à jour tous les enregistrements qui sont cochés avec la même valeur. C'est la raison pour laquelle toutes les lignes ont le même résultat.

    Pour faire ce que vous désirez il faudrait faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Commande SET Commande.Laquage = Right([NumArticle],6) Where Selection=True;
    Il n'est pas nécessaire d'ouvrir un "RecordSet" mais bien d'exécuter ce genre de requête. Toutes les lignes avec "Selection=True" seront impactées avec la valeur qui correspond à leurs lignes. À adapter a votre Bd.

    Bonne journée

  4. #4
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 288
    Par défaut
    Salut
    A tester, mais sans garantie du tout avec cette UAG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Private Sub Exporter_Click()
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset, rst1 As DAO.Recordset, rst2 As DAO.Recordset
    Dim strSql As String
     
    Set dbs = CurrentDb
     
    strSql = "SELECT * FROM Commande WHERE Selection = True "
    Set rst = dbs.OpenRecordset(strSql, dbOpenDynaset)
     
    'test = DLookup("[PoidsTH]", "base", "[Référence] = '" & extraitG & "' ")
    strSql = "SELECT * FROM base WHERE [Référence] = '" & Left(rst.Fields("NumArticle"), InStr(rst.Fields("NumArticle"), Right(rst.Fields("NumArticle"), 6)) - 1) & "'"
    Set rst1 = dbs.OpenRecordset(strSql, dbOpenDynaset)
    'test = rst1.Fields("PoidsTH")
     
    'Filière = DLookup("[Filiere]", "Feuil2", "[Référence] = '" & extraitG & "' ")
    strSql = "SELECT * FROM Feuil2 WHERE [Référence] = '" & Left(rst.Fields("NumArticle"), InStr(rst.Fields("NumArticle"), Right(rst.Fields("NumArticle"), 6)) - 1) & "'"
    Set rst2 = dbs.OpenRecordset(strSql, dbOpenDynaset)
    'filière = rst2.Fields("Filiere")
     
    dbs.Execute "UPDATE Commande SET Laquage = '" & Left(Right(rst.Fields("NumArticle"), 6), 2) & "'" _
    & " SET PoidsTH = '" & rst1.Fields("PoidsTH") & "'" _
    & " SET Ref = '" & Left(rst.Fields("NumArticle"), InStr(rst.Fields("NumArticle"), Right(rst.Fields("NumArticle"), 6)) - 1) & "'" _
    & " SET Longueur = '" & Right(rst.Fields("NumArticle"), 4) & "'" _
    & " SET NumFiliere = '" & rst2.Fields("Filiere") & "'" _
    & " WHERE Selection = True", dbFailOnError
     
    dbs.Execute "INSERT INTO EnAttPlanification(NumOrigine, Numero, NumArticle, CodeVariante, DateCommande, DateLivDemander, QteManquante, QteRestante, QtePretDepart, PoidsManquant, Observations, NomDestinataire, NumDestination, Qte, Longueur, Ref, PoidsTH, Laquage, NumFiliere)" _
            & " SELECT  NumOrigine, Numero, NumArticle, CodeVariante, DateCommande, DateLivDemander, QteManquante, QteRestante, QtePretDepart, PoidsManquant, Observations, NomDestinataire, NumDestination, Qte, Longueur, Ref, PoidsTH, Laquage, NumFiliere" _
            & " FROM Commande" _
            & " WHERE Selection = True", dbFailOnError
     
    dbs.Execute " DELETE * FROM Commande WHERE Selection = True", dbFailOnError
     
    Me.Requery
    Me.Refresh
     
    rst2.Close
    rst1.Close
    rst.Clone
    dbs.Close
    Set rst2 = Nothing
    Set rst1 = Nothing
    Set rst = Nothing
    Set dbs = Nothing
    End Sub

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 279
    Par défaut
    Salut Hyperion
    Merci pour le code ! Seulement j'ai une erreur lors de l'exécution du code:
    Nom : erreurr.JPG
Affichages : 191
Taille : 19,4 Ko
    Est ce que ce n'est pas une histoire d'apostrophe ou quoi car la syntaxe me parait bien .

    Cdlt

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    si tu veux faire un UPDATE sur plusieurs colonnes, revoie ta syntaxe : un seul SET puis des , entre les différentes colonnes à mettre à jour

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Code VBA qui fonctionne mal
    Par Eddy95500 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/07/2015, 18h10
  2. [XL-2007] code VBA qui reste actif pour d'autres fichiers
    Par calindoudou dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/02/2015, 09h19
  3. [XL-2007] Code VBA qui fonctionne sous XL 2007 mais ne fonctionne pas sous ACCESS 2003.
    Par casdidier dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 12/09/2014, 00h43
  4. code vba qui fonctionnes plus du jour au lendemain
    Par alexkickstand dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/07/2008, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo