1

モデルのフォーム ビューがあり、値が自動的に増加するsale.order.lineというフィールド (シーケンス フィールド) を作成しました。' niu '

在庫のある製品タイプごとに、正常に機能しているフォームに追加しますが、スタック可能な製品を追加すると値が増加するため、問題がありますが、[保存] ボタンを押すと、シーケンスが自動的に変更されます。

以下の添付画像を参照してください。

ここに画像の説明を入力

ここに画像の説明を入力

これは、モデル内の「 niu 」フィールドと sale.order.line メソッドです。

niu = fields.Char(string="NIU", compute="_niu_validation", readonly=True, store=True)

@api.depends('product_id.product_tmpl_id.type')
def _niu_validation(self):
    for rec in self:
        if rec.product_id.product_tmpl_id.type == 'product' and not rec.niu:
                rec.niu = self.env['ir.sequence'].next_by_code('sale.order.line')

シーケンスを変更せず、初期番号を確立するにはどうすればよいですか?

4

1 に答える 1

2

これは、メソッドが PostgreSQL の nextval() 関数にnext_by_code()基づいて値を生成するためです。

オブジェクトnext_by_code()のメソッドを呼び出しました。ir.sequenceこのメソッドでは、 method を呼び出します_next()。体を見てみましょう:

def _next(self):
    if self.sequence_id.implementation == 'standard':
        number_next = _select_nextval(self.env.cr, 'ir_sequence_%03d_%03d' % (self.sequence_id.id, self.id))
    else:
        number_next = _update_nogap(self, self.sequence_id.number_increment)

    return self.sequence_id.get_next_char(number_next)

新しい値はnumber_nextを使用して生成されます。あなたの場合_select_nextval、呼び出されます:

def _select_nextval(cr, seq_name):
    cr.execute("SELECT nextval('%s')" % seq_name)

    return cr.fetchone()

ご覧のとおり、関数nextvalはクエリで呼び出されます。

使い方。

フォーム_niu_validationにいくつか追加すると、 OpenERPはメソッドを呼び出します。sale.order.lineオブジェクト(各行)がフィールドの値を計算するためniuです。あなたのメソッドでは、によって呼び出されnext_by_codeます。これは、保存する前に(GUI/ツリー ビューのみ)、postgreSQL がシーケンスを変更したことを意味します。[保存] ボタン (ヘッダー内)をクリックすると、システムが_niu_validation再度呼び出されます。

総括する。保存をクリックするまで、Odoo はツリー ビューに変更を適用しません。いくつかの変更を加えるtree viewと同時に、db でシーケンスが変更されます ( column の値を計算するためNIU)。しかし、行は db に保存されません。

ここでどのように機能するかを確認できます:path_to_odoo/openerp/addons/base/ir/ir_sequence.py

シーケンスを変更しないようにするために何ができますか?

行が保存されているときに、メソッドを削除し、メソッドを_niu_validationオーバーライドし、フィールドの値を計算できます。ただし、この場合、ユーザーは「オン フライ」列の新しい値を確認できません。createsale.order.line

これがお役に立てば幸いです。

考える価値のあるもう 1 つのこと (独自のアプローチを使用する場合)。複数の人が同時に 1 つの注文に取り組んでいるとします。

于 2016-03-02T21:19:52.077 に答える