跳至内容
Odoo 菜单
  • 登录
  • 免费试用
  • 应用程序
    财务
    • 会计
    • 发票
    • 费用
    • 电子表格 (BI)
    • 文档
    • 电子签名
    销售
    • 客户关系管理
    • 销售
    • POS 销售点管理-零售
    • POS 销售点管理 - 餐厅
    • 订阅
    • 租赁
    网站
    • 网站设计
    • 电子商务
    • 博客
    • 论坛
    • 在线客服
    • 在线学习
    供应链
    • 库存
    • 制造
    • 产品生命周期
    • 采购
    • 维护保养
    • 品控
    人力资源
    • 员工
    • 招聘
    • 休假
    • 评价
    • 内部推荐
    • 车队
    营销
    • 社媒营销
    • 电邮营销
    • 短信营销
    • 近期活动
    • 营销自动化
    • 网上调查
    服务
    • 项目管理
    • 工时单
    • 现场服务
    • 服务台
    • 排期
    • 预约
    生产力
    • 讨论
    • 批核
    • IoT物联网
    • VoIP
    • 知识库
    • WhatsApp
    第三方应用软件 Odoo 定制 Odoo云端平台
  • 行业
    零售
    • 书店
    • 服装店
    • 家具店
    • 食品杂货店
    • 五金店
    • 玩具店
    餐饮与酒店服务
    • 酒吧及酒馆
    • 餐厅
    • 快餐
    • 民宿
    • 饮品分销商
    • 酒店
    房地产
    • 房地产代理
    • 建筑师事务所
    • 建造业
    • 地产管理
    • 园艺
    • 业主协会
    咨询
    • 会计师事务所
    • Odoo合作伙伴
    • 市场推广公司
    • 律师事务所
    • 人才招聘
    • 审核 & 认证
    制造
    • 纺织
    • 金属
    • 家具
    • 食品
    • 啤酒厂
    • 企业礼品
    保健与健身
    • 体育俱乐部
    • 眼镜店
    • 健身中心
    • 健康从业者
    • 药房
    • 发型屋
    商贸服务
    • 维修人员
    • IT 硬件及支持
    • 太阳能系统
    • 鞋匠
    • 清洁服务
    • 暖通空调服务
    其他
    • 非营利组织
    • 环境机构
    • 广告牌租赁
    • 摄影服务
    • 自行车租赁
    • 软件经销商
    浏览所有行业
  • 社区
    学习
    • 教学视频
    • 文档
    • 认证
    • 培训
    • 博客
    • 播客
    赋能教育
    • 教育计划
    • Scale Up! 商业游戏
    • 参观Odoo
    获取软件
    • 下载
    • 版本对比
    • 发布
    合作
    • Github
    • 论坛
    • 近期活动
    • 翻译
    • 成为合作伙伴
    • 合作伙伴服务
    • 注册您的会计事务所
    获取服务
    • 寻找合作伙伴
    • 查找会计服务
    • 预约顾问咨询
    • 安装及推行服务
    • 客户参考
    • 支持
    • 升级
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    获取演示
  • 定价
  • 技术支持

Odoo is the world's easiest all-in-one management software.
It includes hundreds of business apps:

  • 客户关系管理
  • e-Commerce
  • 会计
  • 库存
  • PoS
  • 项目
  • MRP
All apps
只限注册用戶才可与社群互动。
所有帖文 人 徽章
标签 (查看所有)
odoo accounting v14 pos v15
关于此论坛区
只限注册用戶才可与社群互动。
所有帖文 人 徽章
标签 (查看所有)
odoo accounting v14 pos v15
关于此论坛区
帮助

List employee in form with a button

订阅

此帖文有活动时,接收通知

此问题已终结
many2onewritebuttonrecords
2 回复
7289 查看
形象
Algode

When press the button need list all employee and some data of this.

I create an module class prepare_adv() and other adv(), the second are as One2many fields in the first. 

in prepare_adv have a button that onclick need list in adv() all of employees and some datas of this. 

This is the function of button that need save the recors in adv() and them view in prepare_adv():

def onclick(self, cr, uid, ids, context=None):
        employee_obj = self.pool.get('hr.employee')
        contract_obj = self.pool.get('hr.contract')
        res = {}
        for advances in self.browse(cr,uid,ids,context=context):
            res[advances.id] = {
                'id_intern': 0,
                'employee_name': 0,
                'wage_base': 0,
            }
            for empl in employee_obj.browse(cr,uid,ids,context=context):
                res[advances.id]['wage_base'] = contract_obj.browse(cr,uid,empl.id).wage
                res[advances.id]['id_intern'] = empl.id_inter
                res[advances.id]['employee_name'] = empl.id 
                lines = [(0,0,res)]
                self.write(cr, uid, [advances.id], {'advancs': lines,}, context=context)
        return True

This no save nothing of records. What i do wrong ?

1
形象
丢弃
Algode
编写者

Some can help me please...

形象
Cyril Gaspard (GEM)
最佳答案

Hi,

I believe you do not understand what is a on2many field :

