基于Microsoft Access的基础考勤系统:刷卡自动关联信息并记录时间戳
实现Microsoft Access刷卡考勤系统步骤
一、基础数据表搭建
先建立两个核心数据表,确保数据结构清晰:
1. 员工信息表(tbl_Employees)
EmployeeID:文本/数字类型,主键,与员工卡ID完全匹配EmployeeName:文本类型,存储员工姓名- 可选字段:部门、职位等(按需添加)
2. 打卡记录表(tbl_TimeLogs)
LogID:自动编号,主键EmployeeID:文本/数字类型,关联员工信息表EmployeeName:文本类型,自动填充员工姓名LogDateTime:日期/时间类型,记录打卡时间戳Duration:数字类型(单位:分钟),记录两次打卡的间隔时长LogType:文本类型(可选),标记「上班」/「下班」,方便后续统计
二、读卡器接收与打卡逻辑实现
市面上多数读卡器为模拟键盘输入(刷卡后自动输出ID并触发回车),基于此做以下配置:
1. 创建打卡表单(frm_TimeClock)
- 添加文本框
txt_CardID,设置为表单默认焦点控件,用于接收读卡器输入的ID - 添加标签提示「请刷卡」,优化操作体验
2. 编写VBA处理刷卡事件
在txt_CardID的AfterUpdate事件中写入以下代码:
Private Sub txt_CardID_AfterUpdate() Dim strEmpID As String Dim strEmpName As String Dim dblLastLogTime As Date Dim dblDuration As Double Dim strLogType As String ' 获取刷卡ID strEmpID = Me.txt_CardID.Value ' 验证员工是否存在 If DCount("*", "tbl_Employees", "EmployeeID = '" & strEmpID & "'") = 0 Then MsgBox "未匹配到员工信息,请检查卡号!", vbExclamation Me.txt_CardID.Value = "" Me.txt_CardID.SetFocus Exit Sub End If ' 读取员工姓名 strEmpName = DLookup("EmployeeName", "tbl_Employees", "EmployeeID = '" & strEmpID & "'") ' 查询该员工上一次打卡时间 dblLastLogTime = Nz(DMax("LogDateTime", "tbl_TimeLogs", "EmployeeID = '" & strEmpID & "'"), 0) ' 自动判断打卡类型并计算时长 If dblLastLogTime = 0 Or DateDiff("d", dblLastLogTime, Now()) > 0 Then strLogType = "上班" dblDuration = 0 ' 首次打卡(上班)时长为0 Else strLogType = "下班" dblDuration = DateDiff("n", dblLastLogTime, Now()) ' 计算与上次打卡的间隔分钟数 End If ' 写入打卡记录 CurrentDb.Execute "INSERT INTO tbl_TimeLogs (EmployeeID, EmployeeName, LogDateTime, Duration, LogType) " & _ "VALUES ('" & strEmpID & "', '" & strEmpName & "', Now(), " & dblDuration & ", '" & strLogType & "')" ' 打卡成功提示 MsgBox "打卡完成!" & vbCrLf & "员工:" & strEmpName & vbCrLf & "时间:" & Now(), vbInformation ' 清空输入框,准备下一次刷卡 Me.txt_CardID.Value = "" Me.txt_CardID.SetFocus End Sub
注意:若
EmployeeID为数字类型,需删除SQL语句中ID值前后的单引号
3. 特殊读卡器适配(串口/USB非键盘模拟)
如果读卡器为串口或非键盘模拟类型,需额外通过VBA调用Windows串口API,或使用第三方串口控件实现数据读取,核心逻辑与上述一致,仅ID获取方式不同。
三、考勤报表生成
1. 创建统计查询(qry_AttendanceSummary)
基于打卡记录表创建汇总查询,用于生成报表数据源:
- 数据源:
tbl_TimeLogs - 分组字段:
EmployeeID、EmployeeName、DateValue(LogDateTime)(按日期分组) - 计算字段:
- 当日总时长:
Sum(Duration) - 当日打卡次数:
Count(LogID)
- 当日总时长:
2. 制作考勤报表
以qry_AttendanceSummary为数据源创建报表,设置布局(员工姓名、日期、总时长等),可添加日期范围、部门筛选控件,支持打印或导出为Excel格式。
四、日常维护注意事项
- 定期备份Access数据库,避免数据丢失
- 给打卡表单设置独占模式,防止多人同时打卡引发数据冲突
- 若出现打卡异常,可直接在
tbl_TimeLogs中手动修正记录
内容的提问来源于stack exchange,提问作者Carter Whaley
相关产品推荐
相关产品推荐

