在 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 值为零。
我有两个对象,'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 值为零。