5

如果我选择一个部门需要在“笔记本部分”加载其员工,我有一个选择字段(多对一个部门字段)。如何在 openerp 7 中实现这一点?

如果我选择了相关的房地产 ID,则需要加载相关部门。如果选择部门,则需要在下一阶段加载相关工作人员

<record model="ir.ui.view" id="bpl_work_offer_form">
<field name="name">bpl.work.offer.form</field>
<field name="model">bpl.work.offer</field>
<field name="arch" type="xml">
<form string='bpl_work_offer' version='7.0'>
<sheet>

<group>
    <group>
        <field name='bpl_estate_id' />
        <field name='bpl_division_id' />
        <field name='user_id' />
    </group>
    <group>
        <field name='date_of_offer' />
        <field name='payment_type' />
        <field name='select_by' />
        <field name='no_of_workers' attrs="{'invisible':[('select_by','=','by_name')]}" />
        <field name='work_type' />

    </group>
</group>
<div name="Worker Selection"></div>
<separator string='Select workers' />
<notebook attrs="{'invisible':[('select_by','=','by_count')]}">
    <page string="Tea Workers" attrs="{'readonly':[('work_type','!=','tea')]}">
        <field name='selected_tea_workers_line_ids' nolabel='1'>
            <tree string='List' editable='bottom'>
                <field name='worker_id' />
                <field name='is_selected' />
            </tree>
        </field>
        <group class='oe_subtotal_footer oe_right'>
            <field name='total_workers' />
        </group>
        <br />
        <br />
    </page>
    <page string="Rubber Workers" attrs="{'readonly':[('work_type','!=','rubber')]}">
        <field name='selected_rubber_workers_line_ids' nolabel='1'>
            <tree string='List' editable='bottom'>
                <field name='worker_id' />
                <field name='is_selected' />
            </tree>
        </field>
        <group class='oe_subtotal_footer oe_right'>
            <field name='total_workers' />
        </group>
        <br />
        <br />
    </page>
    <page string="Sundry Workers" attrs="{'readonly':[('work_type','!=','sundry')]}">
        <field name='selected_sundry_workers_line_ids' nolabel='1'>
            <tree string='List' editable='bottom'>
                <field name='worker_id' />
                <field name='is_selected' />
            </tree>
        </field>
        <group class='oe_subtotal_footer oe_right'>
            <field name='total_workers' />
        </group>
        <br />
        <br />
    </page>
</notebook>
</sheet>
</form>
</field>
</record>

<record model="ir.actions.act_window" id="bpl_work_offer_action">
<field name="name">bpl.work.offer.action</field>
<field name="res_model">bpl.work.offer</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
</record>

型号代码

class company_new_registration(osv.osv):
    _name = "bpl.company.n.registration"
    _description = "Company"
    _columns = {
                'name': fields.char('Company Name', size=128, required=True),
                'estates': fields.one2many('bpl.estate.n.registration', 'company_id', 'Estate')                                        
    }
# Bill of Material
company_new_registration()

class estate_new_registration(osv.osv):
    _name = "bpl.estate.n.registration"
    _description = "Estates"
    _columns = {
        'name': fields.char('Estate Name', size=128, required=True),
        'company_id': fields.many2one('bpl.company.n.registration', 'Company Name', select=True),
        'divisions': fields.one2many('bpl.division.n.registration', 'estate_id', 'Division')
    }

estate_new_registration()

class division_new_registration(osv.osv):
    _name = "bpl.division.n.registration"
    _description = "Divisions"
    _columns = {
        'name': fields.char('Division Name', size=128, required=True),
        'estate_id': fields.many2one('bpl.estate.n.registration', 'Estate Name', select=True),
    }

division_new_registration()

以及该工作提供所需的映射(种植园项目)

