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

WinDev Discussion :

appliquer la remise sur les différents montants [WD18]


Sujet :

WinDev

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 53
    Points : 45
    Points
    45
    Par défaut appliquer la remise sur les différents montants
    Bonjour a tous je suis confronter a problème de remise sur vente. j'ai créé une procédure que j'ai nomme "affichetotal".
    cette procédure me calcul le total et aussi fait la remise du total de chaque produit en fonction de la valeur de la remise indiquée.
    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
     
    PROCEDURE affichetotal()
     i est un entier = 1
    SAI_netpayer = 0
    SI SAI_Remise<>0    ALORS
    	POUR i = 1  A  TableOccurrence(TABLE_produitvente)
    		//TABLE_produitvente.COL_quanité = SAI_qtité
    		TABLE_produitvente.COL_TotalPro[i] = TABLE_produitvente.COL_prixU[i]*TABLE_produitvente.COL_quanité[i]
    		SAI_netpayer += TABLE_produitvente.COL_TotalPro[i]
    		LIB_prodselect =  TABLE_produitvente.COL_Designpro[i] 
    		COL_Remise[i] = ((SAI_Remise*COL_TotalPro[i])/SAI_netpayer)
    	FIN
    	SAI_netpayer -= SAI_Remise
     
    SINON
    	 TABLE_produitvente.COL_quanité = SAI_qtité
    	 TABLE_produitvente.COL_TotalPro[i] = TABLE_produitvente.COL_prixU[i]*TABLE_produitvente.COL_quanité[i]
    	SAI_netpayer = TABLE_produitvente.COL_TotalPro[ligneTotal]
    	LIB_prodselect =  TABLE_produitvente.COL_Designpro[i]
    FIN
    mon problème est que la première colonne de mon tableau récupéré la valeur de ma remise global et se sont les autres colonnes qui reçoivent les remises en fonction de la remise globale. quelqu'un pourrait m'aider a résoudre mon problème.
    ci-joint mon écran en exemple
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour,

    Si je comprends bien, vous accordez une remise globale sur la vente et vous souhaitez la répartir sur les lignes détail en proportion de leur montant par rapport au total général.

    Votre problème vient du fait que vous calculez le montant global en même temps que vous calculez la remise proportionnelle.
    Vous devez parcourir deux fois votre table, la première pour calculer le total général et la seconde pour répartir la remise.

    Dans votre calcul actuel :
    Boucle 1 2 3
    Total prod 70 000 40 000 35 000
    NetPayer 70 000 110 000 140 000
    remise 5 000 1818 1207
    Calcul : ((SAI_Remise*COL_TotalPro[i])/SAI_netpayer)
    Calcul 1 : 5000 x 70000 / 70000 = 5000
    Calcul 2 : 5000 x 40000 / 110000 = 1818
    calcul 3 : 5000 x 35000 / 145000 = 1207

    Donc, vous pouvez constater que le total SAI_netpayer augmente à chaque itération et donc vous ne divisez jamais par le même montant et vos remieses ne sont pas calculées correctement.
    Pour la première ligne, SAI_netpayer = COL_TotalPro[1], donc COL_TotalPro[i])/SAI_netpayer = 1 ou 100% de la remise, ce qui explique que cette ligne reçoit 100% de la remise.

    Capito ?

    Autre chose : vous devez utiliser un arrondi.

    Bon travail

    Hemgé

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Merci pour votre explication j'ai créé une procédure uniquement pour le calcul de ma remise ce qui marche parfaitement concernant la fonction arrondi j'ai fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    POUR i = 1  A  TableOccurrence(TABLE_produitvente)
     
    		COL_Remise[i] = Arrondi((SAI_Remise*COL_TotalPro[i])/SAI_netpayer)
    	FIN
    	SAI_netpayer -= SAI_Remise
    mais je trouve quant même une marge supérieur de 5 francs par rapport a montant global de remise.

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Citation Envoyé par franckmichael Voir le message
    mais je trouve quant même une marge supérieur de 5 francs par rapport a montant global de remise.
    Et ?

    On peut vérifier avec une calculatrice, tracer ou déboguer.

    Avec une calculatrice 2 décimales : 2.413,79 + 1.379,31 + 1.206,90 = 5.000,00
    Idem, avec 0 décimales : 2.414 + 1.379 + 1.207 = 5.000

    Vous utilisez Arrondi(), sans spécifier le nombre de décimales qui est alors théoriquement 0 par défaut.
    Je précise toujours le nombre de décimales et n'ai aucune expérience sans cette précision.
    Réessayez en spécifiant 0 pour le nombre de décimales, afin d'éliminer un éventuel problème de ce côté-là.
    Mais je n'y crois pas et n'ai pas souvenir d'avoir lu quelque chose à ce sujet.

    A priori, le problème vient de l'utilisation des réels dans vos calculs.
    Ceux-ci sont entachés d'imprécisions et, par défaut, Windev convertit tous vos calcules en réels, si vous ne précisez pas le type de variable numérique à utiliser.

    Faites vos calculs en passant par des variables numériques de type Monétaire, qui en principe ne devraient pas vous poser de problème.
    Le mieux est de passer par le type Numérique qui est tout à fait sûr.

    Si vous faites une petite recherche vous trouverez une série de discussions évoquant les imprécisions du type Réel, tant dans ce forum que dans celui de PCsoft.

    Et même si la précision de l'arrondi sur 0 décimale devait corriger quelque chose, il vaut mieux vous méfier des réels et des conversions automatiques de Windev à l'avenir.

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Merci pour toute les précisions.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/11/2007, 17h34
  2. statistique sur les différentes base d'un serveur Mysql
    Par flyingtomtom dans le forum Outils
    Réponses: 2
    Dernier message: 06/10/2006, 09h42
  3. [Débutant] Les opcodes sur les différents processeurs
    Par loverdose dans le forum Assembleur
    Réponses: 11
    Dernier message: 03/02/2005, 13h32
  4. faire un group by sur les différents niveau de code
    Par speed034 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/10/2004, 16h10

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