2016-07-30 18 views
1

我點擊保存在OpenERP 7後,如何觸發功能?OpenERP 7:如何在點擊保存後觸發自動版本增加功能

在我的自定義模塊中,我希望自動增加「version_number」參數,每次用戶點擊保存時它都會觸發一個函數來執行「ver = ver + 1」的邏輯並回寫到「version_number 「領域。我怎麼能這樣做?

我試過使用「def write()」,但不確定它是如何完成的。感謝您的善意幫助。謝謝!

回答

2

您需要重寫write方法。

def write(self, cr, uid, ids, vals, context=None): 
    res = super(your_model, self).write(cr, uid, ids, vals, context) 
    self._increment_version(cr, uid, ids) 
    return res 

def _increment_version(self, cr, uid, ids): 
    for record in self.browse(cr, uid, ids): 
     cr.execute('update table_name set version_number=%s where id=%s' % (record.version_number + 1, record.id)) 
+0

我更喜歡你的答案,因爲它更完整。但是,對於Odoo的舊瀏覽對象,如果瀏覽將返回browse_null對象,則最後一行可能會產生錯誤。 – CZoellner

+0

有兩種可能:第一個'ids'可能是一個整數,第二個ids可能有錯誤的ID或無。您的代碼會嘗試從browse_null對象獲取'version_number',並且會出現錯誤。 – CZoellner

+0

@CZoellner,我試過了。看起來Rawly的想法是更好地工作,但需要稍作修改。我在「self.browse(cr,uid,ids)中記錄」的語句遇到錯誤:「我進一步將其更改爲reads = self.read(cr,uid,ids,['version'],context = context)和捕獲版本使用ver_num = reads.get('版本') – Samleecomp

1

你是對的,你應該使用寫功能。

_columns={..., 
     'ver':fields.integer(), 
    ...} 

def write(self, cr, uid, ids, vals, context=None) 
    vals['ver']= trigger_func() 
    return self.super(your_class_name).write(cr, uid, vals, context) 
+0

我有一個問題,即進入無限循環的write方法工作,這觸發由self.super(your_class_name).WRITE(CR,UID,丘壑,上下文),其中它一直在調用def書寫。任何想法如何只執行一次而已? – Samleecomp

+1

@Samleecomp因爲你在'trigger_func()'中調用'write()'方法。當你從'write()'調用'write()'時,你顯然最終會用遞歸。嘗試'cr.execute()'。看看http://stackoverflow.com/questions/38675460/openerp-7-how-to-trigger-a-auto-version-increase-function-after-click-save/38683482#38683482 – Zety

+0

@Samleecomp如果'len (ID)> 1'?。 – Zety

1

這裏是我

def write(self, cr, uid, ids, vals, context=None): 
    res = super(your_model, self).write(cr, uid, ids, vals, context) 
    self._increment_version(cr, uid, ids) 
    return res 

def _increment_version(self, cr, uid, ids): 
    res = {} 
    reads = self.read(cr, uid, ids, ['version'], context=context) 
    ver_num = reads.get('version') 
    ver_id = reads.get('id') 
    if ver_num:   
     cr.execute('update table_name set version_number=%s where id=%s' % (ver_num + 1, ver_id)) 
    return res