为什么在 Odoo 中保存时字段的顺序会发生变化?
Why the sequence of a field changes when saved in Odoo?
我有一个 sale.order.line
模型的表单视图,并创建了一个名为 ' niu '
的字段(序列字段),它会自动增加其值。
对于您添加到表格中的每种可库存产品类型,它工作正常但我有一个问题,因为当您添加可堆叠产品时,该值会增加,但是当我按下 'Save ' 按钮时会自动更改顺序.
见下图:
这是模型中的“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')
怎样才能使序号不变,初始号成立?
这是因为next_by_code()
方法根据nextval() function of PostgreSQL生成值。
您调用了 ir.sequence
object 的 next_by_code()
方法。在这个方法中调用方法_next()
。让我们看看 body:
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
。
工作原理。
当你在表单中添加一些sale.order.line
时,OpenERP将调用方法_niu_validation
。这是因为 object(每行)将为您的字段计算值 niu
。在您的方法中,它由 next_by_code
调用。这意味着 before save(仅用于 GUI/树视图)postgreSQL 更改了序列。当您单击 保存 按钮(在 header 中)时,系统会再次调用 _niu_validation
。
总结一下。
在您单击 保存 之前,Odoo 不会应用树视图中的更改。您在 tree view
中进行了一些更改,同时序列将在 db 中更改(因为您计算列 NIU
的值)。但是这些行没有保存在数据库中。
您可以在此处查看其工作原理:path_to_odoo/openerp/addons/base/ir/ir_sequence.py
怎样做才能使顺序不变?
您可以删除方法 _niu_validation
,覆盖 sale.order.line
的方法 create
,并在存储行时计算字段值。
但在这种情况下,用户将看不到列 'on fly' 的新值。
希望对您有所帮助。
还有一件值得思考的事情(如果你想使用你的方法)。想象一下,几个人同时处理一份订单。
我有一个 sale.order.line
模型的表单视图,并创建了一个名为 ' niu '
的字段(序列字段),它会自动增加其值。
对于您添加到表格中的每种可库存产品类型,它工作正常但我有一个问题,因为当您添加可堆叠产品时,该值会增加,但是当我按下 'Save ' 按钮时会自动更改顺序.
见下图:
这是模型中的“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')
怎样才能使序号不变,初始号成立?
这是因为next_by_code()
方法根据nextval() function of PostgreSQL生成值。
您调用了 ir.sequence
object 的 next_by_code()
方法。在这个方法中调用方法_next()
。让我们看看 body:
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
。
工作原理。
当你在表单中添加一些sale.order.line
时,OpenERP将调用方法_niu_validation
。这是因为 object(每行)将为您的字段计算值 niu
。在您的方法中,它由 next_by_code
调用。这意味着 before save(仅用于 GUI/树视图)postgreSQL 更改了序列。当您单击 保存 按钮(在 header 中)时,系统会再次调用 _niu_validation
。
总结一下。
在您单击 保存 之前,Odoo 不会应用树视图中的更改。您在 tree view
中进行了一些更改,同时序列将在 db 中更改(因为您计算列 NIU
的值)。但是这些行没有保存在数据库中。
您可以在此处查看其工作原理:path_to_odoo/openerp/addons/base/ir/ir_sequence.py
怎样做才能使顺序不变?
您可以删除方法 _niu_validation
,覆盖 sale.order.line
的方法 create
,并在存储行时计算字段值。
但在这种情况下,用户将看不到列 'on fly' 的新值。
希望对您有所帮助。
还有一件值得思考的事情(如果你想使用你的方法)。想象一下,几个人同时处理一份订单。