3

複数のオブジェクトをレポート エンジンに渡すにはどうすればよいでしょうか。

請求書に表示される他のアプリケーションからのデータを添付する必要があるカスタム請求書レポートを作成しようとしています。Web サービスを使用して OpenERP サーバーにデータを取得できますが、それをレポート エンジンに渡すにはどうすればよいですか? おそらく、

set_context or (self.localcontext.update())

メソッドはカスタム変数をレポートに渡すことができるので便利ですが、オブジェクト全体を渡すにはどうすればよいでしょうか。

他のアプリケーションからインポートしているのは、基本的に、現在のパートナーに関連する数百のレコードを含む可能性のある大規模なテーブルです。OpenERP データベースに保存する必要はなく、請求書の生成中に表示するだけです。

編集:

パーサーにあるオブジェクトをテストするには

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 でカスタム リストを表示するにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

2

RML ファイルで結果 (辞書) を使用することを除いて、すべて正しく実行されています。試す

[[ g['first'] ]]

それ以外の

[[ g.first ]]

問題は、辞書の値にオブジェクト プロパティとしてアクセスしようとしていることです。

于 2013-11-23T05:15:15.813 に答える
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()})

where_get_myrows_from_csvは、たとえば辞書のリストを返します。

于 2012-11-30T18:44:11.150 に答える
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)]

役に立つことを願っています。

于 2015-10-01T12:31:01.070 に答える