chấm công bằng vân tay

Liên hệ QC

lehien11_86

Thành viên mới
Tham gia
7/7/08
Bài viết
8
Được thích
0
Cho mình hỏi: chỗ mình làm chấm công bằng cách bấm vân tay hàng ngày để kiểm soát. cuối tháng có bảng chấm công vân tay bằng file excel, nhưng để tìm ngày lỗi của mọi người trong file đó rất mất thời gian vì phải dò từng dòng 1,( điều kiện phải bấm vân tay trước 7h45 và ko dc bấm sớm hơn 4H45) mọi người giúp mình với. có cách nào lẹ hơn không????mình đã thử dùng nhìu công thức nhưng thấy ko thuận lợi lắm nên kính nhờ các tiền bối giải đáp. hy vong nhận dc giải đáp sớm.hihih
 
Chỗ mình chấm công bằng vân tay hàng ngày. Tháng có bảng chấm công vân tay bằng file excel, nhưng để tìm ngày lỗi của mọi người trong file đó rất mất thời gian vì phải dò từng dòng 1,( điều kiện phải bấm vân tay trước 7h45 và ko dc bấm sớm hơn 4H45) mọi người giúp mình với. có cách nào lẹ hơn không????.Hhy vong nhận dc giải đáp sớm.hihih
Hi vọng sớm thấy 1 bảng chấm công của 1 tổ nào đó của đơn vị bạn.
Chúc vui! --=0
 
Cho mình hỏi: chỗ mình làm chấm công bằng cách bấm vân tay hàng ngày để kiểm soát. cuối tháng có bảng chấm công vân tay bằng file excel, nhưng để tìm ngày lỗi của mọi người trong file đó rất mất thời gian vì phải dò từng dòng 1,( điều kiện phải bấm vân tay trước 7h45 và ko dc bấm sớm hơn 4H45) mọi người giúp mình với. có cách nào lẹ hơn không????mình đã thử dùng nhìu công thức nhưng thấy ko thuận lợi lắm nên kính nhờ các tiền bối giải đáp. hy vong nhận dc giải đáp sớm.hihih

Bạn làm Nhân Sự?
Cách bạn đặt vấn đề như nên trên thì làm việc kém hiệu quả và mất thời gian là chuyện đương nhiên.
Tôi nói vậy, chắc bạn sẽ không hài lòng. Nhưng hãy tập cách đặt vấn đề một cách rõ ràng, chi tiết & đưa file viện dẫn lên thì mọi người mới dúp bạn được.
 
Hom nay mình gởi file lên mong mọi người giúp đỡ. Cột ngày giờ là cột thể hiện vào giờ đó ngày đó bấm vân tay.1 ngày bấm vân tay 2 lần: vào buổi sáng phải trước 7H45 và buổi chiều phải sau 4h45,nếu chỉ bấm 1 lần trong 1 ngày là vi phạm( bấm dư không sao)và phải bấm vào tất cả mọi ngày trừ ngày lễ , thứ 7 chủ nhật.mình đã thử dùng, data/text to column/ xong dùng pivot table nhưng không hiệu quả lắm không biết có cách nào nhanh và tiện hơn không? mọi người giúp với. thanks nhìu
 

File đính kèm

  • VANTAYTHANG05.rar
    61.7 KB · Đọc: 360
Lần chỉnh sửa cuối:
Chào bạn le_hien1186,

Thông thường các máy chấm công bằng vân tay hay thẻ đều xuất ra một tập tin *.dat. Tập tin này thực chất đó là tập tin dạng fixed length. Bạn có thể nhìn thấy hình giống bên dưới đây.

chamcong1.jpg


Chính vì vậy mà bạn có thể import vào Excel.

Để giải quyết bài toán chấm công này có thể nói sơ lược các bước tôi đã thực hiện như sau:

  • Nhập dữ liệu từ tập tin *.dat vào cơ sở dữ liệu (CSDL) chẳng hạn như Access. Một thủ tục nhập tương tự như sau:
