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 :

Mise à jour d'une table VBA


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut Mise à jour d'une table VBA
    Bonjour
    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
        Dim rs03 As DAO.Recordset
        Dim rs04 As DAO.Recordset
        Set rs03 = CurrentDb.OpenRecordset("dim_aux")
        Set rs04 = CurrentDb.OpenRecordset("Dimensions")
        rs03.MoveFirst
        While rs03.EOF() 'parcourir la table "dim_aux"
              rs04.MoveFirst 'premier enregistrement de la table "dimensions"
              While rs04.EOF()   'parcourir la table "Dimensions"
                 If (rs04![Longueur] = rs03![Dimcoupe] And rs04![Matière première] = Me.CodeMP) Then
                    rs04.Edit  'modifier la table "dimensions"
                    rs04![Quantité utilisée] = rs04![Quantité utilisée] + Me.Quantity  'calcul du cumul par MP
                    rs04.Update ' mise à jour de la table "dimensions"
                 End If
                 rs04.MoveNext 'enregistrement suivant de la table "dimensions"
              Wend
              rs03.MoveNext 'longueur suivante de la table "dim_aux"
       Wend
        rs03.Close
        rs04.Close
        Set rs03 = Nothing
        Set rs04 = Nothing
    J'ai une table nommée "dim_aux" qui contient des longueurs (numériques) constituant le champ "Dimcoupe"
    et une table nommée "Dimensions" qui contient un champ "Longueur", un champ "matière_première", un champ "Quantité utilisée" et d'autres champs qu'on n'aura pas besoin
    Moi je veux modifier le contenu de la table "dimensions" et essentiellement le champ "quantité utilisée" ainsi j'ai écrit le code ci-dessus!!
    NB: Pour chaque enregistrement de la table "dim_aux" et pour une valeur donnée de "matière première" saisie dans mon formulaire je vais modifier l'enregistrement correspond de la table "dimensions"
    Problème: Je n'ai aucun message d'erreur mais aussi la "quantité utilisée" ne sera pas modifiée dans ma table "dimensions" pourtant que j'ai mis le "Update"!!!
    Merci de m'aider à résoudre le problème c'est urgent
    While the grass grows, the steer starves

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    À l'œil ton code semble correct à part

    et

    qui vont planter si il n'y a pas de données.

    Le premier ne sert à rien et je remplacerai le second par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if rs04.recordcount<>0 then
        rs04.MoveFirst
    end if
    La seule explication logique est que (rs04![Longueur] = rs03![Dimcoupe] And rs04![Matière première] = Me.CodeMP) n'est jamais vrai.
    À mon avis c'est le = Me.CodeMP le coupable, ne devrait-il pas être = rs03![Matière première] ?

    As-tu mis un point d'arrêt sur le .update pour vérifier que tu passais bien dans la boucle interne ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Merci beaucoup pour votre réponse
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    À l'œil ton code semble correct à part

    et

    qui vont planter si il n'y a pas de données.
    En fait mes deux tables ne sont pas vides!!! (144 enregistrements dans la table "Dimensions" et 8 enregistrements dans la table "dim_aux")!!!

    La seule explication logique est que (rs04![Longueur] = rs03![Dimcoupe] And rs04![Matière première] = Me.CodeMP) n'est jamais vrai.
    En fait il existe nécessairement un enregistrement dans la table "dimensions" vérifiant la condition et il est un seul!!!

    À mon avis c'est le = Me.CodeMP le coupable, ne devrait-il pas être = rs03![Matière première] ?
    La table "dim_aux" dont réfère le recordset "rs03" contient un seul champ qui est "Dimcoupe" et qui correspond au champ "Longueur" de la table "dimensions"

    As-tu mis un point d'arrêt sur le .update pour vérifier que tu passais bien dans la boucle interne ?
    Qu'est ce que vous voulez dire par point d'arrêt??!!!

    A+
    While the grass grows, the steer starves

  4. #4
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Bah j'ai mis des messages box pour voir quelle boucle ne fonctionne pas!!! Du coup j'ai remarqué:
    cette condition n'est jamais vrais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (rs04![Longueur] = rs03![Dimcoupe] And rs04![Matière première] = Me.CodeMP) Then
    Pourtant il existe une valeur là où elle vrai!!! D'où la quantité ne se calcule pas



    Il y'a un problème quelque part dans le code mais je sais pas c quoi!!!
    While the grass grows, the steer starves

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Je pense que le problème vient de = Me.CodeMP.

    Tu n'a probablement aucun enregistrement de RS04 dont les données sont égales à la valeur du contrôle CodeMP de ton formulaire.

    Un point d'arrêt est un endroit où Access va suspendre l'exécution du code et te rendre la main.
    Tu peux alors vérifier ce qui se passe dans ton code directement.
    • Pour définir un point d'arrêt, cliquer dans la marge à gauche de la ligne voulue. Ça va afficher un gros point marron.
    • (Attention certaines lignes n'acceptent pas de point d'arrêt, si c'est le cas essaye au dessus ou en dessous.)
    • Pour continuer l'exécution, appuyer sur la touche [F5]
    • Pour passer à l'instruction suivante, appuyer sur la touche [F8]
    • Pour passer à l'instruction suivante tout en restant au même "niveau", appuyer sur les touches [Shift][F8]
    • Pour voir la valeur d'une variable ou d'un champ, pointer avec la souris dessus.


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Bonjour
    Merci Marrot c'est clair pou le point d'arrêt

    Citation Envoyé par marot_r Voir le message
    Bonjour.
    Je pense que le problème vient de = Me.CodeMP.
    Tu n'a probablement aucun enregistrement de RS04 dont les données sont égales à la valeur du contrôle CodeMP de ton formulaire.
    A+

    Mais quant à ce problème, je comprends pas!!! j'ai même essayé de mettre le Me.codeMP dans une variable mais ça ne marche pas encore!!
    La valeur existe nécessairement dans ma table je l'ai saisie déjà!!!
    La syntaxe est correcte du coup j'arrive pas à saisir la cause racine du problème
    En tout cas vous avez fait ce que vous pouvez pour m'aider merci beaucoup
    peut-être je dois penser autrement (de point de vue code)
    A+
    While the grass grows, the steer starves

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Un truc que je fais quand je ne comprends pas c'est de faire afficher ce que Access voit, et non ce que j'imagine qu'il devrait voir.

    Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    debug.print rs04![Longueur]
    debug.print rs03![Dimcoupe] 
    debug.print rs04![Matière première] 
    debug.print Me.CodeMP
     
    debug.print rs04![Longueur] = rs03![Dimcoupe] 
    debug.print rs04![Matière première] = Me.CodeMP
    Généralement la solution (ou une piste) apparaît après.

    Pour voir le résultat des debug.print, il faut activer la fenêtre d'exécution immédiate quand on est dans le code en appuyant sur les touches [Ctrl][g].

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Un truc que je fais quand je ne comprends pas c'est de faire afficher ce que Access voit, et non ce que j'imagine qu'il devrait voir.

    A+
    Super comme truc
    Bah d'après le résultat que j'ai obtenu:
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    Faux
    200
     200 
    M 5/30
    H 105 27
    Faux
    Faux
    50
     200 
    MO 30
    H 105 27
    Faux
    Faux
    60
     200 
    MO 30
    H 105 27
    Faux
    Faux
    70
     200 
    MO 30
    H 105 27
    Faux
    Faux
    80
     200 
    MO 30
    H 105 27
    Faux
    Faux
    90
     200 
    MO 30
    H 105 27
    Faux
    Faux
    100
     200 
    MO 30
    H 105 27
    Faux
    Faux
    110
     200 
    MO 30
    H 105 27
    Faux
    Faux
    120
     200 
    MO 30
    H 105 27
    Faux
    Faux
    130
     200 
    MO 30
    H 105 27
    Faux
    Faux
    140
     200 
    MO 30
    H 105 27
    Faux
    Faux
    150
     200 
    MO 30
    H 105 27
    Faux
    Faux
    160
     200 
    MO 30
    H 105 27
    Faux
    Faux
    170
     200 
    MO 30
    H 105 27
    Faux
    Faux
    180
     200 
    MO 30
    H 105 27
    Faux
    Faux
    190
     200 
    MO 30
    H 105 27
    Faux
    Faux
    200
     200 
    MO 30
    H 105 27
    Faux
    Faux
    50
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    60
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    70
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    80
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    90
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    100
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    110
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    120
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    130
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    140
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    150
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    160
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    170
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    180
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    190
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    200
     200 
    STAL PRODUC
    H 105 27
    Faux
    Faux
    Il ne teste pas les valeurs où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs03![matière première]=Me.codeMP
    pourtant il existe toute une liste vérifiant cette condition
    Moi dans l'exemple j'ai saisie le Me.codeMP=H 105 27
    Voici ma table "dimensions"
    vous pouvez voir que H 105 27 pour les différentes longueur (vous voyer bien qu'il existe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs03![matière première]=Me.codeMP
    Nom : 1.PNG
Affichages : 504
Taille : 29,4 Ko
    ça c'est la table "dim_aux" à partir de laquelle je vais tester la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs04![Longueur] = rs03![Dimcoupe]
    Nom : 2.PNG
Affichages : 456
Taille : 4,9 Ko
    Ici normalement il fera le calcul pour les enregistrements: 30,31 et 32
    While the grass grows, the steer starves

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Étrange.

    Dans la boucle rs04,juste après le while ajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if rs04![Matière première] = Me.CodeMP then
       stop
    end if
    et met un point d'arrêt sur la ligne qui contient Stop.

    Cela va arrêter l'exécution du code si ta condition est vraie.
    Pour reprendre le calcul appuyer sur [F8] ou[F5].

    Cela va permettre de voir si à un moment donnée ta condition est vérifiée.

    Sinon on pourrait être un peu plus subtile dans le parcourt des données en faisant :

    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
        Dim rs03 As DAO.Recordset
        Dim rs04 As DAO.Recordset
        dim critere04 as string
     
        Set rs03 = CurrentDb.OpenRecordset("dim_aux")
        Set rs04 = CurrentDb.OpenRecordset("Dimensions")
        rs03.MoveFirst
        While rs03.EOF() 'parcourir la table "dim_aux"
              critere04="[Longueur] = " & rs03![Dimcoupe]
              critere04=critere04 & " and [Matière première] = """ & Me.CodeMP & """"
     
              call rs04.findfisrt(critere04)
     
              do While not rs04.nomatch  'parcourir la table "Dimensions"
                    rs04.Edit  'modifier la table "dimensions"
                    rs04![Quantité utilisée] = rs04![Quantité utilisée] + Me.Quantity  'calcul du cumul par MP
                    rs04.Update ' mise à jour de la table "dimensions"
                    call rs04.FinNext
              loop
     
              rs03.MoveNext 'longueur suivante de la table "dim_aux"
       Wend
        rs03.Close
        rs04.Close
        Set rs03 = Nothing
        Set rs04 = Nothing
    Comme cela on ne va chercher que les lignes qui nous intéressent et on a plus à faire de test à chaque enregistrement.

    Et pour rendre ton code plus lisible, tu pourrais remplacer rs03 par rsDim_Aux et rs04 par rsDimension.
    Comme cela tu vois directement quelle est la tabla concernée plutôt que de devoir te référer à la ligne d'ouverture.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    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
    Dim rsDim_aux As DAO.Recordset
        Dim rsDimensions As DAO.Recordset
        Dim critere04 As String
     
        Set rsDim_aux = CurrentDb.OpenRecordset("dim_aux")
        Set rsDimensions = CurrentDb.OpenRecordset("Dimensions")
        rsDim_aux.MoveFirst
        While rsDim_aux.EOF() 'parcourir la table "dim_aux"
              critere04 = "[Longueur] = " & rsDim_aux![Dimcoupe]
              critere04 = critere04 & " and [Matière première] = """ & Me.CodeMP & """"
     
              Call rsDimensions.findfisrt(critere04)
     
              Do While Not rsDimensions.NoMatch  'parcourir la table "Dimensions"
                    rsDimensions.Edit  'modifier la table "dimensions"
                    rsDimensions![Quantité utilisée] = rsDimensions![Quantité utilisée] + Me.Quantity  'calcul du cumul par MP
                    rsDimensions.Update ' mise à jour de la table "dimensions"
                    Call rsDimensions.FinNext
              Loop
     
              rsDim_aux.MoveNext 'longueur suivante de la table "dim_aux"
       Wend
        rsDim_aux.Close
        rsDimensions.Close
        Set rsDim_aux = Nothing
        Set rsDimensions = Nothing
    J'ai remplacé mon code par ce code (que vous m'avez passé) et en exécutant voici le résultat:
    Nom : 1.PNG
Affichages : 509
Taille : 47,7 Ko
    pffffff je vous casse la tête!! je suis vraiment désolée mais je trouve pas vraiment le problème!!!
    A+
    While the grass grows, the steer starves

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Désolé

    j'ai encore inversé des lettres. Il faut taper FindFirst et non FindFisrt.

    On va sans doute quand même avoir le problème de sélection des données.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #12
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par marot_r Voir le message
    j'ai encore inversé des lettres. Il faut taper FindFirst et non FindFisrt.
    A+
    Je suppose pour cette ligne aussi on a .FindFirst au lieu de .FinFirst
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call rsDimensions.findfisrt(critere04)
    Bref je l'ai changé mais ça n'a pas résolu le problème


    Nom : 2.PNG
Affichages : 494
Taille : 47,8 Ko


    A+
    While the grass grows, the steer starves

  13. #13
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Juste un petit truc que j'ai pas compris:
    c'est quoi l'utilité de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call rsDimensions.FindNext
    en fait la valeur est unique!! et si on peut la trouver directement sans parcourir la table par le .findfirst il n'est pas nécessaire de faire une boucle!!
    A+
    While the grass grows, the steer starves

  14. #14
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Là j'ai carrément oublié un argument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call rsDimensions.FindNext(critere04)
    Cela va trouver le prochain enregistrement qui nous intéresse et seulement celui-là.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  15. #15
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Là j'ai carrément oublié un argument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call rsDimensions.FindNext(critere04)
    Cela va trouver le prochain enregistrement qui nous intéresse et seulement celui-là.

    A+
    hhhhh aucune erreur mais aucun calcul ne s'effectue!!!!!
    A+
    While the grass grows, the steer starves

  16. #16
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    J'avais manqué cela

    en fait la valeur est unique!! et si on peut la trouver directement sans parcourir la table par le .findfirst il n'est pas nécessaire de faire une boucle!!
    Le code peut être simplfié en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
              Call rsDimensions.findfisrt(critere04)
     
              if Not rsDimensions.NoMatch  then
                    rsDimensions.Edit  'modifier la table "dimensions"
                    rsDimensions![Quantité utilisée] = rsDimensions![Quantité utilisée] + Me.Quantity  'calcul du cumul par MP
                    rsDimensions.Update ' mise à jour de la table "dimensions"
              end if
    hhhhh aucune erreur mais aucun calcul ne s'effectue!!!!!
    Hélas mon code ne résolvait pas ton problème qui vient que ta condition n'est jamais vraie.
    Il était simplement plus efficace pour faire la mise à jour si il trouve l'enregistrement.

    Essaye cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              critere04 = "[Longueur] = """ & rsDim_aux![Dimcoupe] & """"
              critere04 = critere04 & " and [Matière première] = """ & Me.CodeMP & """"
    D'après ton image, [longueur] ne semble pas être un champ numérique mais un champ texte.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  17. #17
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Hélas mon code ne résolvait pas ton problème qui vient que ta condition n'est jamais vraie.
    Vous avez fait plus que attendu, vous m'avez consacré beaucoup du temps et ça qui compte pour moi même si on n'a pas trouvé la solution merci vraiment
    Si non
    D'après ton image, [longueur] ne semble pas être un champ numérique mais un champ texte.
    Longueur c'est bien numérique et son équivalent dans la table dim_aux c'est Dimcoupe!!!!
    En tout cas je sens qu'on est proche de la solution!!! il suffit qu'il n'a pas des messages d'erreur qui gènent
    A+
    While the grass grows, the steer starves

  18. #18
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Bonjour
    En fait marot_r le problème c'est de mettre While not rsDimensions.EOF au lieu de while rsDimensions.EOF
    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
        Dim rsDim_aux As DAO.Recordset
        Dim rsDimensions As DAO.Recordset
        Dim critere04 As String ' On va mettre dans lequel la "référence_dim" de la table "Dimensions"
        Set rsDim_aux = CurrentDb.OpenRecordset("dim_aux")
        Set rsDimensions = CurrentDb.OpenRecordset("Dimensions")
        rsDim_aux.MoveFirst
        While Not rsDim_aux.EOF() 'parcourir la table "dim_aux"
              critere04 = "[Longueur] = """ & rsDim_aux![Dimcoupe] & """"""
              critere04 = critere04 & " and [Matière première] = """ & Me.CodeMP & """"
              Call rsDimensions.FindFirst(critere04)
              If Not rsDimensions.NoMatch Then
                     rsDimensions.Edit   'modifier la table "dimensions"
                     rsDimensions![Quantité utilisée] = rsDimensions![Quantité utilisée] + Me.Quantity  'calcul du cumul par MP
                     rsDimensions.Update 'mise à jour de la table "dimensions"
              End If
              rsDim_aux.MoveNext 'longueur suivante de la table "dim_aux"
       Wend
       rsDim_aux.Close
       rsDimensions.Close
       Set rsDim_aux = Nothing
       Set rsDimensions = Nothing
    maintenant il peut entrer dans la boucle mais j'ai un message d'exécution 3251 qui s'affiche et en mettant débogage, le problème est dans la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call rsDimensions.FindFirst(critere04)
    J'ai mis un message box pour savoir le contenu du critere04 et c'est bien:
    [Longueur]="50" and [Matière première]="H 105 27"
    Avec 50 c'est la première valeur du champ [Dimcoupe] de la table dim_aux et "H 105 27" c'est le type de la matière première que j'ai saisie dans mon formulaire c.à.d. le Me.Code.MP
    Est ce que vous avez une idée sur ce genre de problème?
    While the grass grows, the steer starves

  19. #19
    Membre habitué Avatar de Massiliya
    Femme Profil pro
    Ingénieur en génie industriel
    Inscrit en
    Mars 2017
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur en génie industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 174
    Points : 152
    Points
    152
    Par défaut
    Bonjour
    En fait j'ai pas pris conscience que le type de [Longueur] était "texte court" alors que [Dimcoupe] est de type "numérique"
    Je les ai changé tout les deux sont numériques maintenant
    Et du coup ça marche très bien et le problème est résolu maintenant


    A+
    While the grass grows, the steer starves

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

Discussions similaires

  1. [AC-2007] Mise à jour d'une table via VBA
    Par Korleone dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/03/2014, 10h39
  2. [AC-2000] Mise à jour d'une table en VBA selon importation fichier Excel
    Par Tydher dans le forum VBA Access
    Réponses: 10
    Dernier message: 07/06/2011, 11h18
  3. Mise à jour d'une table à partir d'un formulaire en VBA
    Par jloois dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/04/2008, 14h20
  4. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  5. mise à jour d'une table d'interbase sous delphi
    Par kouraichi35 dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/10/2004, 13h09

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