これは、メソッドが 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
オーバーライドし、フィールドの値を計算できます。ただし、この場合、ユーザーは「オン フライ」列の新しい値を確認できません。create
sale.order.line
これがお役に立てば幸いです。
考える価値のあるもう 1 つのこと (独自のアプローチを使用する場合)。複数の人が同時に 1 つの注文に取り組んでいるとします。