Mã:
Sub ReadFromTextFile()

    Dim fs As Scripting.FileSystemObject, f As Scripting.TextStream
    Dim l As Long, sPathFile As String, iDel As Long
    Dim Rst As Object
    Dim arrFieldnames As Variant
    Dim arrValues As Variant
    Dim iCon As Long

    Dim sStaffCode$, sDate$, sTime$, vInOut, sTemp$


    On Error GoTo ErrorHandler

    iCon = ConnectToDB
    If iCon = 1 Then
        gcnAccess.Open
        sPathFile = ThisWbPath() & csData_File_Name
        'Clear the data before importing
        iDel = DeleteTable(gcnAccess, "TB_TimeInOutTemp")
        If iDel <> 1 Then
            MsgBox "Can not delete the data." & vbCrLf & _
                   "Please check with author.", vbOKOnly + vbCritical, mcsAppName
            GoTo ErrorExit
        End If
        'recordset
        Set Rst = CreateObject("ADODB.Recordset")
        '
        'CursorTypeEnum
        'adOpenDynamic     = 2
        'adOpenForwardOnly = 0
        'adOpenKeySet      = 1
        'adOpenStatic      = 3
        '
        'The CursorLocationEnum:
        'adUseClient = 3
        'adUseServer = 2
        '
        'LockTypeEnum:
        'adLockReadOnly        = 1
        'adLockPessimistic     = 2
        'adLockOptimistic      = 3
        'adLockBatchOptimistic = 4
        '
        'Rst.CursorLocation = adUseClient
        Rst.CursorLocation = 3
        'Rst.Open "TB_TimeInOutTemp", gcnAccess, adOpenStatic, adLockBatchOptimistic
        Rst.Open "TB_TimeInOutTemp", gcnAccess, 3, 4
        Set fs = New Scripting.FileSystemObject
        Set f = fs.OpenTextFile(sPathFile, _
                                ForReading, False)
        arrFieldnames = Array("StaffCode", "WorkDate", _
                              "TimeInOut", "InOutCode")
        With f
            l = 0
            While Not .AtEndOfStream
                l = l + 1
                sTemp = .ReadLine
                sStaffCode = Mid(sTemp, 1, 5)
                If Val(sStaffCode) > 8380 And Val(sStaffCode) <> 11111 Then
                    'Format as dd/mm/yyyy
                    sDate = Mid(sTemp, 15, 2) & "/" & Mid(sTemp, 12, 2) & "/" & Mid(sTemp, 7, 4)
                    'dDate = "#" & sDate & "#"
                    sTime = sDate & " " & Mid(sTemp, 18, 5)
                    vInOut = Mid(sTemp, 26, 8): vInOut = Val(vInOut)
                    arrValues = Array(sStaffCode, sDate, sTime, vInOut)
                    Rst.AddNew arrFieldnames, arrValues
                End If
                Application.StatusBar = "Reading to record " & l
            Wend
            Application.StatusBar = "Batch updating. Please wait."
            Rst.UpdateBatch
            'Close the recordset
            Rst.Close
            'Close the TextStream
            .Close

        End With
    Else
        MsgBox "Can not connect to database." & vbCrLf & _
               "Pls contact the author.", vbCritical + vbOKOnly, mcsAppName
    End If



ErrorExit:
    Application.StatusBar = False
    gcnAccess.Close
    Set f = Nothing
    Set fs = Nothing
    Set Rst = Nothing
    Exit Sub

ErrorHandler:

    RecordErrors "mIniLogFile", "ReadFromTextFile", False
    RecordErrorsConnection gcnAccess, False
    Resume ErrorExit

End Sub
  • Sau khi nhập dữ liệu vào thì chúng ta phải xử lý dữ liệu thô này, bởi vì:
    • Một người có thể bấm vào/ra nhiều lần.
    • Mặc dù cùng một thời gian bấm thẻ, nhưng đối với công nhân này là vào làm, nhưng đối với công nhân kia là ra ca.
    • Có những lúc vào quên bấm thẻ (hay quét vân tay), có những lúc ra quên bấm thẻ (hay quét vân tay).
    • Không thể phân biệt vào hay ra do máy bấm thẻ/quét vân tay của công ty chỉ có một máy...
    • Và còn nhiều vấn đề khác.
