1

OpenERPには、データベースに保存されていない2つの機能フィールドがあります。実際、データベースには列がありません。それらは他のテーブルからその場で計算されます。それらの合計または差を計算できるようにしたいと思います。私はここでそれを行う何か(フィールドの合計を計算する)を見ましたが、データをフェッチするためにデータベースに行くと思います。どうすればこれを達成できますか。データをデータベースに保存してそこからプルするのに最適なオプションはありますか?

4

2 に答える 2

4

関数フィールドをmultiキーワードと組み合わせて、1つの関数内で計算すると、3番目の関数フィールドを簡単に追加できます。

class your_class(osv.osv):
    _inherit = 'whatever'

    def calc_fields(self, cr, uid, ids, fields, arg, context=None):
        res = {}
        for record in self.browse(cr, uid, ids, context=context):
            res[record.id] = {
                'field1': 5, # Calculate the field values here
                'field2': 3, 
                'field3': 5+3,
            }
        return res

    _columns = {
        'field1': fields.function(calc_fields, multi='my_combination', string='Field 1'),
        'field2': fields.function(calc_fields, multi='my_combination', string='Field 2'),
        'field3': fields.function(calc_fields, multi='my_combination', string='Field 1 + Field 2'),
    }
your_class()

この例は単純化されており、この例をわかりやすくし、「multi」キーワードの重要性を示すために、関数フィールドに「type」キーワードがないことに注意してください。

于 2012-05-15T11:15:58.907 に答える
4

それらは、3番目の計算フィールドを定義し、「multi =''」を使用して差を計算するなどの代替ソリューションにすることができ、その3番目のフィールドをdbに保存するか、後で外部で使用する必要がある場合は動的に保つことができます。

ここでの利点は、3番目のフィールドの2フィールドストアの差分を計算した後です。

サンプルコードスニペットは次のとおりです。

class code_play(osv.osv):
_name = 'code.play'

def _calc_function(self, cr, uid, ids, fields_list, args, context=None):
    vals = {}
    for id in ids:
        fields = {}
        for field in fields_list:
            fields[field] = 10
        fields["calc3"] = fields['calc1'] + fields['calc2']
        vals[id] = fields
    return vals       

_columns = {
    'name': fields.char('Name', required=True, size=50),
    'calc1': fields.function(_calc_function, type='integer', store=False, multi="compute_person_data"),
    'calc2': fields.function(_calc_function, type='integer', store=False, multi="compute_person_data"),
    'calc3': fields.function(_calc_function, type='integer', store=False, multi="compute_person_data"),
}

もう一度説明したように、マルチのフィールドが計算されますが、同じ関数なので、リターンタイプは次のようになります。

    # when called with ``ids=[1,2,3]``, ``compute_person_data`` could return:
    {
        1: {'calc1': 10, 'calc2': 10, 'calc3': 20},
        2: {'calc1': 10, 'calc2': 10, 'calc3': 20},
        3: {'calc1': 10, 'calc2': 10, 'calc3': 20}
    }

よろしく

于 2012-05-15T11:10:49.977 に答える