1

我有一个sale.order.line模型的表单视图,并创建了一个名为的字段(序列字段)' niu ',它会自动增加其值。

对于每个可储存的产品类型,您添加到工作正常的表单但我有一个问题,因为当您添加可堆叠的产品时,值会增加,但是当我按下“保存”按钮时会自动更改顺序。

请参阅下面的附加图片:

在此处输入图像描述

在此处输入图像描述

这是模型中的 'niu' 字段和 sale.order.line 方法:

niu = fields.Char(string="NIU", compute="_niu_validation", readonly=True, store=True)

@api.depends('product_id.product_tmpl_id.type')
def _niu_validation(self):
    for rec in self:
        if rec.product_id.product_tmpl_id.type == 'product' and not rec.niu:
                rec.niu = self.env['ir.sequence'].next_by_code('sale.order.line')

我该怎么做才能使序列不变并建立初始编号?

4

1 回答 1

2

这是因为next_by_code()方法基于PostgreSQL 的 nextval() 函数生成值。

你调用next_by_code()ir.sequence对象的方法。在这个方法中调用方法_next()。让我们看看身体:

def _next(self):
    if self.sequence_id.implementation == 'standard':
        number_next = _select_nextval(self.env.cr, 'ir_sequence_%03d_%03d' % (self.sequence_id.id, self.id))
    else:
        number_next = _update_nogap(self, self.sequence_id.number_increment)

    return self.sequence_id.get_next_char(number_next)

新值是使用number_next生成的。在你的情况下_select_nextval将被称为:

def _select_nextval(cr, seq_name):
    cr.execute("SELECT nextval('%s')" % seq_name)

    return cr.fetchone()

如您所见,函数nextval在查询中被调用。

这个怎么运作。

当你在表单中_niu_validation添加一些内容时, OpenERP 会调用方法。sale.order.line这是因为 object(每一行) 将为您的 field 计算值niu。在您的方法中,它由next_by_code. 这意味着在保存之前(仅用于 GUI / 树视图)postgreSQL 更改了序列。当您单击保存按钮(在标题中)时,系统会_niu_validation再次调用。

总结一下。在您单击Save之前,Odoo 不会在树视图中应用更改。您在 db 中进行了一些更改,tree view同时序列将被更改(因为您计算了 column 的值NIU)。但是这些行没有保存在数据库中。

你可以在这里查看它是如何工作的:path_to_odoo/openerp/addons/base/ir/ir_sequence.py

你能做些什么来使序列不改变?

存储行时,您可以删除字段的方法、_niu_validation覆盖方法和计算值。但在这种情况下,用户不会看到“on fly”列的新值。createsale.order.line

希望这对您有所帮助。

还有一件事值得考虑(如果你想使用你的方法)。想象一下,有几个人同时处理一个订单。

于 2016-03-02T21:19:52.077 回答