You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 13:04:54