|
很久没发帖了。有没有人想我呀?
当我拿到这个附件时,忽然想起了在工厂上班的那一段青葱岁月。
那时候拿着2500一个月的薪水乐呵乐呵的,根本不知什么是愁滋味。那时候,接班的大妈一直看我不顺眼。她是从一线员工升上来的,觉得经验比我足,工资却没有我的高,心里不服气那是肯定的,所以横挑鼻子竖挑眼。
刚毕业的我没计较,心想,自己是新人,带着的员工也是新人,像现在的“反思党”一样,天天反思自己的不足。可是啊,怎么可能每个都是我的问题呢?
唯一没被挑毛病的,估计也就是做考勤了吧。毕竟各个班组都是做自己的。那时候,考勤格式大概长成这样:
用countif函数统计第2行的上班天数(中夜班有补贴)和假期。根据第2、3行统计加班小时数。如果第1行是上班,则第2行的小时数算班后加班(1.5倍);休息日、法定假期加班按相应倍数计算。这种统计其实还算比较好的,毕竟都是纸卡。
后来换了指纹打卡,问题才刚刚开始。Excel其实也还好,但Access就有些麻烦了。比如,夜班通常会跨日。当日23:45上班,翌日7:30下班。如果考勤机分上下班,隔天显然会错位;如果不分吧,日期也不是同一天,同样要处理。
现在,我们就来看看如何解决这个问题。思路上,首先要把上下班的时间统一成一列,然后假定第一次打的都是上班卡,第二次才是下班卡(这里假定重复打卡的数据已经处理完毕)。接下来就可以根据奇偶行数来确定上下班时间,从而统计出上班时长。
在SQL Server上,可以通过lag或者row_number()等函数算出奇偶。但这两个函数Access都没有。因此,需要用到VBA。
按惯例,先贴代码:
- Sub Update_Off()
- Dim rst1 As New ADODB.Recordset
- Dim rst2 As New ADODB.Recordset
- Dim i As Long
-
- rst1.Open "select * from 考勤汇总", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
- rst2.Open "select * from 考勤总表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
-
- i = 1
- Do Until rst1.EOF
- If i Mod 2 = 1 Then '默认第一次打卡为上班
- rst2.AddNew
- rst2("设备工号") = rst1("设备工号")
- rst2("员工工号") = rst1("员工工号")
- rst2("姓名") = rst1("姓名")
- rst2("部门") = rst1("部门")
- rst2("考勤日期") = rst1("考勤日期")
- rst2("上班时间") = rst1("出勤时间")
- Else
- rst2("下班时间") = rst1("出勤时间")
- End If
- rst2.Update
- i = i + 1
- rst1.MoveNext
- Loop
- rst2.Close
- rst1.Close
- End Sub
复制代码
代码比较简单。大致是先打开数据源表(考勤汇总)和目标表(考勤总表),然后定义一个变量i,通过i递增,然后用mod函数取模(即除以2的余数是否等于1)来确定是新增数据还是修改数据。这里就不详细展开说明了(有疑惑的版友,回帖后我再解析)。附件如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|