OpenERP:获取数据库并在表单中显示
我在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 个回答
obj的类型是一个记录的列表,所以要查看这个记录列表,你必须先定义一个元素。
在你的情况下,你可以这样写:obj[0].giolam --> 这表示获取obj中第一个记录的giolam。
抱歉我的英语不好。
为什么不先看看标准的 hr_attendance
模块,然后再继续呢?
在你的模型中,name
是一个保留的字段名,所以最好把它保持为 char
类型。试试这个改动,看看能否解决你的错误信息。
至于另外两个问题,我觉得你可以稍微改一下措辞,让它们更清楚一些……
我可以帮你解答第一个问题。问题出在这段代码上:
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