2013-10-02 87 views
3

這裏是我的Python代碼:爲什麼OpenERP報表查詢結果因SQL查詢結果而異?

class sign_in_out_model_class(osv.osv): 
    _name = "sign.in.out" 
    _description = "Sign In/Out Report" 
    _auto = False 
    _columns = { 
     'name': fields.char('Emp No', size=128, readonly=True,select=True), 
     'reldate':fields.char('Date', readonly=True,select=True), 
     'sign_in': fields.char('Sign In', readonly=True,select=True), 
     'sign_out': fields.char('Sign Out', readonly=True,select=True), 
    } 
    _order = 'sign_in asc' 

    def init(self, cr): 
     tools.sql.drop_view_if_exists(cr, 'sign_in_out') 
     cr.execute("""CREATE OR REPLACE VIEW sign_in_out AS (
         select max(dup_id) as id,name, 
to_char(min(date),'YY/MM/DD') as reldate, 
to_char(min(date),'HH12:MIam') as sign_in, 
to_char(max(date),'HH12:MIam') as sign_out 
from text_based_attendance 
group by date(date),name)""") 

sign_in_out_model_class() 

低於輸出,使

result in openerp

但是當我在pgAdmin的運行查詢它給出以下結果

pgAdmin result

我需要知道這種差異的原因是什麼? 我的編碼有問題嗎?

+0

你可以在圖片1中看到,這是默認編號排序odoo _order由id這就是爲什麼順序是變化。 –

回答

0

光標類由psycopg2定義並由Odoo框架延長。這意味着你可能會認爲你使用cr.execute執行原始查詢,但你不是。

檢查sql_db.py文件類Cursor和閱讀文檔存在。基本上cr對象是這個類的一個實例,並且這個類基本上包裝了改變功能的光標psycopg2。檢查execute方法那裏,你會看到,它不直接調用psycopg的execute方法,而它首先做一些處理。嘗試在那裏打印params以查看哪些參數最終傳遞。

最後,即使您使用的是原始的sql,您仍然在使用Odoo的ORM,這意味着還有其他參數/​​限制。

例如,在pgadmin上,您(可能)可以不受限制地訪問數據,但使用光標您具有與self.env.uid中的用戶相同的訪問權限。

此外,請檢查documentation,因爲緩存可能是您看到不同結果的原因。