2016-08-10 2 views
0

Ich erstelle ein Modul für die Studentenverwaltung in "Odoo9", in einem Teil dieses Moduls möchte ich die durchschnittliche Note berechnen, die ein Schüler in einem Fach wie "Mathe" bekommt. Ich versuche es zu erreichen das Verwenden dieses Codes, aber ich habe ein Problem, die "Avg-Maths" direkt nach dem Füllen "Maths-1" und "Maths-2" zu berechnen, kann es nur nach dem Speichern des Schülerprofils berechnet werden. Kann mir jemand helfen, bitte realisieren Frage hier? und wie kann ich das beheben? enter image description hereBerechnete Felder 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

Entweder sollte das Feld Eingabe akzeptieren oder es sollte berechnet werden, aber in Ihrem Fall avg ist berechenbar und Mathematik und Physik-Marken eingegeben werden. Verwechsle die Dinge nicht. Sie müssen den Durchschnitt dieser Themen in das Elternmodell aufnehmen. –

+0

Das bedeutet, dass ich das durchschnittliche Feld in der Ansicht result_ids nicht anzeigen kann, es wird in der Schüleransicht angezeigt? – pourjour

Antwort

1

hinzufügen student_id.result_ids.result_manual zu Ihrer hängt Liste auf _compute_value. Das sollte eine Neuberechnung auslösen.

+0

Die Funktion wird ausgelöst, aber die avg-maths ändert sich nicht sofort nach dem Ändern eines anderen Feldes, Es ändert sich nur nach dem Speichern der klick save.andere Sache ist, dass die Funktion Werte aus der Datenbank nicht aus der Baumansicht abrufen.Ich denke, dass ich sollte dass, weil selbst auf die aktuelle Zeile nicht alle Recordsets zeigen. Ich habe eine Idee, die compute Funktion aus der Klasse student_student auszulösen, aber dann das Problem ist, ich kann die Werte von schoolresults_detail Felder von student_student – pourjour

+1

nicht ändern, das könnte bedeuten, es wäre eine onchange (hängt natürlich von einem onchange, aber mit Datenbankpersistenz) auf einem x2many-Feld. Und das ist ohne eine "große" Veränderung in Odoo nicht möglich. Für weitere Informationen schauen Sie [hier] (https://github.com/odoo/odoo/issues/2693) – CZoellner

+0

Vielen Dank für dieses eine, ich werde mit diesen Änderungen in Odoo framewrok spielen und ich sehe, ob es funktionieren könnte – pourjour

0

Ich denke, nach der Berechnung des Wertes Sie es zu Ihrem Ergebnisfeld

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

, aber ich sehe nicht, dass Sie den Wert auf das Ergebnisfeld zuweisen? !! sot versuchen, es zuzuweisen, die es tun sollten

+0

Ich tat das, das Problem ist, aktualisieren Sie das Ergebnisfeld der aktuellen Zeile, wenn ich result_manual der aktuellen Zeile aktualisieren. Ich will dieses Verhalten nicht.Instatt es sollte update die andere Zeile "where Subject ist avgMath" und es sollte sofort sein. – pourjour

Verwandte Themen