2012-05-15 5 views
1

У меня есть два функциональных поля в OpenERP, которые не хранятся в db. Фактически, они не имеют столбцов в db. Они вычисляются «на лету» из других таблиц. Я хочу иметь возможность рассчитать их сумму или разницу. Я увидел что-то здесь (calculate sum of fields), что делает это, но я думаю, что он отправляется в db для извлечения данных. Пожалуйста, как я могу это достичь. Лучше всего хранить данные в db и вытаскивать их оттуда?Как вычислить сумму/разницу двух функциональных полей в OpenERP

ответ

4

Их может быть альтернативным решением, например, определить третье поле вычисления и использовать «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} 
    } 

С уважением

4

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

Имейте в виду, этот пример упрощен и отсутствует «тип» ключевое слово для поля функции просто сохранить этот пример чистой и указывают на важность «мульти» ключевое слово