2013-12-23 1 views
0

Я создаю 2 отчета в openerp используя яшму. Но я использую тот же парсер для двух отчетов, первый отчет - «подробный отчет», а второй - «резюме». В словаре (именованных данных), который добавляется к списку результатов, есть ключи, дата, счет, дебет и кредит. Для подробного отчета мне нужно только получить эти значения от account.move.line. Но для сводного отчета должна быть только одна строка для строк перемещения учетной записи, содержащих номер счета-фактуры. То есть мне нужно добавить дебетовые и кредитные линии для линий переноса с таким же номером счета и отобразить его как одну строку, как я могу это сделать в Python. Например, список результатовКак добавить (суммировать) два значения в словаре python на основе другого значения?

[{'invoice':1,'debit':10,'credit':10}, 
{'name':'b','invoice':2,'debit':10,'credit':18}, 
{'invoice':1,'debit':10,'credit':10}] 

и что мне нужно

[{'invoice':1,'debit':20,'credit':20}, 
{'invoice':2,'debit':10,'credit':18}] 

EDIT: Код

move_line_ids = move_line_pool.search(cr, uid, domain, context=context) 
     print 'move_line_ids', len(move_line_ids) 

     for move_line in move_line_pool.browse(cr, uid, move_line_ids, context=context): 
      group_by = grp = grp_acc = '' 
      debit = credit = bal = 0.0 
      if move_line.debit > 0.0: 
       debit = move_line.amount_residual 
      elif move_line.credit > 0.0: 
       credit = move_line.amount_residual 
      bal = debit - credit  
      if form_group_by == 'group_account_code': 
       group_by = 'ACCOUNT CODE : ' 
       grp = move_line.account_id.code or '' 
       grp_acc = move_line.account_id.name or '' 
      elif form_group_by == 'group_order_no': 
       group_by = 'ORDER : ' 
       grp = move_line.sale_id.name or '' 
      else: 
       group_by = 'INVOICE : ' 
       grp = move_line.invoice.number or '' 
      date = dt.strptime(str(move_line.date), '%Y-%m-%d').strftime('%d-%m-%Y') 

      data = { 
         'period': period, 
         'date': date, 
         'company': company or '', 
         'so': move_line.sale_id.name or '', 
         'invoice': move_line.invoice.number or '', 
         'po': '', 
         'status': '', 
         'ref': move_line.move_id.name or '', 
         'debit': debit, 
         'credit': credit, 
         'bal': bal, 
         'fc': '', 
         'f_amt': '', 
         'trx': move_line.journal_id.code or '', 
         'account': move_line.account_id.name or '', 
         'account_code': move_line.account_id.code or '', 
         'acc_range': acc_range, 
         'group_by': group_by, 
         'grp': grp, 
         'grp_acc': grp_acc, 
      } 

      result.append(data) 

     if form_group_by == 'group_account_code': 
      result = sorted(result, key=lambda k: k['account_code']) 
     elif form_group_by == 'group_order_no': 
      result = sorted(result, key=lambda k: k['so']) 
     else: 
      result = sorted(result, key=lambda k: k['invoice']) 
     return result 

Только учти ключи invoice,debit and credit в словаре, другие не нужны для обновления, если счет-фактура одинаковый.

+2

Он уверен, может быть сделано с питоном, но я считаю, что лучше сделать с помощью SQL GroupBy/сумму. Пожалуйста, покажите код, как вы производите первый вывод. – alko

+0

@alko Я обновил вопрос .. –

ответ

1

не может быть оптимизирован ответ ...

li_dict =[{'invoice':1,'debit':10,'credit':10},{'name':'b','invoice':2,'debit':10,'credit':18}, 
{'invoice':1,'debit':10,'credit':10}, {'name':'b','invoice':2,'debit':10,'credit':18}] 


final_result = [] 
for dic in li_dict : 
    temp_dict = {} 
    flag = False 

    for dic_f in final_result: 
     if 'invoice' in dic and 'invoice' in dic_f: 
      if dic['invoice'] == dic_f['invoice']: 
       dic_f['debit'] = dic['debit'] + dic_f['debit'] 
       dic_f['credit'] = dic['credit'] + dic_f['credit'] 
       flag = True 
       break 

    if not flag: 
     temp_dict['invoice'] = dic.get('invoice', 0) 
     temp_dict['debit'] = dic.get('debit', 0) 
     temp_dict['credit'] = dic.get('credit', 0) 
     final_result.append(temp_dict) 

print final_result 

Результат:

[{'credit': 20, 'invoice': 1, 'debit': 20}, {'credit': 18, 'invoice': 2, 'debit': 10}] 
+0

Это можно сделать легче, создав список позже, но если память важнее скорости, я бы пошел таким образом. – selllikesybok

+0

@ VignanBandi Спасибо .. это прекрасно работает. –

2

Предполагая, что я понимаю ваш вопрос, что-то, как это будет делать трюк:

sum_dict = {} 

for e in source_list: 
    if e["invoice"] in sum_dict.keys(): 
     sum_dict[e["invoice"]]["debit"]+=e["debit"] 
     sum_dict[e["invoice"]]["credit"]+=e["credit"] 
    else: 
     sum_dict[e["invoice"] = e 

result_list = [sum_dict[k] for k in sum_dict.keys()]

ETA:

Я ответил на основной вопрос, до кода добавляется. Будет обновляться.

ETA 2:

Хорошо, я стою это как легко исправить, чтобы запустить между для цикла и если/другое блок.

Однако, как отметил комментатор, лучшим решением, вероятно, является внесение некоторых изменений в логику для ваших вызовов db. Однако я не знаю достаточно, чтобы предложить хорошие изменения.

+0

Спасибо .. это хорошо работает. –

Смежные вопросы