OpenERP函數字段的應用

在ERP開發過程中經常會使用到某字段的值是由其他字段計算得來,並且有些還需要將計算的結果存入資料庫。

以上功能上OpenERP中是用field.function實現的

其中有種模式

a). 只計算,不存儲

這種方式比較簡單,只需要設定用來計算值的函數即可,函數分類method和function,method是指當前對象的方法,function是指一般的python函數,有特定簽名的函數

[python] view plaincopy

    ‘amount‘: fields.function(_amt,string=‘caption‘,method=True,type=‘float‘)  

If method is true, the signature of the method must be:

def fnct(self, cr, uid, ids, field_name, field_value, arg, context):

otherwise (if it is a global function), it should be:

def fnct(cr, table, ids, field_name, field_value, arg, context):

b).計算,並且要將計算的結果存儲到資料庫,然後在相關的字段發生變更時進行重算

此模式需要指定store參數

store Parameter

It will calculate the field and store the result in the table. The field will be recalculated when certain fields are changed on other objects. It uses the following syntax:

store = {
    ‘object_name‘: (
            function_name,
            [‘field_name1‘, ‘field_name2‘],
            priority)
}

It will call function function_name when any changes are written to fields in the list [‘field1‘,‘field2‘] on object ‘object_name‘. The function should have the following signature:

def function_name(self, cr, uid, ids, context=None):

Where ids will be the ids of records in the other object‘s table that have changed values in the watched fields. The function should return a list of ids of records in its own table that should have the field recalculated. That list will be sent as a parameter for the main function of the field.

请注意,function_name必须要能返回主函数所需要的ids的列表,即主函数的对象ID列表,而不是object_name所指的对象id.

[‘field_name1‘, ‘field_name2‘],

执行时,当发生属性变更事件,会进行比对object_name以及[‘field_name1‘, ‘field_name2‘],是否match,当成功match,将执行function_name,并以当前发生变更的对象id为参数

Here‘s an example from the membership module:

‘membership_state‘:
    fields.function(
        _membership_state,
        method=True,
        string=‘Current membership state‘,
        type=‘selection‘,
        selection=STATE,
        store={
            ‘account.invoice‘: (_get_invoice_partner, [‘state‘], 10),
            ‘membership.membership_line‘: (_get_partner_id,[‘state‘], 10),
            ‘res.partner‘: (
                lambda self, cr, uid, ids, c={}: ids,
                [‘free_member‘],
                10)
        }),

c).函數一次為多個計算字段提供值,設定multi=‘groupname‘

    multi is a group name. All fields with the same multi parameter will be calculated in a single function call.

函數的返回值格式需要調整為
[python] view plaincopy

    {id:{‘field1‘:value1},{‘field2‘:value2},
    id2:{‘field1‘:value1},{‘field2‘:value2}
    }  

這種模式比較不用擔心,如何去計算,何時去計算的問題,不過,如果計算值依賴於其他計算值時,就特別需要留意store裏面的priority參數

[python] view plaincopy

    store = {
        ‘object_name‘: (
                function_name,
                [‘field_name1‘, ‘field_name2‘],
                priority)
    }  

为提高执行效率,减少代码执行次数,这是有效的办法

OpenERP函數字段的應用

时间: 2024-11-06 03:28:44

OpenERP函數字段的應用的相关文章

學習日記:函數和對象

2016-2-21 1. Living without an aim is like sailing without a compass. 生活沒有目標,猶如航海沒有羅盤. 2. 無論是現實世界還是計算機世界,可讀性都是相當重要的,因為這涉及到人們的意識或者是認識效率,一般文字比數字的可理解性和可讀性要好,圖片的可讀性最強. a) 一般數學是比較抽象的,因為其中充滿著各種阿拉伯數字和已經不能再簡化的希臘字符. b) 數學家的得意之作就是覺得自己是在世界科學界的最巔峰. c) 我們能用數學工具處理

DB2常用函數總結