if you display in view prepare_adv the field you defined in on2many field in adv to do the relation between the 2 class, and select an adv in prepare_adv and save your change, the line prepare_adv in one2many view in adv will be displayed automatically (by refreshing the view if you work on 2 notebooks).

I don't know if this is the result you want, but one prepare_adv can be display only in one adv with a one2many field.

If you want to display the list of all employee in adv one2many line corresponding to the prepare_adv id, you must create a field many2many with employee class relation in prepare_adv named employee_ids, and add it the one2many form view in adv by using widget one2many_list.

Your button in prepare adv will be used to update the field employee_ids list.

UPDATE :

button code :

class prepare_adv(models.Model):
    _name = 'prepare.adv'

 @api.one
    def on_click(self):
        self.ensure_one()
        per = time.strftime('%m/%Y')

        cr = self.env.cr
        cr.execute('''SELECT hr_employee.id, id_inter, wage FROM hr_employee, hr_contract WHERE hr_employee.id=employee_id''')
        temp = cr.fetchall()
        adv_to_create = []

        prepare_adv_id = self._ids[0]
        for record in temp:
            adv_to_create += [(0, 0, {'advances_id': prepare_adv_id,' period_id': per, 'id_intern': record[1],
                                                    'employee_name': record[0], 'wage_base': record[2]
                                           })]
        prepare_adv.advancs = adv_to_create
        return True

function field :

    @api.multi

    @api.depends('wage_base')

    def _compute_wage_advance(self):

        for record in self:

            record.advances_40 = record.wage_base * 0.40

1
形象
丢弃
形象
Algode
编写者 最佳答案

Hi Cyril Gaspard,

Thanks to you for answer. 

Now, I have this:

prepare_adv()
 _______________________________________________________________________
|      Ref:  ______________                             Period: _________ - ___________       |
|      _button_here                                                                                                   |
|............................................................................................................................|
|      ________________________________________________________________      |
|      |    id     |     employee      |   wage_of_contract   |   compute_40%_of_wage   | <---|----  this is my adv()
|      |-----------|-------------------------|--------------------------------|----------------------------------------|       |


adv.id and adv.employee have in hr_employee, and adv.wage_of_contract have in hr_contract, now, adv.compute_40%_of_wage is automatic compute from adv.wage_of_contract.
I need create this every month but one time, with all employee available. I solved the problem to save datas in adv() and can see this in prepare_adv() but have other problem :)
The problem is the next: when is only one row fine, save and can see perfect; but if it is more than one row show the next error: 

Expected singleton: hr.py.advances(104, 105, 103)

Save the data in adv() but show the error mentioned.
I have understood that need create new rows for news records. 


This is my code of function from button (this are in prepare_adv()): 

def on_click(self, cr, uid, ids, context=None):
        res = {}
        for adv in self.browse(cr,uid,ids):
            cr.execute('''SELECT hr_employee.id, id_inter, wage FROM hr_employee, hr_contract WHERE hr_employee.id=employee_id''')
            temp = cr.fetchall()
            per = time.strftime('%m/%Y')
            for record in temp:
                datas = {'advances_id':adv.id,'period_id':per,'id_intern':record[1],'employee_name':record[0],'wage_base':record[2]}
                crea = self.pool.get('hr.py.advances').create(cr,uid,datas,context=context)
                self.pool.get('hr.py.advances').write(cr,uid,crea,datas,context=context)
            return True

This is my adv() class:

class adv(models.Model):
    _name = 'adv'

    advances_id = fields.Many2one('prepare.adv')
    period_id = fields.Char()
    id_intern = fields.Integer(string='Cod.')
    employee_name = fields.Many2one('hr.employee', string='Funcionario')
    wage_base = fields.Float(string='Salario')
    advances_40 = fields.Integer(compute='_compute_wage_advance', string='40% Adelanto Quinc.')

    @api.depends('wage_base')
    def _compute_wage_advance(self):
        self.advances_40 = self.wage_base * 0.40

This id my prepare_adv() class:

class prepare_adv(models.Model):
    _name = 'prepare.adv'

    state = fields.Selection([('draft','Borrador'),('done','Aprobado')], default='draft', string='Status', select=True, readonly=True, copy=False)
    referenc = fields.Char(string='Referencia',default='Anticipo - ' + time.strftime('%m/%Y'))    
    date_from = fields.Datetime(string='Periodo', default=lambda *a: time.strftime('%Y-%m-01'), required=True, readonly=True, states={'draft': [('readonly', False)]})
    date_to = fields.Datetime(string='-', default=lambda *a: str(datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1))[:10], required=True, readonly=True, states={'draft': [('readonly', False)]})
    per_id = fields.Char(string='per', default= time.strftime('%m/%Y'))
    advancs = fields.One2many('adv','advances_id')

This is the view of prepare_adv():

