Erreur 6 Dépassement de Capacité

Résolu
deseye7419 Messages postés 9 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bsr à tous. Je ne suis pas doué en vba. Je suis sur un projet de gestion de stock. Un truc certainement bénigne me donne de la migraine depuis deux jours. Il s'agit de l'Erreur 6. Si quelqu'un peut m'aider.
Alors je dois ajouter de nouvelles quantités sur des anciennes à des prix d'achats différents ou identiques. Il faut donc trouver un Coût Moyen Pondéré(CUMP) pour le nouveau prix de vente. Pour ce faire, j'ai déclaré deux(2) fonctions dans un module comme suit:
====== ' Coût Unitaire Moyen Pondéré(CUMP)=======
Public Function Cump(idProduit As Integer, QteEntree As Integer, PrixEntree As Single) As Single
Dim QteStockInit As Integer
Dim PrixStockInit As Integer
Dim valCump As Single
QteStockInit = Nz(DLookup("QteStock", "Produits", "idProduit=" & idProduit), 0)
PrixStockInit = Nz(DLookup("PrixUnitaire", "Produits", "idProduit=" & idProduit), 0)
valCump = (QteStockInit * PrixStockInit + QteEntree * PrixEntree) / (QteEntree + QteStockInit)
Cump = Round(valCump, 2)
End Function
======= ' Update PrixUnitaire après chaque nouvelle quantité entrée=======
Public Function UpdatePrixUnitaireCump(idProduit As Integer, Cump As Single)
Dim db As Database
Set db = CurrentDb
Dim req As String
req = "UPDATE Produits set PrixUnitaire= " & Replace(Cump, ",", ".") & _
"WHERE idProduit=" & idProduit
db.Execute req
db.Close
Set db = Nothing
End Function

Sur le formulaire, pour le bouton Valider j'ai ce code suivant

Private Sub btnValiderQte_Click()
Dim idProduit As Integer
Dim PrixUnitaire As Single
idProduit = Int(Form_F_ListProduit.idProduit)
If IsNumeric(Me.txtQte) And IsDate(txtDateEntree) And IsNumeric(txtPrixUnitaire) Then
Dim valCump As Single
valCump = Cump(idProduit, Me.txtQte, Me.txtPrixUnitaire)
Dim res As Boolean
res = UpdatePrixUnitaireCump(idProduit, valCump)

res = UpdateProduit(idProduit, Int(Me.txtQte), "+")
Dim mvt As Mouvement
Set mvt = New Mouvement
mvt.DateMov = txtDateEntree
mvt.idCommande = 0
mvt.idProduit = idProduit
mvt.PrixUnitaire = PrixUnitaire
mvt.QteCommande = Int(Me.txtQte)
mvt.TypeMov = "Entrée"
res = EnregistreMouvement(mvt)
Set mvt = Nothing
DoCmd.Close acForm, Me.Name
DoCmd.Requery
End If
End Sub
Quand je valide j'ai le message suivante: erreur d'exécution "6" dépassement de capacité . Et quand debogue il m'envoie sur la ligne suivante: valCump = (QteStockInit * PrixStockInit + QteEntree * PrixEntree) / (QteEntree + QteStockInit) de la fonction de coût pondéré du module

