CPersonSet rs_person; // 构造员工表 rs_person.Open(); // 打开员工表
n=rs_person.GetRecordCount(); // 记录员工人数 i=0; // 初始化已处理员工人数
while(!rs_person.IsEOF()) // 依次对每个员工进行统计 {
//获取出勤记录 // 执行查询
CString stringStime=strSTime; CString stringEtime=strETime;
rs_attend.Open(CRecordset::forwardOnly,
\where PERSON='\+ \+ \+ \
strTmp1.Empty(); // 清空strTmp1 // 初始化
nWorkHour=nOverHour=0; nLeaveHDay=nErrandHDay=0;
nLateTimes=nEarlyTimes=nAbsentTimes=0;
TimeStamp=m_STime; // 初始化时间戳为统计开始时间
while(TimeStamp < m_ETime+tp_02) // 判断是否超出统计结束时间 {
if(TimeStamp.GetDayOfWeek()!=1 &&
TimeStamp.GetDayOfWeek()!=7) // 判断是否工作日 { for(j=0;j<=1;j++) // 遍历班次 {
记录
rs_attend.Close();
LateTime=TimeStamp+TimeSpan[2*j]; // 设置迟到时间 EarlyTime=TimeStamp+TimeSpan[2*j+1]; // 设置早退时间 // 判断是否请假
rs_leave.Open(CRecordset::forwardOnly, \VE where\\ PERSON='\ + \
+ LateTime.Format(\ + \
+ EarlyTime.Format(\
+ \
bLeave=(rs_leave.GetRecordCount()>0); // 判断是否有请假rs_leave.Close(); // 关闭记录集 // 判断是否出差
rs_errand.Open(CRecordset::forwardOnly, \ PERSON='\ + \
+ LateTime.Format(\ + \
+ EarlyTime.Format(\
+ \
记录
bErrand=(rs_errand.GetRecordCount()>0); // 判断是否有出差rs_errand.Close(); // 关闭记录集 rs_attend.Open(CRecordset::forwardOnly,
\where PERSON='\+ \+ \+ \
if(bLeave) // 如果有请假记录
nLeaveHDay++; // 请假记录加1
else if(bErrand) // 如果有出差记录 { }
else // 正常上班 {
WorkStart=LateTime; // 设置工作开始时间 WorkEnd=EarlyTime; // 设置工作结束时间 bLate=TRUE; // 初始化迟到判断 bAbsent=FALSE; // 初始化旷工判断 // 判断是否迟到
nErrandHDay++; // 出差计数加1
nWorkHour+=nHours[j]; // 按正常班累加工作时间
if(!rs_attend.IsEOF() && // 记录集不空 strTmp1.IsEmpty()) // 空,第一次GetFieldValue
rs_attend.GetFieldValue(\得到IO_TIME
while(!rs_attend.IsEOF()
&& StrToTime(strTmp1)<=LateTime)
{// 根据时间顺序判断是否迟到
// 得到IN_OUT
rs_attend.GetFieldValue(\
bLate=(strTmp2==\判断上班时间前是否报到
rs_attend.MoveNext(); // 跳到下一条出勤记录
}
// 判断是否旷工 if(bLate) // 判断是否迟到 {
if(!rs_attend.IsEOF()
&&
// 得到IO_TIME if(!rs_attend.IsEOF())
rs_attend.GetFieldValue(\
StrToTime(strTmp1) WorkStart=StrToTime(strTmp1); // 记录迟到时间 else bAbsent=TRUE; // 如果下班前仍未报到记为旷工 } bEarly=FALSE; // 判断是否早退 while(!rs_attend.IsEOF() && StrToTime(strTmp1) { // 得到IN_OUT rs_attend.GetFieldValue(\bEarly=(strTmp2==\判断是否有早退 if(bEarly) { } // 将早退时间记录为工作结束时间 WorkEnd=StrToTime(strTmp1); else WorkEnd=EarlyTime; // 将下班时间记录为工作结束时间 } } // 如果旷工,增加旷工次数记录 if(bAbsent) nAbsentTimes++; else { } // 如果迟到,增加迟到次数记录 if(bLate) nLateTimes++; // 如果早退,增加早退次数记录 if(bEarly) nEarlyTimes++; // 计算实际工作时间 nWorkHour+=(WorkEnd-WorkStart).GetTotalHours(); if((WorkEnd-WorkStart).GetMinutes()>30) nWorkHour++; // 四舍五入 rs_attend.MoveNext(); // 跳至下一条出勤记录 // 得到IO_TIME if(!rs_attend.IsEOF()) rs_attend.GetFieldValue(\ } // End of 遍历班次 } // End of 是否工作日 TimeStamp+=tp_1; // 推进一天 } // End of TimeStamp < m_ETime+tp_02 rs_attend.Close(); // 关闭Q_attend记录集 // 统计加班时间 CRecordset rs_overtime(&db); // 构造Q_overtime记录集 rs_overtime.Open(CRecordset::forwardOnly,