2016-06-21 11 views
1

Ich habe zwei Objekte, "Artikel" und "MVT", die Logik hinter dem Modul versucht zu erstellen ist, dass ein Artikel durch einen Namen und einen Preis definiert ist, aber die Menge durch berechnet wird eine reihe von transaktionen oder "bewegungen", jede bewegung hat eine realität von vielen2 mit einem artikel, einem datum und einer qte, das letzte feld kann entweder positiv oder negativ sein (positiv bedeutet, dass wir neue artikel hinzugefügt haben, negativ das gegenteil), also hier der code, den ich verwendet habe, bin ich irgendwie neu zu openErp.Abfrage eines Objekts in OpenErp 7

class article(osv.osv): 

_name = 'cm.article' 

def _get_qte(self, cr, uid, ids, fld_name, arg, context=None): 
    result = {} 
    mvtObject=self.pool.get('cm.mvt') 
    mvtids=mvtObject.search(cr,uid,[]) 
    sum = 0 
    for id in mvtids: 
     mvt_line=mvtObject.browse(cr,uid,id,context) 
     if mvt_line.article.id == ids[0]: 
      sum = sum + mvt_line.qte 
    result[sum] = sum 
    return result 
_columns = { 
     'name': fields.char(size=32, string='Nom', required=True), 
     'pu':fields.float(required="True",string='Prix Unitaire'), 
     'qte': fields.function(_get_qte,type='integer',obj="cm.article",method=True,string='Quantity'), 
} 
article() 


class mvt(osv.osv): 
    _name = 'cm.mvt' 
    _columns = { 
     'article' : fields.many2one('cm.article', 'name'), 
     'date' : fields.datetime(string="Date Mouvement"), 
     'qte':fields.integer(String="Quantity") 
    } 
    _defaults = {'date' : fields.date.context_today} 
mvt() 

Vielen Dank im Voraus.

Antwort

1

Wir haben etwas sehr ähnliches getan und es hat perfekt funktioniert.

Vorsicht, nach einer großen Anzahl von Transaktionen wird der Code langsam, da Sie jedes Mal, wenn Sie das Formular öffnen, neu berechnen müssen. Sie müssen einen "Bereinigungs" -Wizard schreiben, der Transaktionen, die älter als drei Jahre sind, zusammenfasst. Alles hängt von der Anzahl der Transaktionen und der lokalen Gesetzgebung ab.

Um die Bewegungen für jede Transaktion Zugriff auf die folgende Zeile in den Spalten in Ihrem Artikel Modell hinzufügen:

'art_movements':fields.one2many('cm.history', 'article', 'Movements'), 

würde ich vorschlagen, dass Sie eine Beschreibung Feld an die mvt-Klasse hinzufügen:

'name':fields.char('Short movement description'), 

Um alle Daten, die Sie xML verwenden, die wie folgt aussieht:

<record model="ir.ui.view" id="view_articles_form"> 
    <field name="cm.article">Articles.form</field> 
    <field name="model">cm.article</field> 
    <field name="type">form</field> 
    <field name="arch" type="xml"> 
     <form string = "Articles" version="7.0" create="false" edit="false"> 
      <sheet> 
       <group> 
        <field name="name" readonly="True"/> 
        <field name="pu" readonly="True" /> 
        <field name="qty" readonly="True"/> 
       </group> 
       <field name="art_movements"> 
        <tree string="History" default_order="date"> 
         <field name="name"/> 
         <field name="date"/> 
         <field name="qte"/> 
        </tree> 
       </field> 
      </sheet> 
     </form> 
    </field> 
</record> 

Meine Vermutung ist, dass die Ursache Ihres Problems im Funktionsfeld liegt, da zwischen den beiden Tabellen keine Verbindung bestand. Der obige Code sollte es beheben, aber Ihr Funktionsfeld ist nicht korrekt, siehe unten (Sie müssen den Code verifizieren, da ich ihn nicht getestet habe, aber das Prinzip ist korrekt).

Beachten Sie, dass, wenn in art_movements keine Datensätze vorhanden sind, ein Wert von Null zurückgegeben wird.

+0

Vielen Dank, das Problem ist jetzt, wie man die Bewegungen abfragt, die zu dem aktuellen Artikel gehören. Dieser Code gibt mir einen seltsamen Fehler: KeyError 1 –

+0

Danke Mann, das hat das Problem gelöst! –