2016-03-01 73 views
1

我有一个sale.order.line模型的窗体视图,并创建了一个名为' niu '的字段(序列字段),该字段自动增加其值。为什么在Odoo中保存字段的顺序会改变?

对于每种产品类型的可供货状态,您都可以添加到可正常工作的表单中但是我遇到问题,因为当您添加产品堆叠时,值会增加,但是当我按下“保存”按钮时,会自动更改序列。

见下面附图片:

enter image description here

enter image description here

这是模型中的 '牛' 字段和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') 

我能做些什么来使序列没有改变,并且初始数字是establis hed?

回答

2

这是因为next_by_code()方法根据nextval() function of PostgreSQL产生的值。

你叫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被称为查询。

它是如何工作的。

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

总结。 Odoo不会在树视图中应用更改,直到您点击保存。您在tree view中进行了一些更改,同时序列将在db中更改(因为您计算的是列NIU的值)。但行不会保存在数据库中。

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

你能做些什么使顺序没有发生变化?

您可以删除方法_niu_validation,覆盖sale.order.line的方法create,并计算行存储时的字段值。 但在这种情况下,用户将不会在'即时'中看到新的值。

希望这可以帮助你。

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

+0

你好,关于段落:你可以删除方法_niu_validation,覆盖sale.order.line的方法create,并且当你的行被存储时计算field的值。但在这种情况下,用户将不会在“即时”栏中看到新的值。 如何使创建方法在存储时计算字段的值? 我改写由该方法_niu_validation创建(个体) @ api.model DEF创建(个体): \t \t用于记录在自: \t \t \t如果rec.product_id.product_tmpl_id.type == '产物'而不是rec.niu: \t \t \t \t rec.niu = self.env ['ir.sequence']。next_by_code('sale.order.line') – beriliox

+1

在你的模型中:'niu = fields.Char(string = “NIU”,readonly = True)@ api.model def create(self,vals):vals [u'niu'] = #write here any logic ... return super(NameYourClass,self).create(vals)' –

+0

在米y模型我把以下内容,但是当我按下保存按钮时不创建序列。为什么会发生? @ api.model DEF创建(个体,瓦尔斯): 用于REC在自: 如果rec.product_id.product_tmpl_id.type == '产品' 和不rec.niu: 瓦尔斯[u'niu'] = self.env ['ir.sequence']。next_by_code('sale.order.line') return super(SaleOrderLine,self).create(vals) – beriliox

相关问题