在 OpenERP v7 中,报告问题可能涉及多个方面,包括报告模板的设计、数据源的配置、报告生成的逻辑等。然后再我们日常使用中还是会遇到各种各样的问题,那么如果出现下面的错误,可以尝试用我的解决方案。
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_sxwclass 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.0uom = objects[0].product_uom.namefor obj in objects:total += obj.product_qtyreturn {'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 InventoryInventory
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 InventoryInventory
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
对象。
总体来说,当我们在在解决报告问题时,重要的是仔细分析问题并逐步排除可能的原因,可能需要结合调试技术、日志分析以及与社区的交流来解决问题。如果有不懂可以贴上代码帮助大家解决问题。