Openerp V7:OrderLine中的编号

时间:2014-02-01 08:17:57

标签: openerp

我正在使用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

任何人都可以帮助我达到所需的输出。

3 个答案:

答案 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放在整数字段中,它将始终在数据库中存储值。