<div class="oe_title">
                            <label for="referenc" class="oe_edit_only"/>
                            <h1>
                                <field name="referenc"/>
                            </h1>
                        </div>
                        <div class="oe_right">
                            <label for="date_from" class="oe_edit_only"/><field name="date_from" class="oe_inline"/><label for="date_to">-</label><field name="date_to" class="oe_inline"/>
                        </div>
                        <group>
                            <button string="Cargar" name="charge_employee" states="draft" type="object" class="oe_highlight"/>
                        </group>
                        <notebook>
                            <page>
                                <field name="advancs" nolabel="1"/>
                            </page>
                        </notebook>

How create news row for view all amount of employee (around of 72 employee)? 
 

 

1
形象
丢弃
Cyril Gaspard (GEM)

why did you do a create and after a write with same datas on same model? just need to create => self.pool.get('hr.py.advances').create(cr,uid,datas,context=context) self.pool.get('hr.py.advances').write(cr,uid,crea,datas,context=context) Else error you have is due to: in a write, you must give a list of ids, not just one id, replace in your write call crea by [crea] : self.pool.get('hr.py.advances').write(cr,uid,[crea],datas,context=context)

Algode
编写者

I have understood that need create and them write this in the database, is wrong ? Try with self.pool.get('hr.py.advances').write(cr,uid,[crea],datas,context=context) but show the same error: Expected singleton: hr.py.advances(108, 109)

Cyril Gaspard (GEM)

in your field advances_id = fields.Many2one('prepare.adv') where is defined the class prepare.adv you are using in this field ????

Algode
编写者

hr_py_prepare_advances is the prepare.adv, sorry

Algode
编写者

Now is right.

Algode
编写者

^^ now is right the previous code, because I modified. The problem not solved it yet :(

Algode
编写者

Return this with your new code: cr.execute('''SELECT hr_employee.id, id_inter, wage FROM hr_employee, hr_contract WHERE hr_employee.id=employee_id''') NameError: global name 'cr' is not defined

Cyril Gaspard (GEM)

forget to define cr in v8 : cr = self.env.cr , I update the code. bye

Algode
编写者

Thanks to you for your time to answer me... but the code not save any data in the adv() if change this code [[0, 0, {'advances_id': prepare_adv_id,' period_id': per, 'id_intern': record[1], 'employee_name': record[0], 'wage_base': record[2] }]] for [((0, 0, {'advances_id': prepare_adv_id,' period_id': per, 'id_intern': record[1], 'employee_name': record[0], 'wage_base': record[2] }))] save but show the same erro of Expected singleton: adv(150,151).

Cyril Gaspard (GEM)

your error id due to a function which can be have just one id in input, try to change @api.depends('wage_base') def _compute_wage_advance(self): self.advances_40 = self.wage_base * 0.40 by @api.multi @api.depends('wage_base') def _compute_wage_advance(self): for record in self: record.advances_40 = record.wage_base * 0.40 I update my code with this

Algode
编写者

Sorry for many thanks but need say to you more one time, Thanks very much, for your time and for you help Problem solved.

喜欢讨论吗?不要只阅读,加入进来!

立即创建账户,享受专属功能,与我们的精彩社区互动!

注册
相关帖文 回复 查看 活动
Record create/write in Odoo8.0 new API 已解决
update write records odoo8.0
形象
形象
形象
8
12月 16
19504
Hello, how could I create a button that creates a new record in another model containing data from my current model? from my python module
python module models button records
形象
形象
形象
2
1月 25
2314
How to use Char field in other form view as Drop down ???
many2one records python2.7 openerp odoov10
形象
0
7月 19
770
[v10] Pass active_id through button to fill fields 已解决
action many2one button autocomplete active_id
形象
形象
9
6月 17
10445
relation between record of one2many and another field 已解决
v8 domain many2one one2many records
形象
形象
2
4月 17
8421
社区
  • 教学视频
  • 文档
  • 论坛
开源
  • 下载
  • Github
  • Runbot
  • 翻译
服务
  • Odoo.sh 托管
  • 支持
  • 升级
  • 自定义开发服务
  • 教育
  • 查找会计服务
  • 寻找合作伙伴
  • 成为合作伙伴
关于我们
  • 我们的公司
  • 品牌资产
  • 联系我们
  • 招聘
  • 近期活动
  • 播客
  • 博客
  • 客户
  • 法律 • 隐私
  • 安全
الْعَرَبيّة Català 简体中文 繁體中文 (台灣) Čeština Dansk Nederlands English Suomi Français Deutsch हिंदी Bahasa Indonesia Italiano 日本語 한국어 (KR) Lietuvių kalba Język polski Português (BR) română русский язык Slovenský jazyk slovenščina Español (América Latina) Español ภาษาไทย Türkçe українська Tiếng Việt

Odoo致力于为企业管理提供高效智能的开源解决方案,是全球业内高速成长的软件服务商之一,逾七百五十万用户选择Odoo进行数字化升级。通过一系列全业务链覆盖、高度集成、简单易用的商业应用,助力企业实现信息化改革、降本增效并释放公司增长潜力。

Odoo独特的价值在于是一款非常容易使用又完全集成的应用。

Website made with

Odoo Experience on YouTube

1. Use the live chat to ask your questions.
2. The operator answers within a few minutes.

Live support on Youtube
Watch now