最近用DB2,数据库之间的差异还是很大的,好多函数都不一样 1.去空格 *DB2中:Ltrim()是去左边空格,rtrim()是去右边空格.*informix中:trim()就是去空格.用法:例:string a="  abc  ";     *DB2中:Ltrim(a)="abc  ";rtrim(a)="  abc",rtrim(ltrim(a))="abc";     *informix中:trim(a)="a

C/C++ 時間相關函數

最近在處理一些時間上面的問題,將這些函數整理一下囉 先從基本時間概念開始,比較要注意的應該是秒之下的時間單位 毫秒(ms):1秒=1000毫秒 之所以會看到這個時間單位是因為在影像處理裡面,如果是做到real-time的話 1秒要有30張frames,那就是一張frames要0.03333秒 C/C++中時間相關函數主要有兩個:clock()跟time() 這兩個函數都是在<time.h>裡面,使用的話要記得引用 clock() 函數定義 The C library function cloc

Math.Round函數

Math.Round這個函數的解釋是將值按指定的小數位數舍入,但並不就是四捨五入.這種舍入有時稱為就近舍入或四舍六入五成雙 其實在 VB, VBScript, C#, J#, T-SQL 中 Round 函數都是採用 Banker's rounding(銀行家舍入)演算法,即四舍六入五取偶.事實上這也是 IEEE 規定的舍入標準.因此所有符合 IEEE 標準的語言都應該是採用這一演算法的. 如果大家想要四舍五入,記得要加上參數MidpointRounding.AwayFromZero decim

Python 函數與常用模組 - 生成器並行運算

目前我們已經大致上都了解生成器了,但要怎麼實際應用呢?!接下來就要舉個例子 yield 保存了這個函數的中斷狀態,返回當前這個狀態的值,並且把函數停在這,想什麼時候回來執行就什麼時候回來執行. 通過yield實現單綫程的情況下,實現並發運算的效果 #!/usr/bin/env python3 # -*- coding:utf-8 -*- def consumer(name): print("%s 準備吃包子啦!" %name) while True: baozi = yield # b

對比:莫比烏斯反演與歐拉函數

最近題讓我非常困惑,貌似我現在已經完全分不清楚哪些題用莫比烏斯反演,哪些用歐拉函數. 下面簡單總結一下,莫比烏斯反演處理的是 求segma(gcd(x,y)) 1<=x<=n,1<=y<=m (見<能量項鍊>) gcd(x,y) = k   1<=x<=n 1<=y<=m  求x,y對數 (見<bzoj 2301  problem b>) 莫比烏斯反演原來是解決以上問題2的,大體思路是 設F(a,b,k)表示1<=x<=a

SQL窗口函數一例

需求: MSSQL,列出服務實例中所有數據庫的如下信息: 數據庫ID.數據庫名.創建日期.數據文件類型.數據文件大小.數據庫總大小.文件所在路徑. 寫法(後面的百分比為所花時間占比): -- 连接子查询 (47%) WITH cte_TotalSize AS ( SELECT database_id ,CAST(SUM(size) AS FLOAT)/128 AS [TotalSize(MB)] FROM sys.master_files GROUP BY database_id ) SELEC

SQL窗体函數一例

需求: MSSQL,列出服務實例中全部數據庫的例如以下信息: 數據庫ID.數據庫名.創建日期.數據文件類型.數據文件大小.數據庫總大小.文件所在路徑. 寫法(後面的百分比為所花時間占比): -- 连接子查询 (47%) WITH cte_TotalSize AS ( SELECT database_id ,CAST(SUM(size) AS FLOAT)/128 AS [TotalSize(MB)] FROM sys.master_files GROUP BY database_id ) SEL

ORACLE字符拆分函數,返回結果集

ORACLE不能像MSSQL那樣支持直接返回表類型,所以要先創建一種自定義類型.這裏用到的是嵌套表(Nested Table). -- Nested Table CREATE OR REPLACE TYPE split_str IS TABLE OF VARCHAR(100); / -- Function CREATE OR REPLACE FUNCTION fn_Split ( p_Str VARCHAR2, p_Delimiter VARCHAR2 ) RETURN split_str PI