因公司業務需求,想在產生倉庫物料調撥的時候,同時產生一筆快遞單(因為公司不同的倉庫不在同乙個地方),調撥單是在計算物料需求時產生的,所以我就想覆寫計算物料需求的方法,在執行完原來的業務邏輯以後,再根據內部需求處理後面的邏輯。
開始寫的方法如下:
class rhwl_order(osv.osv):
_inherit = "procurement.order"
def run_scheduler(self, cr, uid, use_new_cursor=false, company_id=false, context=none):
super(rhwl_order,self).run_scheduler(cr,uid,use_new_cursor,company_id,context)
move_obj = self.pool.get("stock.move")
move_ids = move_obj.search(cr,uid,[('state','not in',['done','cancel']),('express_no','=',false)],context=context)
呼叫完父物件方法以後,馬上執行search查詢待處理的資料,但奇怪的是每次搜尋到的內容都是為空。
後來跟蹤呼叫發現此方法是系統另外程序來處理的,與當前操作的程序不一樣,**可參考addons\procurement\wizard\schedulers_all.py中的procure_calculation方法。
threaded_calculation = threading.thread(target=self._procure_calculation_all, args=(cr, uid, ids, context))
threaded_calculation.start()
在另外的程序處理中,cr變數代表的資料庫連線游標已經發生了變化,所以我在後面的search中,使用原來的cr變數,可能就找不到資料了。
class rhwl_order(osv.osv):
_inherit = "procurement.order"
def run_scheduler(self, cr, uid, use_new_cursor=false, company_id=false, context=none):
super(rhwl_order,self).run_scheduler(cr,uid,use_new_cursor,company_id,context)
try:
if use_new_cursor:
cr = openerp.registry(cr.dbname).cursor()
move_obj = self.pool.get("stock.move")#('warehouse_id','=',1),('rule_id','>',0),
move_ids = move_obj.search(cr,uid,[('state','not in',['done','cancel']),('express_no','=',false)],context=context)
#內部業務邏輯處理
if use_new_cursor:
cr.commit()
finally:
if use_new_cursor:
try:
cr.close()
except exception:
pass
return {}
經測試後,可以達到預期的處理效果。
覆寫 重寫(override)
如果子類定義了與父類完全相同 不算許可權 的方法或者屬性的時候,這種操作就稱為覆寫。子類定義了與父類方法名稱,引數列表,方法返回值完全相同的方法。子類不能擁有比父類更嚴格的訪問控制許可權。並且不能出現private關鍵字 判斷呼叫的是父類方法還是子類方法 a.看new 在哪 當前使用的物件是通過哪個...
Java覆寫詳解
覆寫 如果子類定義了與父類相同的屬性或方法,這個操作就稱為覆寫 方法的覆寫 子類定義了與父類方法名稱,引數型別,及個數完全相同的方法,但是覆寫不能有比父類更嚴格的訪問控制許可權 觀察簡單覆寫 package testoverride author weiwei description 簡單的覆寫 c...
GOT表覆寫技術
概念 每乙個外部定義的符號在全域性偏移表 global offset table 中有相應的條目,got位於elf的資料段中,叫做got段。作用 把位置無關的位址計算重定位到乙個絕對位址。程式首次呼叫某個庫函式時,執行時連線編輯器 rtld 找到相應的符號,並將它重定位到got之後每次呼叫這個函式都...