openerp 增加明细行时更新主表的汇总字段

通常,这任务可以覆盖主表 objects 的create或 write方法来达成,但为了给操作者一个实时的观感,最好在用户更新或增加明细行时更新界面上的汇总字段

这 需要了解一对多的数值格式
http://openerp.com/wiki/index.php/Developers:Developper%27s_Book/Objects/ObjectsAccess/ObjectsWritingValues
如:
[(1,1,{'item_id':1,'price':30,'cost':20,'quantity':1}),(0,0,{'item_id':3,'price';20,'cost':20,'quantity':10}]

可以明确的有以下几点

1. 这是一个列表
2. 列表元素是一个tuple
3. 每个tuple有三个元素,op,id,values ,其中op 表示动作,有0 -create ,1- write ,2 unlink(删除) ,6- values 是一个记录id值的列表,表示将这些id值的记录作为多方保存,id 是具体记录的编号,当op为0时,为0,values 在op是0,1,2的情况下是一个字段名:值的词典



为一对多字段增加on_change属性
<field name='line_ids' noable='1' colspan='4' on_change='line_ids_changed(line_ids)'/>
在objects中写方法

def line_ids_changed(self,cr,uid,ids,line_ids):
    amount=0
    for row in line_ids:
        if row[0] in (0,1):
            amount +=row[2]['quantity']*row[2]['price']
    return {'value':{'total_amount':amount}}




问题,如果在view中将total_amount的reaonly 为1(在objects定义中设置字段的readonly=True效果相同),则在保存时该汇总字段不会被保存. 这个举止是有问题的,因为通常readonly只是意味着阻止用户手动更新 . 并不意味着阻止程序更新

你可能感兴趣的:(open)