PDA

View Full Version : chấm công bằng vân tay



lehien11_86
09-06-10, 09:54 PM
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

SA_DQ
10-06-10, 12:10 AM
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

vungoc
10-06-10, 07:50 AM
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.

lehien11_86
11-06-10, 10:12 PM
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

vbavn
11-06-10, 11:19 PM
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.

http://i2.photobucket.com/albums/y4/levanduyet/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:


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:

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

vbavn
11-06-10, 11:24 PM
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ể:

http://i2.photobucket.com/albums/y4/levanduyet/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