掌握openerp中的详细关系、变量范围、传递变量等

掌握openerp中的详细关系、变量范围、传递变量等,openerp,master-detail,openerp-7,Openerp,Master Detail,Openerp 7,我正在写一个仓库管理模块,我进入了库存步骤 我需要不时对每个仓库单独进行盘点,每个盘点操作将作为主-明细关系保存在数据库中, 即: 一条基本数据记录,如id、日期、仓库id等,以及 这将记录在由库存对象创建的表中 许多记录将保留操作的详细信息,每种材料记录一条记录,记录材料id、库存id、余额等,并记录在表库存行中 在数据输入过程中,当用户选择物料时,我需要检查其当前余额,并将其显示在“余额”字段中。为了做到这一点,我需要知道仓库id,因为每个仓库都有单独的库存 我在许多仓库里储存了许多材料。

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

我需要不时对每个仓库单独进行盘点,每个盘点操作将作为主-明细关系保存在数据库中, 即:

一条基本数据记录,如id、日期、仓库id等,以及 这将记录在由库存对象创建的表中

许多记录将保留操作的详细信息,每种材料记录一条记录,记录材料id、库存id、余额等,并记录在表库存行中

在数据输入过程中,当用户选择物料时,我需要检查其当前余额,并将其显示在“余额”字段中。为了做到这一点,我需要知道仓库id,因为每个仓库都有单独的库存

我在许多仓库里储存了许多材料。 例如:我可以在a仓库拥有5支钢笔,在B仓库拥有10支钢笔,在C仓库拥有6支钢笔

首先,我选择仓库A或B或C,比如说仓库B

然后我选择材料笔或笔记本或任何我们说的笔

现在,我想搜索数据库以找到B仓库中Pen的余额

我可以这样写:

从库存行中选择余额,其中物料id=mmmm,仓库id=WW

因此,我需要获取物料id mmmmm和仓库id wwwww

我选择的每种材料都会这样做

仓库id位于对象:存货中的列:存货\u id中 “仓库id”:字段.many21“makhazen.warehouse”,“仓库名称”,必填=True

物料id位于问题图片中对象库存行的“物料id”列中 'material_id':字段.many21'makhazen.material','material Name'

我面临以下问题:

我可以在material_id字段的form视图中使用on_change方法,并可以触发一个方法来搜索数据库中的余额,但我需要无法获取的warehouse_id。 问题是: -openerp中如何处理主-细节关系?如何在主表和明细表之间传递值? -我们如何扩展仓库id的范围,以便从模块中的任何方法都可以看到它? -我可以通过调用一个方法并在字典中返回所需的值来更改字段的值,但是如何执行相反的操作来读取它们呢


这对我来说非常重要。

首先,您不需要wh\u inventory\u line类中的warehouse\u 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)"/>
编辑

在OpenERP6.0上测试后,我发现您的代码中有一些错误。我只是想知道你是怎么做到的

首先,您在wh.inventory模型的warehouse\u id列定义中遗漏了一个引号\:

第二,fields.char字段定义在提供的字段名之外至少使用size参数。同样,您在以下行中遗漏了一个报价:

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

不是一个错误,而是你应该考虑的问题-你用opelp7标签来标记你的问题。在OpenERP v7中,不推荐继承自osv.osv。改为从osv.Model继承

如果我坚持你的错误,那是因为我向你提出的解决方案对我来说很有效。因此,一定有一些小错误阻止了代码执行预期的操作

这是我的测试代码。你可以试试:

白兰地

wh_view.xml


谢谢,但是对于第二段代码,我已经完全做到了,但是我收到一条错误消息,说它找不到字段“warehouse\u id”。那是因为它在另一个班级。这个问题可以解决吗?或者我应该按照您的建议从inventory\u line类中删除warehouse\u id吗?
_columns = {
    'date': fields.datetime('Date'),
    'warehouse_id': fields.many2one('wh.warehouse', 'Warehouse Name, required=True),
         'notes': fields.char('Notes),
# -*- 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:
<?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>