Office中国论坛/Access中国论坛

标题: 浅谈考勤处理——那些年,我们一起打过的卡 [打印本页]

作者: roych    时间: 2022-3-21 00:10
标题: 浅谈考勤处理——那些年,我们一起打过的卡
很久没发帖了。有没有人想我呀?
当我拿到这个附件时,忽然想起了在工厂上班的那一段青葱岁月。
那时候拿着2500一个月的薪水乐呵乐呵的,根本不知什么是愁滋味。那时候,接班的大妈一直看我不顺眼。她是从一线员工升上来的,觉得经验比我足,工资却没有我的高,心里不服气那是肯定的,所以横挑鼻子竖挑眼。
刚毕业的我没计较,心想,自己是新人,带着的员工也是新人,像现在的“反思党”一样,天天反思自己的不足。可是啊,怎么可能每个都是我的问题呢?

唯一没被挑毛病的,估计也就是做考勤了吧。毕竟各个班组都是做自己的。那时候,考勤格式大概长成这样:
[attach]64282[/attach]
用countif函数统计第2行的上班天数(中夜班有补贴)和假期。根据第2、3行统计加班小时数。如果第1行是上班,则第2行的小时数算班后加班(1.5倍);休息日、法定假期加班按相应倍数计算。这种统计其实还算比较好的,毕竟都是纸卡。

后来换了指纹打卡,问题才刚刚开始。Excel其实也还好,但Access就有些麻烦了。比如,夜班通常会跨日。当日23:45上班,翌日7:30下班。如果考勤机分上下班,隔天显然会错位;如果不分吧,日期也不是同一天,同样要处理。

现在,我们就来看看如何解决这个问题。思路上,首先要把上下班的时间统一成一列,然后假定第一次打的都是上班卡,第二次才是下班卡(这里假定重复打卡的数据已经处理完毕)。接下来就可以根据奇偶行数来确定上下班时间,从而统计出上班时长

在SQL Server上,可以通过lag或者row_number()等函数算出奇偶。但这两个函数Access都没有。因此,需要用到VBA。
按惯例,先贴代码:
  1. Sub Update_Off()
  2.     Dim rst1 As New ADODB.Recordset
  3.     Dim rst2 As New ADODB.Recordset
  4.     Dim i As Long
  5.    
  6.     rst1.Open "select * from 考勤汇总", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  7.     rst2.Open "select * from 考勤总表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  8.    
  9.     i = 1
  10.     Do Until rst1.EOF
  11.         If i Mod 2 = 1 Then '默认第一次打卡为上班
  12.             rst2.AddNew
  13.             rst2("设备工号") = rst1("设备工号")
  14.             rst2("员工工号") = rst1("员工工号")
  15.             rst2("姓名") = rst1("姓名")
  16.             rst2("部门") = rst1("部门")
  17.             rst2("考勤日期") = rst1("考勤日期")
  18.             rst2("上班时间") = rst1("出勤时间")
  19.         Else
  20.             rst2("下班时间") = rst1("出勤时间")
  21.         End If
  22.             rst2.Update
  23.             i = i + 1
  24.         rst1.MoveNext
  25.     Loop
  26.     rst2.Close
  27.     rst1.Close
  28. End Sub
复制代码

代码比较简单。大致是先打开数据源表(考勤汇总)和目标表(考勤总表),然后定义一个变量i,通过i递增,然后用mod函数取模(即除以2的余数是否等于1)来确定是新增数据还是修改数据。这里就不详细展开说明了(有疑惑的版友,回帖后我再解析)。附件如下:
[attach]64283[/attach]


作者: tmtony    时间: 2022-3-21 17:02
好久没看你上来,考勤计算 比人事要复杂,特别是一些有很多班次及复杂跨天班次。有进算破脑袋,曾经为一个工厂做过,现在还在不断修改
作者: accben    时间: 2022-3-30 08:24
本帖最后由 accben 于 2022-3-30 08:40 编辑

以前开发碰到过此类问题。
公司上班班次时间表:
白班:8:00 - 16:30     
中班:16:30 - 次日0:00   
夜班:次日0:00 - 次日8:00

这时,最好增加一个排班表,批量设置好每位员工的每一天班次。

考虑到有加班的情况,因此在判断考勤(迟到、早退、旷工),搜索员工打卡记录时,应在员工所在班次的时间范围之内,前后各再增加4h的时间。
依据员工班次前后各再加4h时间范围搜索到的打卡记录:
用第1条记录判断是否迟到
用最后1条记录判断是否早退
没有记录的判断为旷工。
当然也会出现有又迟到又早退的情况。

以上,仅仅是思路。


作者: smallbighead    时间: 2022-9-16 13:19
认真学习




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3