我正在使用OpenERP v7并在采购订单行窗口中请求以下输出
PO0001 PO0002 PO0003
Line Line Line
10 10 10
20 20 20
30 30
我的代码:
<field name="order_line" context="{'order_id':active_id}">
_columns={
'sequence':fields.integer('Sequence', store=True),
}
_defaults = {
lambda obj, cr, uid, context: obj._default_sequence(cr, uid, context)
}
def _default_sequence(self, cr, uid, context=None):
if context is None:
context = {}
max_sequence = 0
if context.get('order_id'):
order_line = self.search(cr, uid, [('order_id', '=', context['order_id'])])
if order_line:
max_sequence = max([line['sequence'] for line in self.read(cr, uid, order_line, ['sequence'])])
return max_sequence + 10
但是我得到了这种输出。任何建议都会很棒。
PO0001 PO0002 PO0003
Line Line Line
10 10 10
10 10 10
10 10
任何人都可以帮助我达到所需的输出。
答案 0 :(得分:2)
我认为你做错了。只有在您第一次单击任何按钮操作(除了添加行之外的按钮)之后,才会创建记录。然后只有你才能进行搜索。我希望默认将获得上下文,即使我们没有指定上下文。仍然没有得到上下文,然后尝试按照Andrei Boyanov给出的答案。另外请理解像active, state, sequence
等字段名称在openerp中有一些超能力。例如,如果表具有字段“sequence”,则表的树视图将具有拖放功能,如果我们执行拖放功能,则将自动计算并保存表中每个记录的新序列。
所以我的意见是不使用序列字段。使用任何其他字段名称。然后将on_change方法写入one2many字段,并将one2many字段名称作为属性传递给on_change方法。然后在on_change方法中检查添加新行时所有值。如果新行的值采用格式(0,0,dictionary_with_fields_as_keys_and_its_values_as_values)。然后在此字典中添加sequence_number和值。例如:
<field name="order_line" on_change="onchange_line(order_line)">
def onchange_line(self, cr, uid, ids, lines,context=None):
result = {}
result['value'] = {}
#do the proper checking
count_dict = {}
count = 10
had_seq = 0
for index,line in enumerate(lines):
if line[0] == 0:
count_dict[index] = count
count +=10
else:
had_seq +=1
#seqnece_no is the new sequence field defined
for k in count_dict:
if had_seq:
lines[k][2]['sequence_no'] = had_seq*10 + count_dict[k]
else:
lines[k][2]['sequence_no'] = count_dict[k]
result['value'].update({'order_line':lines})
return result
请试试。
答案 1 :(得分:1)
如何执行_default_sequence(...)
?我想你打算通过_defaults
字典来调用它。在这种情况下纠正如下:
_defaults = {
'sequence': lambda obj, cr, uid, context: obj._default_sequence(cr, uid, context)
}
在您的代码中,您省略了键sequence
。实际上,您定义的不是字典,而是具有一个元素的集合 - lambda函数。
更好的是,您可以像这样定义它:
_defaults = {
'sequence': _default_sequence
}
答案 2 :(得分:0)
通过
更改您的Python文件def _default_sequence(self, cr, uid, context=None):
if not context: context = {}
max_sequence = 0
if context.get('order_id'):
order_line = self.search(cr, uid, [('order_id', '=', context['order_id'])])
if order_line:
max_sequence = max([line['sequence'] for line in self.read(cr, uid, order_line, ['sequence'])])
return max_sequence + 10
_columns={
'sequence':fields.integer('Sequence'),
}
_defaults = {
'sequence': _default_sequence
}
无需将store=True
放在整数字段中,它将始终在数据库中存储值。