如何计算OpenERP中两个函数字段的和/差

如何计算OpenERP中两个函数字段的和/差,openerp,Openerp,我在OpenERP中有两个未存储在db中的函数字段。事实上,它们在数据库中没有列。它们是从其他表格中动态计算出来的。我希望能够计算它们的和或差。我在这里看到了一些()可以做到这一点,但我认为它会去数据库获取数据。请问我如何才能做到这一点。将数据存储在数据库中并从数据库中提取数据的最佳选项是什么?它们可以是另一种解决方案,例如定义第三个计算字段并使用“multi=''”,还可以计算差异,您可以将第三个字段保存在数据库中,或者如果以后需要外部使用,可以将其保持动态 这里的优势是在计算完第三个字段的2

我在OpenERP中有两个未存储在db中的函数字段。事实上,它们在数据库中没有列。它们是从其他表格中动态计算出来的。我希望能够计算它们的和或差。我在这里看到了一些()可以做到这一点,但我认为它会去数据库获取数据。请问我如何才能做到这一点。将数据存储在数据库中并从数据库中提取数据的最佳选项是什么?

它们可以是另一种解决方案,例如定义第三个计算字段并使用“multi=''”,还可以计算差异,您可以将第三个字段保存在数据库中,或者如果以后需要外部使用,可以将其保持动态

这里的优势是在计算完第三个字段的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"),
}
正如我再次解释的,将计算带有multi的字段,但函数相同,所以返回类型将是

    # 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}
    }

关于

它们可以是替代解决方案,例如,定义第三个计算字段并使用“multi=”,还可以计算差异,您可以将第三个字段保存在db中,或者如果需要以后的外部使用,可以将其保持动态

这里的优势是在计算完第三个字段的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"),
}
正如我再次解释的,将计算带有multi的字段,但函数相同,所以返回类型将是

    # 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}
    }

关于

您可以将函数字段与multi关键字组合在一起,并在一个函数中计算它们,然后添加第三个函数字段将很容易

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()

请记住,此示例已简化,函数字段缺少“type”关键字。为了保持此示例的简洁性,并指出“multi”关键字的重要性,您可以将函数字段与multi关键字组合在一起,并在一个函数中计算它们,然后添加第三个函数字段将很容易

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()
请记住,这个示例简化了,缺少函数字段的“type”关键字,只是为了保持此示例的干净,并指出“multi”关键字的重要性