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

Odoo (ex-OpenERP) Discussion :

Arrondir une somme provenant d'une fonction [V8]


Sujet :

Odoo (ex-OpenERP)

  1. #1
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2013
    Messages : 121
    Points : 87
    Points
    87
    Par défaut Arrondir une somme provenant d'une fonction
    Bonjour,

    J'aimerais arrondir au 5 centimes les plus proches le résultat de cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        def _calculate_total(self, cr, uid, ids, name, args, context):
            if not ids: return {}
            res = {}
            for line in self.browse(cr, uid, ids, context=context):
                res[line.id] = float(line.quantity) * line.amount * line.rate / 100
            return res
    Savez-vous comment procéder ?

    Merci d'avance de votre aide.

    JMB

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 19
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Essayer de vous référer à la fonction mathématique : round()

    En python, il existe cette même fonction par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    a = 12.456
    >>> round(12.456, 1)   # arrondi de 12.456 au dixième
    12.5
    
    >>> round(a, 2)        # arrondi de a au centième
    12.46
    
    >>> round(a)          # arrondi à l'unité
    12
    Dans votre cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     def _calculate_total(self, cr, uid, ids, name, args, context):
            if not ids: return {}
            res = {}
            for line in self.browse(cr, uid, ids, context=context):
                res[line.id] = float(line.quantity) * line.amount * line.rate / 100
                res[line.id] = round(res[line.id], 2)
            return res
    Espérant que cela puisse vous aider.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 19
    Points : 24
    Points
    24
    Par défaut
    Aussi, si vous voulez attribuer cette valeur à un champs, vous pouvez modifier les valeurs à travers le module decimal_precision. Vous pouvez vous rendre sur Configuration->Structure de la base de données->Précision décimale qui se trouve dans la partie "Technical".


    Vous pouvez toute fois à la création du champs intégrer la précision décimale

    -importation de la précision décimale : import openerp.addons.decimal_precision as arrondi

    -Création du champ :
    'Votre_Champ': fields.function(__compute, digits_compute=dp.get_precision('Account'),string='text_champ'),

  4. #4
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2013
    Messages : 121
    Points : 87
    Points
    87
    Par défaut
    Merci pour les réponses je vais tester tout ça :-)

  5. #5
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2013
    Messages : 121
    Points : 87
    Points
    87
    Par défaut
    La fonction donnée dans votre premier message fonctionne bien, merci !

    Par contre, je rencontre un petit problème avec les arrondis provenant de champs "float". Par exemple pour une valeur de 5'920.75 l'arrondi se fait à 5'920.70. Le chiffre devrait logiquement rester pareil car il est déjà arrondi correctement.

    Savez-vous comment résoudre ce problème ?

    Merci beaucoup d'avance.

    JMB

  6. #6
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2013
    Messages : 121
    Points : 87
    Points
    87
    Par défaut
    Voici le code exact pour l'arrondi au 0.05 le plus proche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def _calculate_total(self, cr, uid, ids, name, args, context):
            if not ids: return {}
            res = {}
            for line in self.browse(cr, uid, ids, context=context):
                res[line.id] = float(line.quantity) * line.amount * line.rate / 100
                res[line.id] = (round(res[line.id]*20)/20)
            return res

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 23/02/2008, 09h49
  2. Réponses: 8
    Dernier message: 09/06/2006, 16h01
  3. Afficher une image provenant d'une ressource
    Par Spartan03 dans le forum Windows
    Réponses: 8
    Dernier message: 01/09/2005, 13h38
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. Réponses: 13
    Dernier message: 24/02/2005, 16h45

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