У меня есть два функциональных поля в OpenERP, которые не хранятся в db. Фактически, они не имеют столбцов в db. Они вычисляются «на лету» из других таблиц. Я хочу иметь возможность рассчитать их сумму или разницу. Я увидел что-то здесь (calculate sum of fields), что делает это, но я думаю, что он отправляется в db для извлечения данных. Пожалуйста, как я могу это достичь. Лучше всего хранить данные в db и вытаскивать их оттуда?Как вычислить сумму/разницу двух функциональных полей в OpenERP
ответ
Их может быть альтернативным решением, например, определить третье поле вычисления и использовать «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"),
}
Как я объяснил снова поле с несколькими будут рассчитаны, но та же функция поэтому тип возвращаемого будет
# 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}
}
С уважением
You может объединить функциональные поля с ключевым словом 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()
Имейте в виду, этот пример упрощен и отсутствует «тип» ключевое слово для поля функции просто сохранить этот пример чистой и указывают на важность «мульти» ключевое слово