Сложить (суммировать) два значения в odoo

Допустим, у меня два поля. Такие как num1 и num2. Я хочу показать сумму этих значений в виде дерева. Как применить это в odoo?


person nikolas    schedule 24.04.2015    source источник


Ответы (3)


вы можете добиться этого с помощью onchange метода, вот демонстрация метода onchange с использованием нового api odoo.

class DemoModel(models.Model):

    _name = 'demo.model'

    field_x = fields.Integer('Column X')
    field_y = fields.Integer('Column Y')
    field_sum = fields.Integer('Column Sum')

    @api.onchange('field_x', 'field_y')
    def onchange_field(self):
        if self.field_x or self.field_y:
            self.field_sum = self.field_x + self.field_y

вам не нужно ничего менять в части просмотра (xml).

person Atul Arvind    schedule 27.04.2015
comment
братан, получаю NameError: имя 'api' не определено - person nikolas; 27.04.2015

Создайте третье поле с именем result, которое суммирует num1 и num2, используя поле изменения или функциональное поле со значениями по умолчанию. Вы можете скрыть его в виде формы и отобразить в виде дерева.

Поскольку функциональные поля вычисляются каждый раз, когда загружается представление, не переходите на это, если вы собираетесь использовать его в древовидном представлении, потому что это резко замедлит загрузку представления, поскольку записи и вычисления становятся сложными. Вы можете использовать store=true, чтобы значение также сохранялось в базе данных.

Если это написано в qweb, вышеуказанный случай будет рассматриваться иначе.

Обновлять:

Для получения дополнительной информации о onchange ...

Код для суммы с использованием onchange: В файле python:

class sample_test(osv.osv):
    _name = "sample.test"

    _columns = {
                'num1': fields.integer('Num1'),
                'num2': fields.integer('Num2'),
                'result': fields.integer('Result'),
                }

    def onchange_result(self, cr, uid, ids, num1, num2, context=None):
        res = {}
        if num1 and numb2:
            res['result'] = numb1 + numb2
        return {'value': res}

В xml файле:

<field name="num1" on_change="onchange_result(num1, num2)" />
<field name="num2" on_change="onchange_result(num1, num2)" />
<field name="result" />

Для функционального поля см .:

Синтаксис: Objects_Fields_Methods/field_type.html#functional-fields" rel="nofollow noreferrer">https://doc.odoo.com/ v6.0 / developer / 2

class sample_test(osv.osv):
    _name = "sample.test"

    _columns = {
                'num1': fields.integer('Num1'),
                'num2': fields.integer('Num2'),
                'result': fields.integer('Result'),
                }

    def onchange_result(self, cr, uid, ids, num1, num2, context=None):
        res = {}
        if num1 and numb2:
            res['result'] = numb1 + numb2
        return {'value': res}
Objects_Fields_Methods / field_type.html # financial-fields

Описание: http://bazaar.launchpad.net/~openerp/openobject-server/7.0/view/head:/openerp/osv/fields.py#L843

Простой пример: https://stackoverflow.com/a/11981080/3374651

person no coder    schedule 25.04.2015
comment
store = True не сохраняет значение. Он сброшен на 0,0 - person nikolas; 25.04.2015
comment
в каком поле вы использовали store = true, это свойство функционального поля. - person no coder; 25.04.2015
comment
Извини брат. Работал. Спасибо. Если я установил значение только для чтения, то ошибка prblm. Я не хочу редактировать - person nikolas; 25.04.2015
comment
Вам это нужно только в древовидном представлении, поэтому вам не нужно предоставлять его в виде формы. Или перейдите в функциональное поле с store = true. - person no coder; 25.04.2015
comment
Попробуйте проголосовать за, принять ответ, если он сработал для вас, и проголосовать против, если нет. - person no coder; 26.04.2015
comment
У меня низкая репутация, чтобы голосовать за. Извини, братан, что голосую. Не могли бы вы привести пример кода с field.function - person nikolas; 26.04.2015
comment
Братан, по твоей ссылке у меня проблема. Вот еще один мой вопрос. Было бы здорово, пожалуйста, ответьте stackoverflow.com/q/29881228/4718335 - person nikolas; 26.04.2015

вы пишете неправильные переменные numb1 numb2 в условии

класс calc (osv.osv): _name = "calc"

_columns = {
            'num1': fields.integer('Num1'),
            'num2': fields.integer('Num2'),
            'result': fields.integer('Result'),
            }

def onchange_result(self, cr, uid, ids, num1, num2, context=None):
    res = {}
    if num1 and num2:
        res['result'] = num1 + num2
    return {'value': res}

calc ()

person mo badawi    schedule 07.01.2016