首页 文章

openerp中的主 - 细节关系,变量范围,传递变量等

提问于
浏览
0

我正在写一个仓库管理模块,然后我进入了库存步骤 .

enter image description here

我需要分别为每个仓库分别制作库存,每个库存操作将作为主 - 细节关系保存在数据库中,即:

  • 基本数据的一条记录,如id,date,warehouse_id等,这将记录在(inventory)对象创建的表中 .

  • 许多记录将保留记录材料ID,库存ID,余额等的操作细节(每种材料一条记录),这将记录在表格(inventory_lines)中 .

在数据输入期间,当用户选择材料时,我需要检查其当前余额并将其显示在余额字段中 . 为了做到这一点,我需要知道仓库ID,因为每个仓库都应有单独的库存 .


我在很多仓库里存放了很多材料 . 例如:仓库A中可以有5个笔,仓库B中有10个笔,仓库C中有6个笔 .

首先,我选择仓库(A或B或C)---让我们说仓库B.

然后我选择材料(笔或笔记本或其他)---让我们说Pen

现在,我想搜索数据库以查找(仓库B)中的(笔)余额

我可以写一些东西 like 这个:

从inventory_lines中选择余额,其中material_id = mmmmmm和warehouse_id = wwwwww

所以,我需要获取材料ID(mmmmm)和仓库ID(wwwww)

这将由我选择的每种材料完成 .

仓库ID位于以下列中:对象中的inventory_id:inventory'storage_id':fields.many2one('makhazen.warehouse','仓库名称',required = True),

材质ID位于对象inventory_line的material_id中,如问题'material_id'中的图片所示:fields.many2one('makhazen.material','Material Name'),


我遇到了以下问题:

  • 我可以在material_id字段的表单视图中使用(on_change)方法,并且可以触发一个方法来搜索数据库中的余额,但我需要找不到的warehouse_id .

问题是: - 如何在openerp中处理这种主 - 细节关系?如何在主表和详细信息表之间传递值? - 我们如何扩展warehouse_id的范围,以便可以从模块中的任何方法看到它? - 我可以通过调用方法并在字典中返回所需的值来更改字段的值,但是如何相反(读取它们)?

这对我来说非常重要 .