5 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Quand vous avez l'erreur, click sur debugage, passez le curseur souris sur vos variables pour voir leur contenu
    Si pas possible, faite un debug.print des variables et ouvrez la fenetre d'execution pour voir le dit contenu
    0
    1. deseye7419 Messages postés 9 Statut Membre
       
      Mer ci pourta promptitude. Je vais le faire et revenir
      0
    2. deseye7419 Messages postés 9 Statut Membre
       
      Bjr.
      Quand je passe le curseur de la souris sur les variables , leur contenu est juste sauf Cumpp et valCmp qui affichent 0(zéro)
      0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    je suppose que le calcul dépasse, un moment, la valeur maximum d'un entier.
    tu peux convertir un entier en single ainsi:
    valCump = (csng(QteStockInit) * PrixStockInit + QteEntree * PrixEntree) / (QteEntree + QteStockInit)
    
    sans doute utile à faire pour tous les entiers intervenant dans le calcul.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      plus simple, peut-être:
      déclarer
      QteStockInit
      et
      PrixStockInit
      comme
      single
      .

      et, peut-être, utiliser
      long
      au lieu de
      integer
      .
      0
    2. deseye7419 Messages postés 9 Statut Membre
       
      Salut frère. Lorsque je fais cela, il me renvoie l'erreur 3075 "erreur de syntaxe(opérateur absent)dans l'expression 8519.23 WHERE idproduit=20.
      En effet 8519.23 est le résultat correct .
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > deseye7419 Messages postés 9 Statut Membre
         
        Peut-être as-tu fait ceci et pas cela?
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > deseye7419 Messages postés 9 Statut Membre
         
        as-tu essayé de remplacer
        Replace(Cump, ",", ".")
        par
        cstr(Cump)
        ?

        il est utile, quand tu modifies ton code, de nous montrer ce que tu as fait.
        0
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        peut-être, d'abord, remplacer
        "WHERE idProduit="
        par
        " WHERE idProduit= "
        .
        0
  3. Tessel75
     
    Tu écris ; "Et quand debogue il m'envoie sur la ligne suivante: valCump = (QteStockInit * PrixStockInit + QteEntree * PrixEntree) / (QteEntree + QteStockInit) de la fonction de coût pondéré du module "

    C'est ta formule qui est mauvaise. Il faut écrire :

    ( (QteStockInit * PrixStockInit) + (QteEntree * PrixEntree) ) / (QteEntree + QteStockInit)

    Autrement dit, ( Somme de la Valeur du stock Initial et de la Valeur des Entrées ) divisée par Somme du stock Initial et des quantités entrantes

    Bien à toi
    0
  4. Tessel75
     
    Mettre des parenthèses dans les opérations selon la bonne vieille méthode que j'ai apprise dans les années 60 est encore la meilleure pour éviter les erreurs et éviter les mauvaises surprises, et savoir exactement ce qui se passe quand la machine (ordinateur ou calculette) travaille
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. deseye7419 Messages postés 9 Statut Membre
     
    Merci Tessla. J'ai essayé les parenthèses, toujours même résultat de dépassement. Maintenant, entre les 2 premières parenthèses c'est un trait d'union (-) ou un under-score(_)?
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Il ne faut rien mettre entre les deux premières parenthèses.
      L'ajout de parenthèses permet uniquement de clarifier le code, il ne change rien au programme.
      0
    2. Tessel75
       
      Non! C'est une faute de frappe, que je n'avais pas repérée. Comme dit Yg_Be, il ne faut rien mettre entre les 2 parenthèses qui se suivent.
      Pour ce qui est du dépassement, il te faut un espion. Tu peux aussi, faire un pas à pas en regardant à chaque étape du programme quelles sont les valeurs de chacun de tes paramètres, il suffit de passer ton pointeur devant le paramètre en question, et la valeur du paramètre à ce moment du déroulement apparait en surbrillance. Mais de tout façon, c'est au moment où il a besoin d'effectuer l'opération dite qu'il ne peut plus opérer.

      Bon courage.
      0
    3. Deseye7419 > Tessel75
       
      Bjr Tessel75. Merci. J'ai essayé mais cela me renvoie à l'erreur 3075. Erreur de syntaxe (Opérateur absent) dans l'expression <<8519,23 WAHERE idProduit=20.
      8519,23 est le résultat et 20 est id du produit
      Au débogage il me renvoie sur db.execute req de la requête req= "Update Produits SET prix unitaire= " & Replace (Cumpp, ",","." & _
      WHERE idProduit=" & idProduit.
      Je suis entrain de voir au niveau des variables. Soit en long, double...
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Deseye7419
       
      Pas un soucis avec tes variables, c'est un soucis avec ta requête SQL.
      0
    5. Deseye7419 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Salut Big
      Certes en retranscrivent ici la requête il y a eu des fautes. Mais dans la base voici comment elle écrite. req= "UpdateProduits SET prixUnitaire= " & Replace (Cump, ",","." & _
      WHERE idProduit=" & idProduit.
      Alors comment corriger cette requête ?
      0