2016-08-10 4 views
0

Je crée un module pour la gestion des étudiants dans "Odoo9", dans une partie de ce module je veux calculer la note moyenne qu'un étudiant obtient dans un sujet comme "maths". J'essaie d'atteindre qu'en utilisant ce code, mais j'ai un problème en calculant le "Avg-Maths" immédiatement après avoir rempli "Maths-1" et "Maths-2", il ne peut être calculé qu'après avoir sauvegardé le profil de l'étudiant.Peut-être quelqu'un question ici? et comment puis-je résoudre ce problème? enter image description hereChamps calculés Odoo9

#student class 
class student_student(models.Model): 
    ' 
    ' 
    ' 
    result_ids = fields.One2many("schoolresults.detail", "student_id", "School Results") 
    ' 
    ' 
    ' 


class schoolresults_detail(models.Model): 
    _name = "schoolresults.detail" 
    _description = "Student's results." 
    student_id = fields.Many2one("student.student", "Student", ondelete="cascade") 
    subject_id = fields.Many2one("schoolresults.subject", "Subject") 


    result_manual = fields.Float("Result") 
    result = fields.Float(compute='_compute_value',store=True) 
    manual = fields.Boolean(compute='_is_manual', default=False) 

    @api.one 
    @api.depends('manual') 
    def _is_manual(self): 
     self.manual = self.subject_id.my_id 
    @api.one 
    @api.depends('result_manual','subject_id','subject_id.my_id') 
    def _compute_value(self): 
     self.ensure_one() 
     results = self.env['schoolresults.detail'].search([]) 
     total = 0 
     for data in results: 
      total += data.result_manual 
     for data in results: 
      #if the subject is the average of others 
      if data.subject_id.my_id: 
       data.result = total 


class schoolresults_subject(models.Model): 
    _name = "schoolresults.subject" 
    _description = "Student's subjects." 
    my_id = fields.Integer(default=0) 
    name = fields.Char("Subject") 
+0

Soit le champ devrait accepter l'entrée ou il devrait être calculé, mais dans votre cas, avg est calculatrice et les marques de maths et de physique sont entrées. Ne mélange pas les choses. Vous devez ajouter la moyenne de ces sujets dans le modèle parent. –

+0

Cela signifie que je ne peux pas afficher le champ moyen dans la vue result_ids, il sera affiché dans la vue des étudiants? – pourjour

Répondre

1

Ajouter student_id.result_ids.result_manual à votre liste dépend _compute_value. Cela devrait déclencher un recalcul.

+0

La fonction est déclenchée, mais les avg-maths ne changent pas immédiatement après avoir changé d'autre champ, elle ne change qu'après avoir sauvegardé le clic. Une autre chose est que la fonction récupère les valeurs de la base de données. que parce que l'auto point à la ligne actuelle pas tous les jeux d'enregistrements. J'ai une idée de déclencher la fonction de calcul de la classe student_student, mais le problème est que je ne peux pas changer les valeurs de schoolresults_detail champs de student_student – pourjour

+1

OK, cela pourrait signifier qu'il serait un onchange (dépend bien sûr un onchange mais avec la persistance de la base de données) sur un champ x2many. Et ce n'est pas possible sans un "gros" changement dans Odoo. Pour plus d'informations regardez [ici] (https://github.com/odoo/odous/issues/2693) – CZoellner

+0

Merci pour celui-ci, je vais jouer avec ces changements dans odoo framewrok et je vois si cela pourrait fonctionner – pourjour

0

Je pense que, après le calcul de la valeur que vous devez assigner à votre champ de résultat

@api.one 
def _compute_method(self): 
# compute average for this record 
self.result = calclated_value 

mais je ne vois pas que vous attribuez la valeur au champ de résultat? !! sot essayer de l'assigner qui devrait le faire

+0

Je l'ai fait, le problème est qu'il met à jour le champ de résultat de la rangée actuelle quand je mets à jour result_manual de la rangée actuelle.Je ne veux pas de ce comportement.Au lieu mettre à jour l'autre ligne "où sujet est avgMath" et il devrait être immédiat. – pourjour