Das Wörterbuchaktualisierungssequenzelement # 0 hat die Länge 3; 2 ist erforderlich

76

Ich möchte dem Objekt Linien account.bank.statement.linedurch ein anderes Objekt hinzufügen, erhalte jedoch den folgenden Fehler:

"Das Wörterbuchaktualisierungssequenzelement # 0 hat die Länge 3; 2 ist erforderlich."

Hier ist mein Code:

def action_account_line_create(self, cr, uid, ids):
    res = False
    cash_id = self.pool.get('account.bank.statement.line')
    for exp in self.browse(cr, uid, ids):
        company_id = exp.company_id.id
        #statement_id = exp.statement_id.id
        lines = []
        for l in exp.line_ids:
            lines.append((0, 0, {
                'name': l.name,
                'date': l.date,
                'amount': l.amount,
                'type': l.type,
                'statement_id': exp.statement_id.id,
                'account_id': l.account_id.id,
                'account_analytic_id': l.analytic_account_id.id,
                'ref': l.ref,
                'note': l.note,
                'company_id': l.company_id.id
            }))

        inv_id = cash_id.create(cr, uid, lines,context=None)
        res = inv_id
    return res 

Ich habe es daran geändert, aber dann bin ich auf diesen Fehler gestoßen:

  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\workflow\wkf_expr.py", line 68, in execute
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\workflow\wkf_expr.py", line 58, in _eval_expr
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\tools\safe_eval.py", line 241, in safe_eval
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\tools\safe_eval.py", line 108, in test_expr
  File "<string>", line 0   
   ^
SyntaxError: unexpected EOF while parsing

Code:

def action_account_line_create(self, cr, uid, ids, context=None):
    res = False
    cash_id = self.pool.get('account.bank.statement.line')
    for exp in self.browse(cr, uid, ids):
        company_id = exp.company_id.id
        lines = []
        for l in exp.line_ids:
            res = cash_id.create ( cr, uid, {
                'name': l.name,
                'date': l.date,
                'amount': l.amount,
                'type': l.type,
                'statement_id': exp.statement_id.id,
                'account_id': l.account_id.id,
                'account_analytic_id': l.analytic_account_id.id,
                'ref': l.ref,
                'note': l.note,
                'company_id': l.company_id.id
            }, context=None)
    return res
rindra
quelle
Was ist Ihr aktuelles Objekt / Ihre aktuelle Klasse? Möchten Sie eine Linie direkt erstellen oder möchten Sie eine Linie als one2many in Ihr aktuelles Objekt einfügen? Hier besteht das Problem darin, dass Sie die Liste in create () nicht übergeben können. Sie müssen das Wörterbuch übergeben.
Sudhir Arya
danke für deine antwort, ich habe die hr_expense_expense geändert, um eine Zeile direkt in der Tabelle account_bank_statement_line nach dem Status hinzuzufügen: 'bestätige'
rindra

Antworten:

81

Dieser Fehler trat auf, weil Sie versuchen, das dictObjekt mithilfe einer falschen Sequenz- ( listoder tuple) Struktur zu aktualisieren .

cash_id.create(cr, uid, lines,context=None)versuchen, linesin dikt Objekt zu konvertieren :

(0, 0, {
    'name': l.name,
    'date': l.date,
    'amount': l.amount,
    'type': l.type,
    'statement_id': exp.statement_id.id,
    'account_id': l.account_id.id,
    'account_analytic_id': l.analytic_account_id.id,
    'ref': l.ref,
    'note': l.note,
    'company_id': l.company_id.id
})

Entfernen Sie die zweite Null aus diesem Tupel, um es ordnungsgemäß in ein Diktierobjekt umzuwandeln.

Versuchen Sie dies in der Python-Shell, um es selbst zu testen:

>>> l=[(0,0,{'h':88})]
>>> a={}
>>> a.update(l)

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    a.update(l)
ValueError: dictionary update sequence element #0 has length 3; 2 is required

>>> l=[(0,{'h':88})]
>>> a.update(l)
MBarsi
quelle
17

Ich habe diesen Fehler erhalten, als ich das Wörterbuch mit der falschen Syntax aktualisiert habe:

Versuchen Sie mit diesen:

lineItem.values.update({attribute,value})

anstatt

lineItem.values.update({attribute:value})
Ian Michel
quelle
Dies sollte die akzeptierte Antwort sein, damit alle von Google hierher kommen
Yoshi Askharoun
@YoshiAskharoun Die akzeptierte Antwort ist, was OP geholfen hat, nicht was allen anderen geholfen hat
TheTechRobo36414519
2

Eine der schnellen Möglichkeiten, aus Tupeln gleicher Länge ein Diktat zu erstellen:

>>> t1 = (a,b,c,d)
>>> t2 = (1,2,3,4)
>>> dict(zip(t1, t2))
{'a':1, 'b':2, 'c':3, 'd':4, }
AB Abhi
quelle