2016-03-01 83 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

相關問題