1 回答

  • 1

    首先,您不需要wh_inventory_line类中的warehouse_id字段 . 您始终可以通过父对象访问它:

    inventory_line = self.pool.get('wh.inventory.line').browse(cr, uid, line_id)
    wharehouse_id = inventory_line.inventory_id.warehouse_id.id
    

    其次,在您的情况下,您可以将warehouse_id值作为参数传递给 onchange 方法 . 像这样的东西:

    <field name="material_id" 
        on_change="onchange_material_id(material_id, warehouse_id)"/>
    

    或者,如果您遵循我的第一个建议并从 wh_inventory_line 删除 warehouse_id

    <field name="material_id" 
        on_change="onchange_material_id(material_id, parent.warehouse_id)"/>
    

    编辑

    在OpenERP 6.0上测试后,我发现代码中存在一些错误 . 我只是想知道你是如何设法运行它的 .

    首先,您错过了 wh.inventory 模型的 warehouse_id 列定义中的引号('):

    _columns = {
        'date': fields.datetime('Date'),
        'warehouse_id': fields.many2one('wh.warehouse', 'Warehouse Name, required=True),
    

    其次, fields.char() 字段定义除了提供的 Field Name 之外还至少需要 size 参数 . 再次,您错过了以下行的引用:

    'notes': fields.char('Notes),
    

    这不是错误,而是您应该考虑的事项 - 您使用openerp-7标记标记了您的问题 . 在OpenERP v7中,不推荐继承 osv.osv . 继承自 osv.Model .

    如果我坚持你的错误,那是因为我向你提出的解决方案在我身边工作得很好 . 因此,某处必须存在一些小错误,这会阻止您的代码执行预期的操作 .

    这是我的测试代码 . 你可以尝试一下:

    wh.py

    # -*- encoding: utf-8 -*-
    
    import netsvc
    import pooler
    from osv import fields, osv
    
    
    class wh_warehouse(osv.osv):
        _name = 'wh.warehouse'
    
        _columns = {
            'name': fields.char('Name', 128),
            }
    
    wh_warehouse()
    
    class wh_material(osv.osv):
        _name = 'wh.material'
    
        _columns = {
            'name': fields.char('Name', 128),
            }
    
    wh_material()
    
    
    class wh_inventory(osv.osv):
        _name = 'wh.inventory'
    
        _columns = {
            'date': fields.datetime('Date'),
            'warehouse_id': fields.many2one('wh.warehouse', 'Warehouse Name', required=True),
            'inventory_line_ids': fields.one2many('wh.inventory.line', 'inventory_id', 'Inventory'),
            'notes': fields.char('Notes', 512),
            'balance_track': fields.boolean('Balance Track'),
            }
    
    wh_inventory()
    
    
    class wh_inventory_line(osv.osv):
        _name = 'wh.inventory.line'
    
        _columns = {
            'inventory_id': fields.many2one('wh.inventory', 'Inventory'),
            'material_id': fields.many2one('wh.material', 'Material'),
            'balance': fields.float('Balance'),
            'previous_balance': fields.float('Previous Balance'),
            'notes': fields.char('Notes', 512),
            }
    
        def onchange_material_id(self, cr, uid, ids, material_id, warehouse_id):
            return = {'value': {
                'notes': 'Selected material {0} and warehouse {1}'.format(material_id, warehouse_id), }
                }
    
    wh_inventory_line()
    
    # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
    

    wh_view.xml

    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
        <data>
            <record id="view_wh_inventory_form" model="ir.ui.view">
                <field name="name">wh.inventory.form</field>
                <field name="model">wh.inventory</field>
                <field name="type">form</field>
                <field name="arch" type="xml">
                    <form string="Warehouse Inventory">
                        <field name="date"/>
                        <field name="warehouse_id" widget="selection"/>
                        <field name="notes"/>
                        <field name="balance_track"/>
                        <field colspan="4" name="inventory_line_ids" widget="one2many_list">
                            <tree string="Details" editable="bottom">
                                    <field name="material_id" widget="selection" 
                                           on_change="onchange_material_id(material_id, parent.warehouse_id)"/>
                                <field name="balance"/>
                                <field name="previous_balance"/>
                                <field name="notes"/>
                            </tree>
                        </field>
                    </form>
                </field>
            </record>
    
            <record id="view_wh_inventory_tree" model="ir.ui.view">
                <field name="name">wh.inventory.tree</field>
                <field name="model">wh.inventory</field>
                <field name="type">tree</field>
                <field name="arch" type="xml">
                    <tree string="Warehouse Inventory">
                        <field name="date"/>
                        <field name="warehouse_id" widget="selection"/>
                        <field name="notes"/>
                        <field name="balance_track"/>
                    </tree>
                </field>
            </record>
    
            <record id="action_wh_inventory_form" model="ir.actions.act_window">
                <field name="name">Warehouse Inventory</field>
                <field name="res_model">wh.inventory</field>
                <field name="view_type">form</field>
                <field name="view_mode">tree,form</field>
                <field name="view_id" ref="view_wh_inventory_tree"/>
            </record>
    
            <menuitem
                action="action_wh_inventory_form"
                id="menu_wh_inventory_form" 
                parent="account.menu_finance" 
                />
    
            <!-- Sample data -->
    
            <record id="warehouse_1" model="wh.warehouse">
                <field name="name">Warehouse 1</field>
            </record>
            <record id="warehouse_2" model="wh.warehouse">
                <field name="name">Warehouse 2</field>
            </record>
            <record id="warehouse_3" model="wh.warehouse">
                <field name="name">Warehouse 3</field>
            </record>
            <record id="material_1" model="wh.material">
                <field name="name">Material 1</field>
            </record>
            <record id="material_2" model="wh.material">
                <field name="name">Material 2</field>
            </record>
            <record id="material_3" model="wh.material">
                <field name="name">Material 3</field>
            </record>
    
        </data>
    </openerp>
    

相关问题