3

OpenERP 6.1 の発注書レポートを変更したいと考えています。購入モジュールに変更を加える必要がありますか、それとも、標準レポートを継承して一部の詳細を上書きする新しいモジュールを作成できますか?

4

3 に答える 3

7

別のレポートを正確に継承して一部の詳細を上書きすることはできませんが、標準レポートを置き換えて、そのレポートへの既存のすべてのリンクで代わりに新しいレポートを起動することができます。

私たちのzaber_purchaseモジュールには、ユーザーが望んでいた注文書レポートへのいくつかの変更が含まれています。標準レポートを当社のレポートに置き換えるpurchase_report.xmlファイルを次に示します。

<?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_purchase_orderの一部であるため、レポート IDを置き換える必要があります。名前はバージョンのパーサー ファイルの名前と一致する必要があり、rml 属性はバージョンのRML ファイルを指している必要があります。purchasepurchase.report_purchase_order

OpenERP フォーラムでこのほとんどを説明してくれたmihaiに感謝します。

于 2012-07-20T23:57:52.783 に答える
3

Don Kirkby は良い答えを持っています。頭を壁に 1 時間ぶつけた後、それを拡張したいと思います。しかし、スタックオーバーフローは、十分な担当者ポイントを持っていないため、コメントすることはできません。代わりに、未回答で質問をスパムします。

「id は、モジュール名を含め、元のレポートの id と一致する必要があります」とは、ドンは、foomodule に がある場合<report id="fooreport" ...>、モジュールで と言う必要があることを意味します<report id="foomodule.fooreport" ...>。これは、各モジュールによって宣言された ID が、そのモジュールをスコープとする名前空間に存在するためです。他のモジュール (オーバーライドしているモジュール) の名前空間を参照しないと、同じ名前の新しいレポートが作成されてしまい、それが悪いことになります。

ir_act_report_xmlキックについては、すべてのレポートを含むデータベース テーブルとir_model_data、レポート (およびその他すべて) を、対象idを定義した XML の属性に関連付ける を確認してください。

于 2012-12-27T20:40:29.230 に答える
3

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")

同じ名前で別のパーサーを作成しようとすると、次のエラーが表示されます: The report "sale.order" already exists!

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
 )
于 2013-11-01T08:48:55.303 に答える