解决 OpenERP v7 中的报告问题

54 阅读2分钟

在 OpenERP v7 中,报告问题可能涉及多个方面,包括报告模板的设计、数据源的配置、报告生成的逻辑等。然后再我们日常使用中还是会遇到各种各样的问题,那么如果出现下面的错误,可以尝试用我的解决方案。

a2.png

1、问题背景

在使用 OpenERP v7 的 base_report_designer 模块创建产品对象的报告时,遇到一个问题。报告看起来似乎没有问题,但每次尝试打印时,都会出现一个错误:

Field 'product' does not exist in object 'browse_record(product.product, 12)'
​
(<type 'exceptions.AttributeError'>, AttributeError(KeyError("Field 'product' does not exist in object 'browse_record(product.product, 12)'",),), <traceback object at 0xc2801e4>)

这个问题通常发生在直接将文档保存到本地而不是发送到服务器时,但实际上并没有这样做。正在使用一个由自己编写的解析器,该解析器使用 product.product 模型,并且应该可以正常工作。下面是解析器的代码:

import time
from openerp.report import report_sxw
​
class reporte_locacion(report_sxw.rml_parse):
    def __init__(self, cr, uid, name, context):
        super(reporte_locacion, self).__init__(cr, uid, name, context=context)
        self.localcontext.update({
            'time': time,
            'qty_total': self._qty_total
        })
​
    def _qty_total(self, objects):
        total = 0.0
        uom = objects[0].product_uom.name
        for obj in objects:
            total += obj.product_qty
        return {'quantity': total, 'uom': uom}
​
report_sxw.report_sxw(
    'report.reporte.locacion',
    'product.product',
    'addons/stock/report/reporte_locacion.rml',
    parser=reporte_locacion,
    header='internal'
)

报告的 SXW 格式代码如下:

[[ repeatIn(objects,'o') ]] 
Stock Inventory
​
Inventory
Date
[[ o.name ]]
[[ formatLang(o.date,date_time=True) ]]
​
Location
Production Lot
Product 
Quantity
[[ repeatIn(o.product, 'p') ]]
[[ p.location_id.name ]]
[[ p.prod_lot_id  and p.prod_lot_id.name or '' ]]
[ [[ p.product_id.code ]] ] [[ p.product_id.name ]]
[[ formatLang(p.product_qty) ]] [[ p.product_uom.name ]]
​
Total:
[[ formatLang(qty_total(o.inventory_line_id)['quantity']) ]] [[ qty_total(o.inventory_line_id)['uom'] ]]

2、解决方案

这个问题是由于使用 repeatIn 循环时,没有正确地指定对象。在 report.reporte.locacion.rml 文件中,repeatIn 循环被用于在 product.product 对象上循环。但是,在 reporte_locacion 解析器中,objects 参数实际上是 stock.inventory 对象的列表,而不是 product.product 对象的列表。

为了解决这个问题,需要在 report.reporte.locacion.rml 文件中将 repeatIn 循环更改为在 stock.inventory.line 对象上循环。这样,就可以正确地访问 product 对象了。

修改后的 report.reporte.locacion.rml 文件如下:

[[ repeatIn(objects.inventory_line_id,'o') ]] 
Stock Inventory
​
Inventory
Date
[[ o.name ]]
[[ formatLang(o.date,date_time=True) ]]
​
Location
Production Lot
Product 
Quantity
[[ repeatIn(o.product_id, 'p') ]]
[[ p.location_id.name ]]
[[ p.prod_lot_id  and p.prod_lot_id.name or '' ]]
[ [[ p.code ]] ] [[ p.name ]]
[[ formatLang(o.product_qty) ]] [[ o.product_uom.name ]]
​
Total:
[[ formatLang(qty_total(o.inventory_line_id)['quantity']) ]] [[ qty_total(o.inventory_line_id)['uom'] ]]

修改后的代码中,repeatIn 循环现在是在 stock.inventory.line 对象上循环,而不是 product.product 对象上。这将允许报告正确地访问 product 对象。

总体来说,当我们在在解决报告问题时,重要的是仔细分析问题并逐步排除可能的原因,可能需要结合调试技术、日志分析以及与社区的交流来解决问题。如果有不懂可以贴上代码帮助大家解决问题。