2013-12-23 52 views
0

我使用jasper在openerp中创建了2个报告。但是我对这两份报告使用了相同的解析器,第一份报告是“详细报告”,第二份报告是“摘要”。在追加到结果列表中的词典(命名数据)中,有关键日期,发票,借记和贷记。对于详细的报告,我只需要从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}] 

编辑: 代码是

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

它肯定可以使用Python来完成,但我认为这是最好能够通过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:

好吧,我坚持这是一个简单的办法,为环路之间运行和的if/else块。

但是,作为一位评论者指出,最好的解决方案可能是对您的数据库调用的逻辑进行一些更改。尽管如此,我还不知道在那里提出很好的改变。

+0

Thanks..it正常工作。 –

相关问题