Dans mon instance Odoo, j'ai plusieurs champs calculés sur l'objet de compte analytique. Ces champs sont calculés pour s'assurer que le spectateur a toujours la vue d'ensemble le plus à jour.
Certains de ces champs dépendent d'autres champs qui sont par eux-mêmes calculés. Les calculs par eux-mêmes sont assez simples (champ A = champ B + champ c). La plupart des champs dépendent également des ID enfants sous-jacents. Par exemple, le champ A sur l'objet TOP est un résumé de tous les champs d'une valeur de l'ID d'enfant. Le champ A sur les enfants est calculé sur leur propre champ B et C combiné, comme décrit ci-dessus. P>
La situation que je trouve actuellement en est que, pour une raison quelconque, les champs semblent être calculés dans un ordre aléatoire. J'ai remarqué cela parce que lorsque je rafraîchis une succession rapide, je reçois des valeurs différentes pour le même dossier. P>
Exemple: Les champs B et C sont les deux 10. Je m'attends à ce que A soit 20 (B + C), mais la plupart des temps, c'est en fait 0 parce que le calcul de champ pour un sevère avant B et C. Parfois, il est parfois 10 depuis que B ou C est allongé avant un pourrait finir. Sur de très rares occasions, il est en fait 20 .... p>
Remarque: - Je ne peux pas créer les champs stockés car ils dépendront des lignes de déplacement de compte créées à un taux incroyable et la base de données ira absolument noix recalculant tous les enregistrements toutes les minutes environ. - J'ai déjà ajouté le @ api.depends mais cela n'est utile que si vous utilisez des champs stockés pour déterminer que les champs doivent le déclencher, ce qui n'est pas applicable dans ma situation. P>
Est-ce que quelqu'un connaît une solution à cette ? Ou avoir des suggestions sur des moyens alternatifs de calcul? P>
[modifier] Code ajouté p>
Exemple code: p>
@api.multi @api.depends('child_ids','costs_allowed','total_cost') def _compute_production_result(self): for rec in self: rec_prod_cost = 0.0 if rec.usage_type in ['contract','project']: for child in rec.child_ids: rec_prod_cost += child.production_result elif rec.usage_type in ['cost_control','planning']: rec_prod_cost = rec.costs_allowed - rec.total_cost rec.production_result = rec_prod_cost
3 Réponses :
Vous pouvez trouver Python @properties code> utile. Plutôt que d'utiliser des champs simples, cela vous permet de définir quelque chose qui ressemble à un champ, mais c'est paresseux évalué - c'est-à-dire calculé sur la demande lorsque vous «l'obtenez». De cette façon, nous pouvons garantir qu'il est à jour. Un exemple:
C'est de bonnes informations, mais je ne sais pas encore comment utiliser cela dans Odoo. Le cadre ODOO utilise sa propre interprétation des champs (car il doit également créer des tables de base de données pour cela). Je garderai sûrement cela à l'esprit essayer de trouver une solution cependant! Merci!
Vous pouvez faire comme ils l'ont fait dans FACTURE , de nombreux champs calculés dépendent de nombreux autres champs et définissent une valeur pour chaque champ calculé.
Ah oui, j'ai essayé de le faire. Pensez vous, il s'agit d'environ 40 champs, ce qui en ferait non seulement une énorme méthode, mais aussi une méthode qui va également courir 40 fois ... Ceci est peut-être une lacune de la version 9 mais contrairement à la documentation, cela semble vraiment courir. pour chaque domaine individuellement.
Pouvez-vous le faire pour C code> uniquement?
@Wako: J'ai bien peur. La plupart de ces champs sont basés sur une relation parent-enfant et je souhaite les calculer à la fois. Par conséquent, j'ai besoin de traverser un certain nombre de couches profondes pour obtenir essentiellement sa propre variante. Je vais mettre à jour le problème afin que vous puissiez obtenir une meilleure image.
J'ai donc réussi à trouver un collègue et nous l'avons compris ensemble. Comme il s'avère, lorsque vous définissez une méthode qui calcule un champ pour sa propre dossier, c'est-à-dire en fonction de ce champ sur les enregistrements d'enfants, vous devez le mentionner explicitement dans les dépendances.
Par exemple: P >
@api.multi @api.depends('a', 'b', 'c', 'child_ids.a') def _compute_a(self): for rec in self: if condition: rec.a = sum(child_ids.a) else: rec.a = rec.b + rec.c
Pourriez-vous partager votre code?
@Czoellner: Je pourrais mais cela ne ferait aucun sens. Ce sont juste des champs calculés standard odoo. Il y a aussi beaucoup d'eux qui ne serait probablement pas fantastique de voir. Si vraiment nécessaire, je vais copier-coller une partie du code.
@ Ludo21South ou faire un gist et un lien?
Mettra à jour ce problème.