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'un champ calculé par un code 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'un champ calculé par un code VBA
    Bonjour
    J'ai déjà créé une discussion sur ce problème qui me bloque depuis une semaine mais j'ai pas trouvé la réponse!!
    En effet 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"
    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"!!!
    Pour ce faire j'ai créé un code qui semble correcte:
    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
    De même j'ai eu de l'aide pour résoudre ce problème (par marot_r ) et j'ai écrit ce code:
    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 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
    Mais ça ne marche pas aussi

    Mes tables ne sont pas vides!!!!! et la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (rs04![Longueur] = rs03![Dimcoupe] And rs04![Matière première] = Me.CodeMP) Then
    est correcte pour une seule valeur de la table "dimensions"
    Si il y'a quelqu'un qui peut m'aider à résoudre ce problème je serais vraiment reconnaissante
    While the grass grows, the steer starves

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    740
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 740
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Essaie de changer la syntaxe de tes boucles et de remplacer

    While rs0x.EOF

    par

    While Not rs0x.EOF

  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
    Citation Envoyé par accessisgood Voir le message
    Bonjour,

    Essaie de changer la syntaxe de tes boucles et de remplacer

    While rs0x.EOF par While Not rs0x.EOF
    Bonjour
    J'ai changé et voici le message d'erreur:

    Nom : 333.PNG
Affichages : 769
Taille : 24,7 Ko

    En cliquant sur "Débogage" j'obtient ça:

    Nom : FFFF.PNG
Affichages : 823
Taille : 27,6 Ko

    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 savez où est le problème?
    While the grass grows, the steer starves

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    740
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 740
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    bon, on a progresse, maintenant les enregistrements sont scrutes

    tu mentionnes
    [Longueur]="50" and [Matière première]="H 105 27"
    Est ce que la definition du champs [Longueur] est un nombre ou un texte, car si c'est un nombre il faut lui enlever les double-quote

  5. #5
    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

    En fait oui c'est un nombre!!
    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 & """"
    je l'ai remplacé par:
    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 & """"
    et donc critere04 sera
    [Longueur]=50 and [Matière première]="H 105 27"
    Mais toujours le même message d'erreur
    A+
    While the grass grows, the steer starves

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    Mais toujours le même message d'erreur
    le Call est de trop devant le rsDimensions.FindFirst
    [Modif:] en trop, mais ce n'est pas ce qui provoque l'erreur, finalement ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Par contre Dimensions semble être une table et non pas une requête. FindFirst ne fonctionne pas avec les tables mais les RecordSet, essaie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rsDimensions = Currentdb.openrecordset("select * from Dimensions",dbopenDynaset)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  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 tee_grandbois Voir le message
    Par contre Dimensions semble être une table et non pas une requête. FindFirst ne fonctionne pas avec les tables mais les RecordSet, essaie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rsDimensions = Currentdb.openrecordset("select * from Dimensions",dbopenDynaset)

    J'ai fait la modification mais bon il y'a toujours un problème!!!
    Nom : Capture.PNG
Affichages : 828
Taille : 31,3 Ko
    While the grass grows, the steer starves

  9. #9
    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
    En fait voici ce que j'obtiens en cliquant sur 'aide'
    L'expression de critère d'une méthode Find tente de comparer un champ à une valeur dont le type de données ne correspond à celui du champ.
    Moi j'ai deux champ dans le critère et non pas un seul!!!!
    While the grass grows, the steer starves

  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
    Je vous passe le code de nouveau:
    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
        Dim rsDim_aux As Recordset
        Dim rsDimensions As 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("select * from Dimensions", dbOpenDynaset)
        rsDim_aux.MoveFirst
        While Not rsDim_aux.EOF() 'parcourir la table "dim_aux"
              Debug.Print rsDim_aux![Dimcoupe]
              critere04 = "[Longueur] =" & rsDim_aux![Dimcoupe]
              critere04 = critere04 & " and [Matière première] = """ & Me.CodeMP & """"
              Debug.Print critere04
              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
    Merci d'avance
    A+
    While the grass grows, the steer starves

  11. #11
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    740
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 740
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    tu as enlevé les references a DAO ?, essaie en les remettant

  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 accessisgood Voir le message
    Bonjour,

    tu as enlevé les references a DAO ?, essaie en les remettant
    Bonjour
    Je les ai rajouté mais toujours le même message d'erreur
    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
    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("select * from Dimensions", dbOpenDynaset)
        rsDim_aux.MoveFirst
        While Not rsDim_aux.EOF() 'parcourir la table "dim_aux"
              Debug.Print rsDim_aux![Dimcoupe]
              critere04 = "[Longueur] =" & rsDim_aux![Dimcoupe]
              critere04 = critere04 & " and [Matière première] = """ & Me.CodeMP & """"
              Debug.Print critere04
              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
    Fallait-il que je vous passe le fichier???
    A+
    While the grass grows, the steer starves

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour Massiliya,

    En fait voici ce que j'obtiens en cliquant sur 'aide'
    L'expression de critère d'une méthode Find tente de comparer un champ à une valeur dont le type de données ne correspond à celui du champ.
    Moi j'ai deux champ dans le critère et non pas un seul!!!!
    l'erreur 3464 indique un problème de comparaisons de données, donc, il faut vérifier que les 4 champs concernés (les 2 champs de la table et les 2 champs du critère sont de même type.
    En gros est-ce que [Longueur] et rsDim_aux![Dimcoupe] sont de même type ainsi que [Matière première] et Me.CodeMP ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  14. #14
    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 tee_grandbois Voir le message
    Bonjour Massiliya,
    l'erreur 3464 indique un problème de comparaisons de données, donc, il faut vérifier que les 4 champs concernés (les 2 champs de la table et les 2 champs du critère sont de même type.
    En gros est-ce que [Longueur] et rsDim_aux![Dimcoupe] sont de même type ainsi que [Matière première] et Me.CodeMP ?
    Bonjour
    Vous avez raison Tee 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
    Merciiiiiiiiiii énormément


    While the grass grows, the steer starves

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

Discussions similaires

  1. [XL-2003] mise à jour automatique d'un classeur par un code vba
    Par frihat mohamed dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/09/2011, 19h10
  2. Mise à jour d'un champ calculé dans un recordset
    Par pdata dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 21/10/2009, 10h28
  3. Requete mise à jour avec un champ calculé
    Par gberthier dans le forum Requêtes et SQL.
    Réponses: 35
    Dernier message: 24/04/2008, 14h25
  4. Réponses: 2
    Dernier message: 05/02/2007, 10h19
  5. Réponses: 3
    Dernier message: 17/01/2007, 09h33

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