Dim m As Integer For i = 0 To rdEmp.RecordCount - 1 m = 0 sEmp = rdEmp![EmpID] sDate = IIf(isNull(rdEmp![dateHired]), sDt, rdEmp![dateHired]) eDate = IIf(isNull(rdEmp![LCdate]), Date, rdEmp![LCdate])
SQL = "delete from tmp_Trans where EmpID='" & sEmp & "' and Date>=#" & sDt & "# and Date<=#" & eDt & "#" gLTClockDB.Execute SQL
If sDate > eDt Then '入厂日期大于处理日期的最后一天时,不处理 GoTo Next_Emp End If If eDate < sDt Then '辞职日期小于处理日期的第一天时,不处理 GoTo Next_Emp End If
SQL = "select * from tmp_Trans" Set rdTmp = gLTClockDB.OpenRecordset(SQL) currDt = sDt Do While currDt <= eDt If currDt > eDate Then Exit Do End If If currDt < sDate Then '入厂日期的问题 2002-06-05 GoTo Next_Date 'Exit Do End If
' Randomize ''2005-09-29 ' X = Round(Rnd * 10, 0) - 5 '取随机数*10,然后四舍五入,-5是上下浮动5分钟. X = Round(Rnd * 100, 0) tsde1 = DateAdd("n", RndX(X) * -1, dtStart1) 'Randomize ''2005-09-29 X = Round(Rnd * 100, 0) tsde2 = DateAdd("n", RndX(X) * -1, dtStart2) ' Randomize ''2005-09-29 X = Round(Rnd * 100, 0) If dtStart3 <> "_:_" And IsDate(dtStart3) Then tsde3 = DateAdd("n", RndX(X) * -1, dtStart3) End If ' Randomize ''2005-09-29 X = Round(Rnd * 100, 0) tede1 = DateAdd("n", RndX(X), dtEnd1) ' Randomize ''2005-09-29 X = Round(Rnd * 100, 0) tede2 = DateAdd("n", RndX(X), dtEnd2) ' Randomize ''2005-09-29 X = Round(Rnd * 100, 0) If dtEnd3 <> "_:_" And IsDate(dtEnd3) Then tede3 = DateAdd("n", RndX(X), dtEnd3) End If
If m = 0 Then '对比上一位员工 For k = 0 To 1000 If tsde1 = tsde1c Then k = k + 1 X = Round(Rnd * 100, 0) tsde1 = DateAdd("n", RndX(X) * -1, dtStart1) Else Exit For End If Next k
'Randomize ''2005-09-29 For k = 0 To 1000 If tsde2 = tsde2c Then k = k + 1 X = Round(Rnd * 100, 0) tsde2 = DateAdd("n", RndX(X) * -1, dtStart2) Else Exit For End If Next k ' Randomize ''2005-09-29 For k = 0 To 1000 If tsde3 = tsde3c Then k = k + 1 X = Round(Rnd * 100, 0) If dtStart3 <> "_:_" And IsDate(dtStart3) Then tsde3 = DateAdd("n", RndX(X) * -1, dtStart3) End If Else Exit For End If Next k ' Randomize ''2005-09-29 For k = 0 To 1000 If tede1 = tede1c Then k = k + 1 X = Round(Rnd * 100, 0) tede1 = DateAdd("n", RndX(X), dtEnd1)
Else Exit For End If Next k
For k = 0 To 1000 If tede2 = tede2c Then k = k + 1 ' Randomize ''2005-09-29 X = Round(Rnd * 100, 0) tede2 = DateAdd("n", RndX(X), dtEnd2) Else Exit For End If Next k
For k = 0 To 1000 If tede3 = tede3c Then k = k + 1 ' Randomize ''2005-09-29 X = Round(Rnd * 100, 0) If dtEnd3 <> "_:_" And IsDate(dtEnd3) Then tede3 = DateAdd("n", RndX(X), dtEnd3) End If Else Exit For End If Next kElse '对比上次时间 For k = 0 To 1000 If tsd1 = tsde1 Then k = k + 1 X = Round(Rnd * 100, 0) tsde1 = DateAdd("n", RndX(X) * -1, dtStart1) Else Exit For End If Next k 'Randomize ''2005-09-29 For k = 0 To 1000 If tsd2 = tsde2 Then k = k + 1 X = Round(Rnd * 100, 0) tsde2 = DateAdd("n", RndX(X) * -1, dtStart2) Else Exit For End If Next k ' Randomize ''2005-09-29 For k = 0 To 1000 If tsd3 = tsde3 Then k = k + 1 X = Round(Rnd * 100, 0) If dtStart3 <> "_:_" And IsDate(dtStart3) Then tsde3 = DateAdd("n", RndX(X) * -1, dtStart3) End If Else Exit For End If Next k ' Randomize ''2005-09-29 For k = 0 To 1000 If ted1 = tede1 Then k = k + 1 X = Round(Rnd * 100, 0) tede1 = DateAdd("n", RndX(X), dtEnd1) Else Exit For End If Next k For k = 0 To 1000 If ted2 = tede2 Then k = k + 1 ' Randomize ''2005-09-29 X = Round(Rnd * 100, 0) tede2 = DateAdd("n", RndX(X), dtEnd2) Else Exit For End If Next k For k = 0 To 1000 If ted3 = tede3 Then k = k + 1 ' Randomize ''2005-09-29 X = Round(Rnd * 100, 0) If dtEnd3 <> "_:_" And IsDate(dtEnd3) Then tede3 = DateAdd("n", RndX(X), dtEnd3) End If Else Exit For End If Next k End If rdTmp![TS1] = tsde1 rdTmp![TS2] = tsde2 rdTmp![TS3] = tsde3 rdTmp![TE1] = tede1 rdTmp![TE2] = tede2 rdTmp![TE3] = tede3 rdTmp![LateTimes] = IIf(txtLate = "", 0, txtLate) rdTmp![OTHour] = IIf(txtOT = "", 0, txtOT) If Weekday(currDt) = 1 Or Weekday(currDt) = 7 Then '当为星期六和星期日时 If rdTmp.Fields("TS1") <> "" And rdTmp.Fields("TE1") <> "" Then '写入工时 rdTmp.Fields("SunHour") = 4 '08-07-03 yu |rdTmp.Fields("SunHour") = 3.5 End If If rdTmp.Fields("TS2") <> "" And rdTmp.Fields("TE2") <> "" Then '写入工时 rdTmp.Fields("SunHour") = rdTmp.Fields("SunHour") + 4 '08-07-03 yu | rdTmp.Fields("SunHour") = rdTmp.Fields("SunHour") + 4.5 End If If rdTmp.Fields("OThour") <> "" Then rdTmp.Fields("SunHour") = rdTmp.Fields("SunHour") + rdTmp.Fields("OThour") End If Else If rdTmp.Fields("TS1") <> "" And rdTmp.Fields("TE1") <> "" Then '写入工时 rdTmp.Fields("apHour") = 4 '08-07-03 yu | rdTmp.Fields("apHour") = 3.5 End If If rdTmp.Fields("TS2") <> "" And rdTmp.Fields("TE2") <> "" Then '写入工时 rdTmp.Fields("apHour") = rdTmp.Fields("apHour") + 4 '08-07-03 yu | rdTmp.Fields("apHour") = rdTmp.Fields("apHour") + 4.5 End If If rdTmp.Fields("OThour") <> "" Then rdTmp.Fields("EveHour") = rdTmp.Fields("OThour") End If End If rdTmp.Update
tsd1 = tsde1 '取第1个,时间 tsd2 = tsde2 tsd3 = tsde3 ted1 = tede1 ted2 = tede2 ted3 = tede3 If m = 0 Then tsde1c = tsde1 '取第2个,员工 tsde2c = tsde2 tsde3c = tsde3 tede1c = tede1 tede2c = tede2 tede3c = tede3 End If m = m + 1
假定你的原始数据为进出门的刷卡记录。 生成上下班记录只要将进出门记录进行配对即可。 循环所有员工,以员工、整个统计时间段为条件,按时间排序进行查询。这样每个员工按照时间序循环分析进出门记录: 需要变量:上班标记,上班时间,下班时间 1)对进门记录 IF 上班标记 = 下班 THEN 上班时间 = 打卡时间 上班标记 = 上班 'ELSE '忽略重复打卡 END IF 2)对出门记录 IF 上班标记 = 上班 THEN 下班时间 = 打卡时间 用 上班时间、下班时间 生成一条上下班记录 上班标记 = 下班 'ELSE '忽略重复打卡 END IF
select * from table where name='' and date='2010-02-01''当月
select * from table where name='' and date >='2010-01-01' and date <='2010-01-31'
--当天
select * from table where name='' and date='2010-02-01'
--当月
select * from table where name='' and date >='2010-01-01' and date <='2010-01-31'
select * from table where name='' and Month(date) =1
再吧你的sql的代码写写下,别的不要。
For i = 0 To rdEmp.RecordCount - 1
m = 0
sEmp = rdEmp![EmpID]
sDate = IIf(isNull(rdEmp![dateHired]), sDt, rdEmp![dateHired])
eDate = IIf(isNull(rdEmp![LCdate]), Date, rdEmp![LCdate])
SQL = "delete from tmp_Trans where EmpID='" & sEmp & "' and Date>=#" & sDt & "# and Date<=#" & eDt & "#"
gLTClockDB.Execute SQL
If sDate > eDt Then '入厂日期大于处理日期的最后一天时,不处理
GoTo Next_Emp
End If
If eDate < sDt Then '辞职日期小于处理日期的第一天时,不处理
GoTo Next_Emp
End If
SQL = "select * from tmp_Trans"
Set rdTmp = gLTClockDB.OpenRecordset(SQL)
currDt = sDt
Do While currDt <= eDt
If currDt > eDate Then
Exit Do
End If
If currDt < sDate Then '入厂日期的问题 2002-06-05
GoTo Next_Date
'Exit Do
End If
rdTmp.AddNew
rdTmp![EmpID] = sEmp
rdTmp![Date] = currDt
' X = Round(Rnd * 10, 0) - 5 '取随机数*10,然后四舍五入,-5是上下浮动5分钟.
X = Round(Rnd * 100, 0)
tsde1 = DateAdd("n", RndX(X) * -1, dtStart1)
'Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
tsde2 = DateAdd("n", RndX(X) * -1, dtStart2)
' Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
If dtStart3 <> "_:_" And IsDate(dtStart3) Then
tsde3 = DateAdd("n", RndX(X) * -1, dtStart3)
End If
' Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
tede1 = DateAdd("n", RndX(X), dtEnd1)
' Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
tede2 = DateAdd("n", RndX(X), dtEnd2)
' Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
If dtEnd3 <> "_:_" And IsDate(dtEnd3) Then
tede3 = DateAdd("n", RndX(X), dtEnd3)
End If
For k = 0 To 1000
If tsde1 = tsde1c Then
k = k + 1
X = Round(Rnd * 100, 0)
tsde1 = DateAdd("n", RndX(X) * -1, dtStart1)
Else
Exit For
End If
Next k
'Randomize ''2005-09-29
For k = 0 To 1000
If tsde2 = tsde2c Then
k = k + 1
X = Round(Rnd * 100, 0)
tsde2 = DateAdd("n", RndX(X) * -1, dtStart2)
Else
Exit For
End If
Next k
' Randomize ''2005-09-29
For k = 0 To 1000
If tsde3 = tsde3c Then
k = k + 1
X = Round(Rnd * 100, 0)
If dtStart3 <> "_:_" And IsDate(dtStart3) Then
tsde3 = DateAdd("n", RndX(X) * -1, dtStart3)
End If
Else
Exit For
End If
Next k
' Randomize ''2005-09-29
For k = 0 To 1000
If tede1 = tede1c Then
k = k + 1
X = Round(Rnd * 100, 0)
tede1 = DateAdd("n", RndX(X), dtEnd1)
Else
Exit For
End If
Next k
For k = 0 To 1000
If tede2 = tede2c Then
k = k + 1
' Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
tede2 = DateAdd("n", RndX(X), dtEnd2)
Else
Exit For
End If
Next k
For k = 0 To 1000
If tede3 = tede3c Then
k = k + 1
' Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
If dtEnd3 <> "_:_" And IsDate(dtEnd3) Then
tede3 = DateAdd("n", RndX(X), dtEnd3)
End If
Else
Exit For
End If
Next kElse '对比上次时间
For k = 0 To 1000
If tsd1 = tsde1 Then
k = k + 1
X = Round(Rnd * 100, 0)
tsde1 = DateAdd("n", RndX(X) * -1, dtStart1)
Else
Exit For
End If
Next k
'Randomize ''2005-09-29
For k = 0 To 1000
If tsd2 = tsde2 Then
k = k + 1
X = Round(Rnd * 100, 0)
tsde2 = DateAdd("n", RndX(X) * -1, dtStart2)
Else
Exit For
End If
Next k
' Randomize ''2005-09-29
For k = 0 To 1000
If tsd3 = tsde3 Then
k = k + 1
X = Round(Rnd * 100, 0)
If dtStart3 <> "_:_" And IsDate(dtStart3) Then
tsde3 = DateAdd("n", RndX(X) * -1, dtStart3)
End If
Else
Exit For
End If
Next k
' Randomize ''2005-09-29
For k = 0 To 1000
If ted1 = tede1 Then
k = k + 1
X = Round(Rnd * 100, 0)
tede1 = DateAdd("n", RndX(X), dtEnd1)
Else
Exit For
End If
Next k
For k = 0 To 1000
If ted2 = tede2 Then
k = k + 1
' Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
tede2 = DateAdd("n", RndX(X), dtEnd2)
Else
Exit For
End If
Next k
For k = 0 To 1000
If ted3 = tede3 Then
k = k + 1
' Randomize ''2005-09-29
X = Round(Rnd * 100, 0)
If dtEnd3 <> "_:_" And IsDate(dtEnd3) Then
tede3 = DateAdd("n", RndX(X), dtEnd3)
End If
Else
Exit For
End If
Next k
End If rdTmp![TS1] = tsde1
rdTmp![TS2] = tsde2
rdTmp![TS3] = tsde3
rdTmp![TE1] = tede1
rdTmp![TE2] = tede2
rdTmp![TE3] = tede3 rdTmp![LateTimes] = IIf(txtLate = "", 0, txtLate)
rdTmp![OTHour] = IIf(txtOT = "", 0, txtOT)
If Weekday(currDt) = 1 Or Weekday(currDt) = 7 Then '当为星期六和星期日时
If rdTmp.Fields("TS1") <> "" And rdTmp.Fields("TE1") <> "" Then '写入工时
rdTmp.Fields("SunHour") = 4 '08-07-03 yu |rdTmp.Fields("SunHour") = 3.5
End If
If rdTmp.Fields("TS2") <> "" And rdTmp.Fields("TE2") <> "" Then '写入工时
rdTmp.Fields("SunHour") = rdTmp.Fields("SunHour") + 4 '08-07-03 yu | rdTmp.Fields("SunHour") = rdTmp.Fields("SunHour") + 4.5
End If
If rdTmp.Fields("OThour") <> "" Then
rdTmp.Fields("SunHour") = rdTmp.Fields("SunHour") + rdTmp.Fields("OThour")
End If
Else
If rdTmp.Fields("TS1") <> "" And rdTmp.Fields("TE1") <> "" Then '写入工时
rdTmp.Fields("apHour") = 4 '08-07-03 yu | rdTmp.Fields("apHour") = 3.5
End If
If rdTmp.Fields("TS2") <> "" And rdTmp.Fields("TE2") <> "" Then '写入工时
rdTmp.Fields("apHour") = rdTmp.Fields("apHour") + 4 '08-07-03 yu | rdTmp.Fields("apHour") = rdTmp.Fields("apHour") + 4.5
End If
If rdTmp.Fields("OThour") <> "" Then
rdTmp.Fields("EveHour") = rdTmp.Fields("OThour")
End If
End If
rdTmp.Update
tsd1 = tsde1 '取第1个,时间
tsd2 = tsde2
tsd3 = tsde3
ted1 = tede1
ted2 = tede2
ted3 = tede3
If m = 0 Then
tsde1c = tsde1 '取第2个,员工
tsde2c = tsde2
tsde3c = tsde3
tede1c = tede1
tede2c = tede2
tede3c = tede3
End If
m = m + 1
生成上下班记录只要将进出门记录进行配对即可。
循环所有员工,以员工、整个统计时间段为条件,按时间排序进行查询。这样每个员工按照时间序循环分析进出门记录:
需要变量:上班标记,上班时间,下班时间
1)对进门记录
IF 上班标记 = 下班 THEN
上班时间 = 打卡时间
上班标记 = 上班
'ELSE
'忽略重复打卡
END IF
2)对出门记录
IF 上班标记 = 上班 THEN
下班时间 = 打卡时间
用 上班时间、下班时间 生成一条上下班记录
上班标记 = 下班
'ELSE
'忽略重复打卡
END IF
你这个代码似乎比较糟糕哦,
我现在也在在这个考勤的问题,但是我这没你那复杂,我只要考虑一个班次就可以,不知道你是怎么考虑跨天考勤这个问题的。比如上班时间20:00,下班时间第二天02:00。