在 OpenErp 7 中查询一个对象

Querying an object in OpenErp 7

我有两个对象,'article' 和 'mvt',我试图创建的模块背后的逻辑是文章由名称和价格定义,但数量是通过一组交易或 'mouvements',每个 movement 都有一个 many2one 关系,其中包含一篇文章、一个日期和一个 qte,最后一个字段可以是正数或负数(正数表示我们添加了新文章,负数则相反),所以这是我用来执行此操作的代码,我是 openErp 的新手。

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

提前致谢。

我们做了一些非常相似的事情,而且效果很好。

请注意,在进行大量交易后,代码会变慢,因为每次打开表单时都必须重新计算。您将不得不编写一个 "purge" 向导来汇总超过三年的交易。这完全取决于交易数量和当地立法。

要访问每笔交易的变动,请将以下行添加到文章模型的列中:

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

我还建议您在 mvt 中添加一个描述字段 class:

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

要查看您将使用的所有数据,xml 如下所示:

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

我猜你的问题是出在函数字段,因为两个表之间没有link。上面的代码应该可以解决,但是你的function字段不对,见下文(我没有测试过,你需要验证代码,但是原理是正确的)。

def _get_qte(self, cr, uid, ids, fld_name, arg, context=None):

    res={}
    qty=0.0
    for record in self.browse(cr, uid, ids, context=context):    
        if record.art_movements:
            for movement in record.art_movements:
                qty=qty+movement.qte
        res[record.id] = qty
    return res

请注意,如果 art_movements 中没有记录,它将 return 值为零。