Việc xử lý dữ liệu thô này phải kết hợp tự động hoặc xử lý từng người (record) một.
Ví dụ sau là một thủ tục xử lý giờ tự động:
Mã:
Sub AdjHourInOut(sDateString1 As String, sDateString2 As String)
    'Please take note that sDateString1, sDateString2 is
    'Date string with the format mm/dd/yyyy

    Dim iCon As Long, sSQL As String, Rst As ADODB.Recordset
    Dim sSQLUpdate As String, RstUpdate As ADODB.Recordset
    Dim lInOutCode As Long
    Dim vTimeInOut As Variant, vTimeTemp As Variant
    Dim lIndex As Long

    On Error GoTo ErrorHandler

    iCon = ConnectToDB()
    If iCon = 1 Then
        sSQL = "SELECT aIndex, WorkDate, TimeInOut, InOutCode " & _
               "FROM TB_TimeInOutTemp " & _
               "WHERE WorkDate BETWEEN #" & sDateString1 & "# AND #" & sDateString2 & "# " & _
               "ORDER BY WorkDate;"
        gcnAccess.Open
        Set Rst = SqlGetRecordset(gcnAccess, sSQL)
        Do While Not Rst.EOF
            'lHourInOut = Rst.Fields("HourInOut").Value
            'lMinuteInOut = Rst.Fields("MinuteInOut").Value
            lInOutCode = Rst.Fields("InOutCode").Value
            vTimeInOut = Format(Rst.Fields("TimeInOut").Value, "HH:MM")
            lIndex = Rst.Fields("aIndex").Value
            Select Case lInOutCode
            Case 1020    'i.e IN
                Select Case vTimeInOut
                Case #5:31:00 AM# To #6:10:00 AM#
                    vTimeTemp = #6:00:00 AM#
                Case #6:11:00 AM# To #6:30:00 AM#
                    vTimeTemp = #6:30:00 AM#
                Case #6:31:00 AM# To #7:10:00 AM#
                    vTimeTemp = #7:00:00 AM#
                Case #7:11:00 AM# To #7:30:00 AM#
                    vTimeTemp = #7:30:00 AM#
                Case #7:31:00 AM# To #8:10:00 AM#
                    vTimeTemp = #8:00:00 AM#
                Case #8:11:00 AM# To #8:30:00 AM#
                    vTimeTemp = #8:30:00 AM#
                Case #8:31:00 AM# To #9:10:00 AM#
                    vTimeTemp = #9:00:00 AM#
                Case #9:11:00 AM# To #9:30:00 AM#
                    vTimeTemp = #9:30:00 AM#
                Case #9:31:00 AM# To #10:10:00 AM#
                    vTimeTemp = #10:00:00 AM#
                Case #10:11:00 AM# To #10:30:00 AM#
                    vTimeTemp = #10:30:00 AM#
                Case #10:31:00 AM# To #11:10:00 AM#
                    vTimeTemp = #11:00:00 AM#
                Case #11:11:00 AM# To #11:30:00 AM#
                    vTimeTemp = #11:30:00 AM#
                Case #11:31:00 AM# To #12:10:00 PM#
                    vTimeTemp = #12:00:00 PM#
                Case #12:11:00 PM# To #12:30:00 PM#
                    vTimeTemp = #12:30:00 PM#
                Case #12:31:00 PM# To #1:10:00 PM#
                    vTimeTemp = #1:00:00 PM#
                Case #1:10:00 PM# To #1:30:00 PM#
                    vTimeTemp = #1:30:00 PM#
                Case #1:31:00 PM# To #2:10:00 PM#
                    vTimeTemp = #2:00:00 PM#
                Case #2:11:00 PM# To #2:30:00 PM#
                    vTimeTemp = #2:30:00 PM#
                Case #2:31:00 PM# To #3:10:00 PM#
                    vTimeTemp = #3:00:00 PM#
                Case #3:11:00 PM# To #3:30:00 PM#
                    vTimeTemp = #3:30:00 PM#
                Case #3:31:00 PM# To #4:10:00 PM#
                    vTimeTemp = #4:00:00 PM#
                Case #4:11:00 PM# To #4:30:00 PM#
                    vTimeTemp = #4:30:00 PM#
                Case #4:31:00 PM# To #5:10:00 PM#
                    vTimeTemp = #5:00:00 PM#
                Case #5:11:00 PM# To #5:30:00 PM#
                    vTimeTemp = #5:30:00 PM#
                Case #5:31:00 PM# To #6:10:00 PM#
                    vTimeTemp = #6:00:00 PM#
                Case #6:11:00 PM# To #6:30:00 PM#
                    vTimeTemp = #6:30:00 PM#
                Case #6:31:00 PM# To #7:10:00 PM#
                    vTimeTemp = #7:00:00 PM#
                Case #7:11:00 PM# To #7:30:00 PM#
                    vTimeTemp = #7:30:00 PM#
                Case #7:31:00 PM# To #8:10:00 PM#
                    vTimeTemp = #8:00:00 PM#
                Case #8:11:00 PM# To #8:30:00 PM#
                    vTimeTemp = #8:30:00 PM#
                Case #8:31:00 PM# To #9:10:00 PM#
                    vTimeTemp = #9:00:00 PM#
                Case #9:11:00 PM# To #9:30:00 PM#
                    vTimeTemp = #9:30:00 PM#
                Case #9:31:00 PM# To #10:10:00 PM#
                    vTimeTemp = #10:00:00 PM#
                Case #10:11:00 PM# To #10:30:00 PM#
                    vTimeTemp = #10:30:00 PM#
                Case #10:31:00 PM# To #11:10:00 PM#
                    vTimeTemp = #11:00:00 PM#
                Case #11:11:00 PM# To #11:30:00 PM#
                    vTimeTemp = #11:30:00 PM#
                Case #11:31:00 PM# To #12:10:00 AM#
                    vTimeTemp = #12:00:00 AM#
                Case Else
                    vTimeTemp = vTimeInOut
                End Select

            Case 1120    'i.e OUT
                Select Case vTimeInOut
                Case #5:55:00 AM# To #6:24:00 AM#
                    vTimeTemp = #6:00:00 AM#
                Case #6:25:00 AM# To #6:54:00 AM#
                    vTimeTemp = #6:30:00 AM#
                Case #6:55:00 AM# To #7:24:00 AM#
                    vTimeTemp = #7:00:00 AM#
                Case #7:25:00 AM# To #7:54:00 AM#
                    vTimeTemp = #7:30:00 AM#
                Case #7:55:00 AM# To #8:24:00 AM#
                    vTimeTemp = #8:00:00 AM#
                Case #8:25:00 AM# To #8:54:00 AM#
                    vTimeTemp = #8:30:00 AM#
                Case #8:55:00 AM# To #9:24:00 AM#
                    vTimeTemp = #9:00:00 AM#
                Case #9:25:00 AM# To #9:54:00 AM#
                    vTimeTemp = #9:30:00 AM#
                Case #9:55:00 AM# To #10:24:00 AM#
                    vTimeTemp = #10:00:00 AM#
                Case #10:25:00 AM# To #10:54:00 AM#
                    vTimeTemp = #10:30:00 AM#
                Case #10:55:00 AM# To #11:24:00 AM#
                    vTimeTemp = #11:00:00 AM#
                Case #11:25:00 AM# To #11:54:00 AM#
                    vTimeTemp = #11:30:00 AM#
                Case #11:55:00 AM# To #12:24:00 PM#
                    vTimeTemp = #12:00:00 PM#
                Case #12:25:00 PM# To #12:54:00 PM#
                    vTimeTemp = #12:30:00 PM#
                Case #12:55:00 PM# To #1:24:00 PM#
                    vTimeTemp = #1:00:00 PM#
                Case #1:25:00 PM# To #1:54:00 PM#
                    vTimeTemp = #1:30:00 PM#
                Case #1:55:00 PM# To #2:24:00 PM#
                    vTimeTemp = #2:00:00 PM#
                Case #2:25:00 PM# To #2:54:00 PM#
                    vTimeTemp = #2:30:00 PM#
                Case #2:55:00 PM# To #3:24:00 PM#
                    vTimeTemp = #3:00:00 PM#
                Case #3:25:00 PM# To #3:54:00 PM#
                    vTimeTemp = #3:30:00 PM#
                Case #3:55:00 PM# To #4:24:00 PM#
                    vTimeTemp = #4:00:00 PM#
                Case #4:25:00 PM# To #4:54:00 PM#
                    vTimeTemp = #4:30:00 PM#
                Case #4:55:00 PM# To #5:24:00 PM#
                    vTimeTemp = #5:00:00 PM#
                Case #5:25:00 PM# To #5:54:00 PM#
                    vTimeTemp = #5:30:00 PM#
                Case #5:55:00 PM# To #6:24:00 PM#
                    vTimeTemp = #6:00:00 PM#
                Case #6:25:00 PM# To #6:54:00 PM#
                    vTimeTemp = #6:30:00 PM#
                Case #6:55:00 PM# To #7:24:00 PM#
                    vTimeTemp = #7:00:00 PM#
                Case #7:25:00 PM# To #7:54:00 PM#
                    vTimeTemp = #7:30:00 PM#
                Case #7:55:00 PM# To #8:24:00 PM#
                    vTimeTemp = #8:00:00 PM#
                Case #8:25:00 PM# To #8:54:00 PM#
                    vTimeTemp = #8:30:00 PM#
                Case #8:55:00 PM# To #9:24:00 PM#
                    vTimeTemp = #9:00:00 PM#
                Case #9:25:00 PM# To #9:54:00 PM#
                    vTimeTemp = #9:30:00 PM#
                Case #9:55:00 PM# To #10:24:00 PM#
                    vTimeTemp = #10:00:00 PM#
                Case #10:25:00 PM# To #10:54:00 PM#
                    vTimeTemp = #10:30:00 PM#
                Case #10:55:00 PM# To #11:24:00 PM#
                    vTimeTemp = #11:00:00 PM#
                Case #11:25:00 PM# To #11:54:00 PM#
                    vTimeTemp = #11:30:00 PM#
                Case #11:55:00 PM# To #12:24:00 AM#
                    vTimeTemp = #12:00:00 AM#
                Case #12:25:00 AM# To #12:54:00 AM#
                    vTimeTemp = #12:30:00 AM#
                Case #12:55:00 AM# To #1:24:00 AM#
                    vTimeTemp = #1:00:00 AM#
                Case #1:25:00 AM# To #1:54:00 AM#
                    vTimeTemp = #1:30:00 AM#
                Case #1:55:00 AM# To #2:24:00 AM#
                    vTimeTemp = #2:00:00 AM#
                Case #2:25:00 AM# To #2:54:00 AM#
                    vTimeTemp = #2:30:00 AM#
                Case #2:55:00 AM# To #3:24:00 AM#
                    vTimeTemp = #3:00:00 AM#
                Case #3:25:00 AM# To #3:54:00 AM#
                    vTimeTemp = #3:30:00 AM#
                Case #3:55:00 AM# To #4:24:00 AM#
                    vTimeTemp = #4:00:00 AM#
                Case #4:25:00 AM# To #4:54:00 AM#
                    vTimeTemp = #4:30:00 AM#
                Case #4:55:00 AM# To #5:24:00 AM#
                    vTimeTemp = #5:00:00 AM#
                Case #5:25:00 AM# To #5:54:00 AM#
                    vTimeTemp = #5:30:00 AM#
                Case Else
                    vTimeTemp = vTimeInOut
                End Select
            End Select
            sSQLUpdate = "UPDATE TB_TimeInOutTemp " & _
                         "SET TimeInOutAdj=#" & vTimeTemp & "# " & _
                         "WHERE aIndex=" & lIndex & "; "
            Set RstUpdate = SqlGetRecordset(gcnAccess, sSQLUpdate, True)
            '            Debug.Print sSQLUpdate
            Rst.MoveNext
        Loop
        MsgBoxUni VNI("Baïn ñaõ caäp nhaät thaønh coâng."), vbOKOnly + vbInformation, VNI("Thoâng baùo")
    Else
        MsgBoxUni VNI("Khoâng theå keát noái vôùi CSDL." & vbCrLf & _
                      "Xin kieåm tra laïi."), vbOKOnly + vbInformation, VNI("Thoâng baùo")
    End If



