OpenERP:获取数据库并在表单中显示

0 投票
3 回答
3617 浏览
提问于 2025-04-17 08:25

我在OpenERP上做一个关于考勤表的项目,遇到了一些问题:这是x_luong表。

class x_luong(osv.osv):
     _name = 'x_luong'
     _description = 'Luong'

     _columns = {'name': fields.many2one('x_nhanvien', 'Mã nhân viên', size=10, required='1'),
                 'ma_luong': fields.integer('ma luong', size=10, required='1'),
                 'giolam': fields.float('Giờ làm', size=100, required='1'),
                 'giolamthuc': fields.char('Gio lam thuc te', size=5, required='1'),
                 'time_in': fields.char('Gio vào', size=20),
                 'time_out' :fields.char('Gio về', size=20),
                 'state' :fields.selection([('dangnhap','Đẳng nhập.'),('rave','Ra về')]),
                 'test': fields.integer('Kiem tra', size=20),
                 'phutvao': fields.integer('Phut vao ', size=20),
                 'phutra': fields.integer('phut ra', size=20),
                }
     _defaults = {'state':'dangnhap',
                 }

这里面有一些函数:

这两个函数的意思是获取员工登录或登出系统的时间

def get_timein(self,cr,uid,ids,context={}):
    obj = self.browse(cr,uid,ids,context=context)[0]
    timein = str(datetime.now())
    self.write(cr, uid, ids, {'time_in':timein }, context=context)
    return 1

def get_timeout(self,cr,uid,ids,context={}):
    obj = self.browse(cr,uid,ids,context=context)[0]
    timeout = str(datetime.now())
    self.write(cr, uid, ids, {'time_out':timeout }, context=context)
    return 1

这两个函数是用于登录和登出的按钮:

def cho_dangnhap(self,cr,uid,ids,context={}):
    self.pool.get('x_luong').write(cr,uid,ids,{'state':'dangnhap'})
    self.get_timein(cr,uid,ids)
    return 1

def cho_rave(self,cr,uid,ids,context={}):
    self.pool.get('x_luong').write(cr,uid,ids,{'state':'rave'})
    self.get_timeout(cr,uid,ids)
    self.tinh_thoigian(cr,uid,ids)
    self.insert(cr,uid,ids) 

函数tinh_thoigian的意思是处理时间字符串,以便获取小时或分钟进行计算

def _thoigianlam(self,cr,uid,ids,context={}):
    obj = self.browse(cr,uid,ids,context=context)[0]
    hour_den = int(obj.time_in[12:13])
    hour_di = int(obj.time_out[12:13])
    min_den = int(obj.time_in[15:16])
    min_di = int(obj.time_out[15:16])
    gl = int(hour_di)-int(hour_den)
    pl = min_di-min_den
    thucte = str(gl)+':'+pl
    self.write(cr, uid, ids, {'giolam':gl }, context=context)
    self.write(cr, uid, ids, {'giolamthuc':thucte }, context=context)
    return 1

最后一个函数insert()获取ma_luong(我认为这和SQL中的主键是一样的)和giolam(员工在公司的工作小时数),time_in和time_out,这就是insert()函数的内容

def insert(self,cr,uid,ids,context={}):
    obj = self.browse(cr,uid,ids,context=context)
    values = {'ma_luong':obj.name.id,
             'giolam':obj.giolam,
             'time_in':time_in,
             'time_out':time_out,

    self.pool.get('x_giolam').create(cr,uid,values,context=context) 

通过这个函数,我想把数据插入到x_giolam表中,因为当员工在某一天登录或登出系统时,他们的数据会保存在这个表里,其他日子再做的时候也会再次保存...最后一个月,如果你想计算他们的工资,只需选择ma_luong=ma_luong(来自x_luong表)和这个x_giolam表:

class x_giolam(osv.osv):
    _name = 'x_giolam'
    _description = 'Gio Lam'
    _columns = {'name': fields.integer('Lọai',size=64,required="true"),
                'giolam' : fields.float('Gio lam',size=64,required="True"),
                'time_in': fields.char('Gio vào',size=20),
                'time_out' :fields.char('Gio về',size=20),         
                }

我在我的项目中有三个问题:

1) insert函数有错误:

AttributeError: 'browse_record_list' object has no attribute 'name'

我该如何修复它???我的数据保存在x_giolam表中
2) 我该如何选择x_giolam表中属于某个员工的多行数据...给我一些关于这个函数的例子
3) 我该如何组织field.Xml,以便在显示行时使用

抱歉让大家麻烦了,因为内容有点长...但我希望这里的每个人都能帮我。Python和OpenERP和C++或C#差别很大。这是我做的项目“研究并编写一个OpenERP的考勤模块”,下周就是截止日期了。我的英语不好,抱歉!!!

谢谢大家!!

3 个回答

0

obj的类型是一个记录的列表,所以要查看这个记录列表,你必须先定义一个元素。
在你的情况下,你可以这样写:obj[0].giolam --> 这表示获取obj中第一个记录的giolam。
抱歉我的英语不好。

0

为什么不先看看标准的 hr_attendance 模块,然后再继续呢?

在你的模型中,name 是一个保留的字段名,所以最好把它保持为 char 类型。试试这个改动,看看能否解决你的错误信息。

至于另外两个问题,我觉得你可以稍微改一下措辞,让它们更清楚一些……

1

我可以帮你解答第一个问题。问题出在这段代码上:

def insert(self,cr,uid,ids,context={}):
                obj=self.browse(cr,uid,ids,context=context)
                values={'ma_luong':obj.name.id,

错误信息是这样的:

AttributeError: 'browse_record_list'对象没有'name'这个属性

如果你用一串ID调用orm.browse(),你会得到一组浏览记录。接下来,你需要遍历这组记录,或者从中获取一个单独的条目来进行操作。

比如说:

for luong in self.browse(cr,uid,ids,context=context):
    print luong.name

或者:

luongs = self.browse(cr,uid,ids,context=context)
luong = luongs[0]
print luong.name

撰写回答