class bpl_work_offer(osv.osv):
    _name = "bpl.work.offer"
    _description = "BPL Work Offer"
    _columns = {
        'user_id': fields.many2one('res.users', 'User Name'),
        'date_of_offer': fields.date('Date'),
        'bpl_estate_id':fields.many2one('bpl.estate.n.registration', 'Estate', help='Estate'),
        'bpl_division_id':fields.many2one('bpl.division.n.registration', 'Division', help='Division'),
        'payment_type': fields.selection([('normal_work', 'Normal Work'), ('cash_work', 'Cash Work')], 'Payment Type'),
        'select_by': fields.selection([('by_name', 'By Names'), ('by_count', 'By Count')], 'Select  By'),
        'no_of_workers': fields.integer('No of Workers'),
        'work_type': fields.selection([('tea', 'Tea'), ('rubber', 'Rubber'), ('sundry', 'Sundry')], 'Work Type'),
        'total_workers': fields.integer('Total Workers'),
        'selected_tea_workers_line_ids': fields.one2many('bpl.selected.tea.workers.line', 'worker_id', 'Tea Workers', ondelete="cascade"),
        'selected_rubber_workers_line_ids': fields.one2many('bpl.selected.rubber.workers.line', 'worker_id', 'Rubber Workers', ondelete="cascade"),
        'selected_sundry_workers_line_ids': fields.one2many('bpl.selected.sundry.workers.line', 'worker_id', 'Sundry Workers', ondelete="cascade"),
    }

bpl_work_offer()

class selected_tea_workers_line_ids(osv.osv):
    _name = 'bpl.selected.tea.workers.line'
    _description = 'BPL Selected Tea Workers line'
    _columns = {
        'worker_id':fields.many2one('bpl.worker', 'Tea Worker', ondelete='cascade', help='Worker'),
        'is_selected': fields.boolean('Select', help="Selected or not"),
        }

selected_tea_workers_line_ids()

class selected_rubber_workers_line_ids(osv.osv):
    _name = 'bpl.selected.rubber.workers.line'
    _description = 'BPL Selected Rubber Workers line'
    _columns = {
        'worker_id':fields.many2one('bpl.worker', 'Rubber Worker', ondelete='cascade', help='Worker'),
        'is_selected': fields.boolean('Select', help="Selected or not"),
        }

selected_rubber_workers_line_ids()

class selected_sundry_workers_line_ids(osv.osv):
    _name = 'bpl.selected.sundry.workers.line'
    _description = 'BPL Selected Sundry Workers line'
    _columns = {
        'worker_id':fields.many2one('bpl.worker', 'Sundry Worker', ondelete='cascade', help='Worker'),
        'is_selected': fields.boolean('Select', help="Selected or not"),
        }

selected_sundry_workers_line_ids()
4

2 回答 2

2

您可以使用以下示例来创建您的 onchange 函数。这是我为发票创建的 onchange 函数(只是一个示例)

def onchange_partner_id(self, cr, uid, ids, type, partner_id,\
        date_invoice=False, payment_term=False, partner_bank_id=False, company_id=False):
    res = super(account_invoice, self).onchange_partner_id(cr, uid, ids, type, partner_id, 
            date_invoice=date_invoice, payment_term=payment_term, partner_bank_id=partner_bank_id,
            company_id=company_id)

    invoice_lines = []
    product_ids = self.pool.get('product.product').search(cr, uid, [],limit=5)
    for p in self.pool.get('product.product').browse(cr, uid, product_ids):
        invoice_lines.append((0,0,{'product_id':p.id,'name':p.name,
                          'account_id':p.categ_id.property_account_income_categ.id,
                          }))#this dict contain keys which are fields of one2many field 
    res['value']['invoice_line']=invoice_lines
    return res

如果只有一行要添加,则 res['value'].update({ 'one2many_fieldmname':[(0,0,{'field1':value1,'field2':value2,'fieldn':valuen}) ] })

在上面的示例中,我正在搜索 5 个产品,这些产品已添加到发票行中。因此,在您的 onchange 功能中,您还必须搜索该部门下的员工。

在您的代码中,在“bpl_work_offer_form”表单中,您在 bpl_division_id 字段中添加了 onchange 函数。(在我的示例中,partner_id 是 many2one 字段,invoice_line 是 one2many 字段。)

使用 onchange 加载 one2many 字段时需要更加小心。在 onchange 函数中,您必须首先取消链接 many2one 字段中加载的所有记录。因为如果一旦保存了记录,那么如果再次加载 onchange 则将创建一个新行。所以你需要正确管理它。

参考:http ://doc.openerp.com/trunk/developers/server/06_misc_on_change_tips/

于 2013-04-01T07:49:07.410 回答
1

用于(1, ID, { values })更新 one2many 值

def on_change(self,cr,uid,ids,ur_field,context=None):
   if context is None:
      context = {}
   value_list = val = []
   if ur_field:
      ur_conditions here
      value_list = (1,ID,{Values})
      val = {'one2manyfield':value_list}
   if not ur_field:
      val = {'one2manyfield':False}
   return {'val':val}
于 2013-04-01T07:35:03.357 回答