如何将多个对象传递给报告引擎?
我正在尝试创建自定义发票报告,我需要附加其他应用程序中的数据以显示在发票上。我可以使用Web服务将数据导入OpenERP服务器,但如何将其传递给报告引擎?
set_context or (self.localcontext.update())
方法在这里很有用,因为它允许我将自定义变量传递给报表,但是如何传递整个对象。
我从其他应用程序导入的内容本质上是一个庞大的表,可能有100个与当前合作伙伴相关的记录,我不需要将其保存在OpenERP数据库中,只需在生成发票时显示它。 / p>
编辑:
测试解析器中的对象
class test_invoice(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(test_invoice, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'test_var': 'Worked!',
'get_list': self._get_list,
})
def _get_list(self):
result = []
ress = {'first': '1',
'second': '2',
}
result.append(ress)
return result
并在rml文件中
...start of rml file
<section>
<para>
[[ repeatIn(get_list(), 'g')]]
[[ g.first ]]
</para>
</section>
</story>
</document>
但这会引发错误“强制转换为Unicode:需要字符串或缓冲区,找到元组”。我们如何在rml中显示自定义列表?
谢谢。
答案 0 :(得分:2)
你可以将整个对象传递给OpenERP(好吧,你运行OpenERP的python)知道该对象。否则你必须'代理'对象是某种方式。使用SQLAlchemy从外部数据库中获取数据可能是一个极少数的解决方案。你可以用这样的东西:
[...somewhere into your parser...]
self.localcontext.update({'external_rows': session.query(MyObject).filter_by(foo='baz')})
或者如果您正在管理CSV数据:
self.localcontext.updarte({'external_rows': self._get_myrows_from_csv()})
其中_get_myrows_from_csv
返回例如字典列表。
答案 1 :(得分:2)
除了在RML文件中使用结果(字典)之外,您正在做正确的事情。试试
[[ g['first'] ]]
而不是
[[ g.first ]]
问题是您正在尝试将字典值作为对象属性进行访问。
答案 2 :(得分:1)
在RML文件中:
<story>
<section>
<para>[[ repeatIn(products(), 'p') ]]</para>
<blockTable colWidths="100.0,100.0" >
<tr>
<td>
<para>[[p.name]]</para>
</td>
<td>
<para>[[p.list_price]]</para>
</td>
</tr>
</blockTable >
</section>
</story>
在报告解析器中:
class myreport(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(myreport, self).__init__(cr, uid, name, context=context)
self.cr = cr
self.uid = uid
self.context = context
self.localcontext.update({
'products': self._get_products
})
def _get_products(self, ids=[85, 81, 89]):
return [p for p in self.pool.get('product.product').browse(self.cr, self.uid, ids, self.context)]
我希望它会有用。