0

我想知道我们如何将一个金额转换为opnerp7. 我定义了一个功能字段来实现这一点,但它在我的数据库中创建了一个字段而不是数据,任何人都可以指出我错在哪里,我可以在这里发布我的示例源

看法:

<field name="amount_words"/>

蟒蛇代码

返回转换金额的函数 -

def _amount_in_words(self, cr, uid, ids, field_name, arg, context=None):

    cur_obj = self.pool.get('res.currency')
    res = {}
    for order in self.browse(cr, uid, ids, context=context):
        taxed = untaxed = 0.0
        res[order.id] = {
            'amount_words': '0.0',
                        }
        val = val1 = 0.0
        cur = order.pricelist_id.currency_id
        for line in order.order_line:
            val1 += line.price_subtotal
            val += self._amount_line_tax(cr, uid, line, context=context)

        taxed = cur_obj.round(cr, uid, cur, val)
        untaxed = cur_obj.round(cr, uid, cur, val1)

        res[order.id]['amount_words'] = amount_to_text(float(taxed + untaxed))

    return res[order.id]['amount_words']

功能字段声明

'amount_words': fields.function(_amount_in_words, string='In Words', type="char", store=True, help="The amount in words"),

注意: -'amount_to_text' 是我的应用程序全局函数,它提供了我想要的东西,但我无法将相同的数据传递到我的视图中???

'amount_to_text' 返回数据如下,如果我通过 amount_to_text(150) 它只返回一百五十卢比

4

1 回答 1

0

当您存储功能字段时,您需要提供触发器,以便 ORM 层知道何时应该重新计算和存储您的字段。但是,这主要适用于您有一个依赖于另一个模型的值的功能字段并且您希望通过不让它在每次显示值时计算数量来加速 OpenERP 的情况。

一个经典的用例是发票。发票上的总额是行的总和,因此为了加快速度,有一个触发的功能字段,以便每当发票行发生变化时,都会重新计算总额并将其存储在发票上。查看认证模块(OpenERP 插件)中的 account.invoice 或 sale.order 模型。

在您的情况下,覆盖 write 方法并测试值字典中是否有任何必填字段更有意义,如果是,则计算并以单词形式存储数量。

例如(从这里的记忆中提前道歉):

def write(self, cr, uid, ids, values, context = None):
    if 'quantity' in values or 'price_unit' in values:
        values['amount_in_words'] = _get_amount_in_words(....)

    return super(MyClass, self).write(cr, uid, ids, values, context = context)

不过有几点:

  1. 您将不得不调整“if field in values”测试以包含每个相关字段。最好只删除它并每次都这样做。
  2. 不要忘记也重写 create 方法。
  3. 记住一句古老的格言“早期优化是万恶之源”。你真的确定你需要用文字来坚持金额吗?
于 2013-07-14T09:47:53.980 回答