# Odoo Aide

1 Answer

OK, I have solved the problem above. Here this is my solution below for reference, by QWEB.

First at all, its divided by zero, because I did NOT set a default value for the Many2One field, which means its ZERO definitely. There are three solutions for the situation.

1. Not to do the divisor.

2. Set a default value for the field.

3. Give a value in the formula temporary

The Area was divided by the factor of x_area_uom, but I found there is another field for multiple (x_size_uom.factor_inv). Therefore, I could just do the calculation as below with the factor_inv.

`(record.x_width * record.x_height) * record.x_size_uom.factor_inv * record.x_size_uom1.factor_inv * record.x_area_uom.factor`

Since I do NOT know how to set the default for the Many2One field by QWEB. I have decided to go to the third way, give a temp value in the formula.

`(record.x_width * record.x_height) / ((record.x_size_uom.factor * record.x_size_uom1.factor) or 1) * record.x_area_uom.factor`

The formula above will convert the Area into the unit of Area (x_area_uom), which is quite successful as what I wanted. On the other hand, I was thinking to round the Area as Rounding Precision of the UOM (x_area_uom.rounding).

Rounding Precision is not only rounding to the precision. It is the value I could charge the customer in the exact quantity as I wanted, by every 0.25, 0.1, 0.2, 1000, etc. According to the Help of Odoo Team writes:

"The computed quantity will be a multiple of this value. Use 1.0 for a Unit of Measure that cannot be further split, such as a piece."

For example, I have 2 units of Area, SQM & SQF. The rounding precision of SQM is 0.1 and SQF is 0.5. When the Area converted from SQM into SQF, its just only multiply by 10.76 (x_area_uom.factor) into SQF, but it doesnt round it to the value of the unit. Therefore I have tried to use ceil() which is a very good function for rounding purpose. The best way to do is to round it by ceiling to the x_area_uom.rounding.

`ceil( 'formula above' , x_area_uom.rounding)`

However, ceil() is not one of the built-in functions working on the computed-field, round() will drop the value below 5 and I couldn't import math or other function.  (Since it becomes a little complex from now, I will be using the variable for better understanding and displaying.)

`    area = (record.x_width * record.x_height) / ((record.x_size_uom.factor * record.x_size_uom1.factor) or 1) * record.x_area_uom.factor    rp = x_area_uom.rounding`

I made the Area (in the unit I want) divided by the value of rounding and round it to an INTEGER plus 1, which is the function of roundup. Then multiply by the value of rounding, which is the function of ceil(). Finally the value of Area became the perfect value that I wanted to charge the customers. Here it is the full formula for your reference by QWEB. (Although there are many times that errors got me, finally....)

`for record in self:     area = (record.x_width * record.x_height) / ((record.x_size_uom.factor * record.x_size_uom.factor) or 1) * record.x_area_uom.factor    rp = record.x_size_uom2.rounding    record['x_area'] = float(int( area / (rp or 1) ) +1) * rp`

Please upvote this answer if you like it, or share your solution for the situation above. Thank you!

int ( area / rp ) makes it an integer after division without precision. Adding 1 just make it ceiling up to the integer of the Rounding Precision. Float the Integer for multiple a float number. Multiply the Rounding Precision makes it back to the Value we calculated in the Unit I wanted.

If you want to know what functions you could use in computed-field. Check out the "Built-in Function of Python"
https://docs.python.org/3.5/library/functions.html

I really love Odoo, OMG! It could do anything I want, only the matter is how-to.

2 Comments
Michael Yeung 23/07/2018 23:11

Sorry, my bad. Its not the same as ceiling, at least it round down when < 0.5

Michael Yeung 24/07/2018 02:35

Solved and Edited the answer! Share your idea with me! Thanks!

###### Writer 15
1 Abonné(e)s
###### About This Community

This platform is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.

###### Odoo Training Center

Access to our E-learning platform and experience all Odoo Apps through learning videos, exercises and Quizz.