2016-07-30 56 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