【问题标题】:How to create a summary table of an one2many table in OpenERP7?如何在 OpenERP7 中创建 one2many 表的汇总表?
【发布时间】:2015-05-25 10:26:44
【问题描述】:

我有树模型:res.partnermy_categorypartner_my_category_rel。合作伙伴和类别之间的关系是many2many,但是我需要在关系表中存储一些属性(不仅是ID,还有注册日期),所以,你可能知道,我有由我自己创建中间表(我将其命名为partner_my_category_rel)。因此,在res.partner 中,我有一个one2many 字段指向表partner_my_category_rel

现在我想创建一个汇总表。汇总表每个类别只能显示一行(此行将是最后注册日期的行)。

示例:合作伙伴两次属于黄金类别(注册日期分别为 19/09/0831/12/09)和类别 silver 一次(注册日期 20/04/13。汇总表必须只显示两行,每个 gold 一行,每 silver 一个(31/12/0920/04/13)。

但是我每行添加了一个按钮Open History,以查看每个类别的所有记录,所以如果我点击类别gold行中的这个按钮,一个弹出窗口将打开,我将能够在树形视图中看到类别 gold 的两条记录。

完成(使用 type="one2many" 的函数字段)。但它们必须是可编辑的。现在我的问题出现了。如果我开始编辑记录,即使我不保存更改,当我关闭表单时,没问题,但这样做之后,如果我切换到其他合作伙伴并重复相同的过程,我会在关闭时收到 JavaScript 错误形式:

未捕获的类型错误:无法读取未定义的属性“get”

我尝试了两种方法(在历史的树形视图中添加属性editable="bottom",并创建一个表单以便能够编辑历史记录单击它们)。两种情况都会出现JS错误。

我不明白为什么(这与特定记录无关,因为我第一次打开的合作伙伴无关紧要,不会引发错误,但我稍后打开的其他合作伙伴会这样做)。

编辑表单的案例

按钮的代码打开历史记录

def open_history(self, cr, uid, ids, context=None):
    """ Utility method used to add an "Open History" button in partner views """
    partner_my_category_obj = self.browse(cr, uid, ids[0], context=context)
    data_obj = self.pool.get('ir.model.data')
    form_data_id = data_obj.get_object_reference(cr, uid, 'res_partner_extended', 'partner_category_rel_edit_form_view')
    tree_data_id = data_obj.get_object_reference(cr, uid, 'res_partner_extended', 'partner_category_rel_tree_view')
    form_view_id = form_data_id and form_data_id[1] or False
    tree_view_id = tree_data_id and tree_data_id[1] or False
    return {
        'name': _('History of "%s"') % partner_my_category_obj.category_id.name,
        'view_type': 'form',
        'view_mode': 'form',
        'view_id': False,
        'views': [(tree_view_id, 'tree'), (form_view_id, 'form'),],
        'res_model': 'partner.category.rel',
        'domain': '[("partner_id", "=", %d), ("category_id", "=", %d)]' % (partner_my_category_obj.partner_id, partner_my_category_obj.category_id.id),
        'type': 'ir.actions.act_window',
        'target': 'new',
        'flags': {'tree': {'action_buttons': True},
                  'form': {'action_buttons': True},}
    }

树视图

的代码
<record id="partner_category_rel_tree_view" model="ir.ui.view">
    <field name="name">partner.category.rel_tree</field>
    <field name="model">partner.category.rel</field>
    <field name="type">tree</field>
    <field name="arch" type="xml">
        <tree string="Categories">
            <field name="registration_date" />
        </tree>
    </field>
</record>

编辑表单视图

的代码
<record id="partner_category_rel_edit_form_view" model="ir.ui.view">
    <field name="name">partner.category.rel.edit.form</field>
    <field name="model">partner.category.rel</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form string="Category" create="false" version="7.0">
            <group>
                <group col="4">
                    <field name="registration_date" required="1" />
                </group>
            </group>
        </form>
    </field>
</record>

有人可以帮帮我吗?

【问题讨论】:

    标签: python xml openerp odoo openerp-7


    【解决方案1】:

    根据您的描述,我认为您的模型设计是错误的。

    你想拥有:

    [Partner] -->N [Partner Category] -->N [Partner Category Dates]
    

    或者也许使用更扁平的模型结构:

    [Partner] -->N [Partner Category Dates]
    

    在最后一种情况下,您将有一个额外的计算字段Is latest?True 用于每个合作伙伴/类别的最后一条记录,否则False。在此字段上使用过滤器可以获得您想要的效果,并且较早的日期仍然是商店并且可以列出。如果甚至可以考虑使用active 保留字段来实现该效果。

    【讨论】:

    • 谢谢@Daniel。我喜欢你使用函数字段is_latest 的想法,这样我可以使用带有域[('is_latest', '=', True)] 的one2many 字段,而不是使用one2many 类型的函数字段(我认为这是JS 错误的可疑之处)。我不太了解您建议我的模型,但我将尝试使用该字段并评论结果。
    • 我尝试做下一个:在partner_category_rel 中我添加了一个名为is_latest 的字段,这是一个布尔类型的函数字段。它工作完美。问题又是按钮 Open History,仍然给出 JS 错误。我不明白为什么!
    • 您不需要该方法:让按钮运行具有适当域的 XML 窗口操作应该可以做到。您记录了域过滤器所需的所有字段:合作伙伴和类别。
    • 再次感谢@Daniel。我删除了 python 函数并创建了一个 XML 操作,但问题完全相同。如果我在任何合作伙伴中单击打开历史记录,然后关闭弹出窗口,一切正常。但是如果我去上一个或下一个伙伴(点击屏幕右上角的左/右箭头)并重复相同的过程,当我关闭弹出窗口时,就会出现 JS 错误。目前我发现解决此问题的唯一方法是将动作的targetnew 变为current...这样弹出窗口不再是弹出窗口,当返回时,没有JS错误。
    【解决方案2】:

    我刚刚找到了解决办法!!

    当我单击按钮关闭丢弃保存时出现问题,弹出窗口关闭并且type=的函数字段“one2many”没有时间重新加载。

    所以我在函数字段中添加了一个选项:

    <field name="summary" options="{'reload_on_button': True}">
       <tree>
          ...
       </tree>
    </field>
    

    reload_on_button 选项似乎在每次单击修改它的按钮时重新加载功能字段。

    感谢您的帮助。希望这对任何人都有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-14
      • 2016-02-07
      相关资源
      最近更新 更多