OpenERP - 将数据复制到不同表的新记录中 - 费用/采购单

1 投票
1 回答
1801 浏览
提问于 2025-05-01 06:28

我一直在尝试把hr_expenses表单中的某些字段复制到我自己创建的模块purchase_orders里。

下面这个方法是为了让我在扩展的hr_expenses.py文件中实现这个功能而写的:

def po_generator(self, cr, uid, ids, arg, context=None):
            res = {}

            for expense in self.browse(cr, uid, ids, context=context):
                expense_line = self.pool.get('hr.expense.line')
                purchase_orders = self.pool.get('purchase.orders')

                for line in expense.line_ids:
                    expense_line_record = expense_line.search(cr, uid, [('id', '=', line.id)], context=context)
                    # pdb.set_trace()
                    purchase_orders.create(cr, uid,
                        {
                            'submitted_employee_name':expense.employee_id,
                            'dateofexpense':expense_line.date_value,
                            'project_id_expense':expense_line.project_id,
                            'Description':expense_line.name,
                            'netamount':expense_line.product_exc_VAT,
                            'raised_employee_name':expense.employee_id,
                            'project_id_account_type':expense_line.project_id_account_type,
                        },
                        context
                    )

            return res  

但是,当我尝试执行这段代码时,OpenERP给我报了一个'AttributeError'错误,错误信息如下:

文件 "/opt/openerp/custom_modules/legacy_expense_po/legacy_expense.py", 第121行,在po_generator中 'dateofexpense':expense_line.date_value, AttributeError: 'hr.expense.line'对象没有'date_value'这个属性

我猜这可能和Expenses表单中的line_ids字段有关。我想获取line_ids中的每一行,并把这些作为新记录输入到purchase_orders表中。

谢谢。

暂无标签

1 个回答

1

@Sagar Mohan

你在这里犯了一个非常基础的错误。

你已经在通过某个语句循环浏览记录了。

 for line in expense.line_ids:

当你说 expense.line_ids 时,这已经会拉取所有相关的记录,你不需要再通过写 expense_line_record = expense_line.search(cr, uid, [('id', '=', line.id)], context=context) 这样的语句去搜索。你要知道,在v7版本中,search方法返回的只是匹配记录的整数ID,而不是 recordset 或者 browse record

正确的代码是:

 def po_generator(self, cr, uid, ids, arg, context=None):
        res = {}
        purchase_orders = self.pool.get('purchase.orders')
        for expense in self.browse(cr, uid, ids, context=context):
            expense_line = self.pool.get('hr.expense.line')
            purchase_orders = self.pool.get('purchase.orders')
            for line in expense.line_ids:
                purchase_orders.create(cr, uid,
                    {
                        'submitted_employee_name':line.employee_id.name,
                        'dateofexpense': line.date_value,
                        'project_id_expense': line.project_id.id,
                        'Description': line.name,
                        'netamount': line.product_exc_VAT,
                        'raised_employee_name': expense.employee_id.name,
                        'project_id_account_type': line.project_id_account_type,
                    },
                    context
                )
        return res

这段代码可能需要根据你的需求进行调整,但你可以看到,line是一个直接的浏览变量,所以你只需要用点(.)来访问字段。

还有一点要注意的是,你在循环中永远不要使用self.pool.get,这样会让你的代码变得很重。

谢谢

撰写回答