ErrorExit:

    Exit Sub

ErrorHandler:

    If bCentralErrorHandler("mChamCong", "AdjHourInOut", , False) Then
        Stop
        Resume
    Else
        Resume ErrorExit
    End If


End Sub


 
Bước này ta cũng có thể kết hợp xử lý từng trường hợp cụ thể bằng cách liệt kê lên một lưới dữ liệu rồi sẽ có một người kiểm tra và xác định giờ người công nhân bấm/quẹt là giờ ra/hay vào.

Nếu làm tốt thì một người có thể xử lý số ngày công của khoảng 200 công nhân trong một ngày.

Sau đó chúng ta có thể xuất ra báo cáo, định dạng thì tùy theo yêu cầu cụ thể:

chamcong2.jpg


Từ đó bạn có thể biết được cụ thể các yêu cầu khác như: người này đi trể bao nhiêu lần trong một tháng/ mỗi lần là bao nhiêu phút...

Bài toán chấm công là bài toán phức tạp, chính vì vậy mà có những phần mềm chuyên giúp bạn về vấn đề này.

Đối với bài toán của bạn tôi nghĩ chỉ cần dùng các hàm để xác định ngày, giờ, phút bấm thẻ/quét vân tay. Từ đó phân tích theo yêu cầu của mình.
Trường hợp của bạn, bạn hãy dùng các hàm HOUR, MINUTE để kiểm tra và xác định:


  • Vào/Ra.
  • Trể bao nhiêu phút/Sớm bao nhiêu phút.
  • Xác định trong một tháng đi trể/sớm bao nhiêu lần và tổng số phút đi trể/sớm.
Vbavn
 
Lần chỉnh sửa cuối:
Bên mình chấm công theo ca: 8h/ca/người, như bình thường là 8:00AM - 17:00PM, còn bên mình nó vào ca k cố định: 16:00pm - 23:00pm, hoặc 10:00am - 18:00pm, chạy công thức nó chỉ hiểu am-pm hoặc pm-am, nhưng có ca nằm trong khung pm-pm, nên mình tính k đc, mong mn giúp mình, để tính ca 8h, ngoài 8h là tăng ca
 

File đính kèm

  • chamcongnhap.xlsx
    26.7 KB · Đọc: 23
Web KT
Back
Top Bottom