我可以从OpenERP中的标准报告继承吗?

我可以从OpenERP中的标准报告继承吗?,openerp,reportlab,Openerp,Reportlab,我想在OpenERP 6.1中对采购订单报告进行更改。我是否必须进入并更改采购模块,或者我是否可以创建一个新模块来继承标准报告并覆盖某些详细信息。您不能完全继承另一个报告而只覆盖某些详细信息,但您可以替换标准报告,并使指向它的所有现有链接启动新报告 我们的模块包含一些用户想要的对采购订单报告的更改。这是用我们的文件替换的文件 <?xml version="1.0" encoding="utf-8"?> <openerp> <data>

我想在OpenERP 6.1中对采购订单报告进行更改。我是否必须进入并更改采购模块,或者我是否可以创建一个新模块来继承标准报告并覆盖某些详细信息。

您不能完全继承另一个报告而只覆盖某些详细信息,但您可以替换标准报告,并使指向它的所有现有链接启动新报告

我们的模块包含一些用户想要的对采购订单报告的更改。这是用我们的文件替换的文件

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <report 
            auto="False" 
            id="purchase.report_purchase_order" 
            model="purchase.order" 
            name="purchase.order.zaber"
            rml="zaber_purchase/report/order.rml" 
            string="Purchase Order"
            usage="default"/>
    </data>
</openerp>

因为它不是继承而是替换报告,所以您必须在您的版本中复制整个报告。报告的id必须与原始报告的id(包括模块名称)匹配。在上面的示例中,原始报表的id为
report\u purchase\u order
,并且它是
purchase
模块的一部分,因此您的报表id必须是
purchase.report\u purchase\u order
,才能替换它。名称必须与版本中的名称匹配,并且rml属性必须指向版本的名称


感谢您在OpenERP论坛上解释了大部分内容。

Don Kirkby有一个很好的答案,在我的头撞到墙上一个小时后,我想扩展一下。但是stackoverflow,以它的智慧,不会让我对它发表评论,因为我没有足够的代表点,所以相反,我会用一个没有答案的人来垃圾邮件这个问题

通过“id必须与原始报告的id匹配,包括模块名称”,Don意味着如果foomodule有
,那么在您的模块中,您需要说
。这是因为每个模块声明的ID位于该模块的命名空间中。如果您不引用另一个(您正在覆盖的那个)模块的命名空间,那么您只会创建一个同名的新报告,这是不好的


要了解更多信息,请查看数据库表
ir\u act\u report\u xml
,其中包含所有报告,以及
ir\u model\u data
,它们将报告(以及所有其他内容)与定义对象的xml的
id
属性关联起来。

RML解析器类作为服务在全局注册。例如,Sale Order解析器类在addons/Sale/report/Sale_Order.py中注册为

report_sxw.report_sxw('report.sale.order', 'sale.order', 'addons/sale/report/sale_order.rml', parser=order, header="external")
如果您试图创建另一个同名的解析器,您会得到一个错误:报告“sale.order”已经存在

替换sale.order解析器并使用自定义解析器类的一种简单方法是使用以下命令将其从全局服务注册表中删除:

from netsvc import Service
del Service._services['report.sale.order']
下面是一个完整的示例,我们使用它在没有折扣的情况下有条件地隐藏销售订单报告中的折扣列

from sale.report import sale_order
from report import report_sxw

# create a custom parser inherited from sale order parser:
class new_order_parser(sale_order.order):
    '''Custom parser with an additional method
    '''
    def __init__(self, cr, uid, name, context):
    super(new_order_parser, self).__init__(cr, uid, name, context=context)
    self.localcontext.update({
        'has_line_discount': self._has_line_discount,
    })

    def _has_line_discount(self, order):
        return any([l.discount for l in order.order_line])


# remove previous sale.report service :
from netsvc import Service
del Service._services['report.sale.order']

# register the new report service :
report_sxw.report_sxw(
 'report.sale.order',
 'sale.order',
 'addons/path/to/the/sale_order.rml',
 parser=new_order_parser
 )

谢谢你的反馈,@Phil。我在回答中对模块名称空间做了更多的解释。仅供我参考,您觉得示例模块的链接有用吗,还是让人困惑?顺便说一句,我认为您的答案没有任何错误。在堆栈溢出时,完全可以复制其他人的答案,然后将新信息添加到您的版本中。即使将多个不同的答案组合成一个综合答案,也会有帮助,而无需添加任何原始信息。欢迎访问该站点。示例模块很有帮助。我建议在XML中添加一个链接,定义您的示例模块替换的报告,这将使正确的关系更加明显。