📄 wsalary_work.~cpp
字号:
TStringList *str2 = new TStringList();
switch(PageControl1->ActivePageIndex){ //判断PageControl现在切换到了那一页,对数据记录查询窗口进行不同的初始化赋值
case 0 :{
F_Query->Q_Table = "WSalary_Attendance"; //赋查找表名为出勤信息表
str1->Add("员工工号"); //添加员工工号查找字段
str2->Add("Atten_PID"); //添加员工工员在数据表中的字段名
F_Query->T_Field[0] = 0; //添加部门字段类型代号,为整数类型
str1->Add("出勤日期"); //添加出勤日期查找字段
str2->Add("Atten_Time"); //添加出勤日期在数据表中的字段名
F_Query->T_Field[1] = 2; //添加出勤日期字段类型代号,为日期类型
F_Query->S_Field = str1;
F_Query->N_Field = str2;
F_Query->Query = DM->AQ_Atten; //设定查找数据集为出勤信息表
F_Query->ShowModal(); //打开数据记录查询窗口
// DM->AQ_Atten = F_Query->Query;
break;
}
case 4 :{
F_Query->Q_Table = "WSalary_Stat"; //赋查找表名为考勤统计信息表
str1->Add("员工工号"); //添加员工工号查找字段
str2->Add("Stat_PID"); //添加员工工员在数据表中的字段名
F_Query->T_Field[0] = 0; //添加部门字段类型代号,为整数类型
str1->Add("统计年月"); //添加统计年月查找字段
str2->Add("Stat_YMonth"); //添加统计年月在数据表中的字段名
F_Query->T_Field[1] = 2; //添加统计年月字段类型代号,为日期类型
F_Query->S_Field = str1;
F_Query->N_Field = str2;
F_Query->Query = DM->AQ_Stat; //设定查找数据集为考勤统计信息表
F_Query->ShowModal(); //打开数据记录查询窗口
// DM->AQ_Stat = F_Query->Query;
break;
}
}
delete str1,str2; //释放str1,str2对象
}
//---------------------------------------------------------------------------
void __fastcall TF_Work::ToolButton12Click(TObject *Sender)
{ /*****关闭工具条快捷按钮单击事件*****/
F_Work->Close(); //关闭考勤管理窗口
}
//---------------------------------------------------------------------------
void __fastcall TF_Work::ME_PersonChange(TObject *Sender)
{ /*****员工工号屏蔽输入框OnChange事件*****/
if(!ME_Person->Text.TrimRight().IsEmpty()){ //TrimRight()去掉空格函数
DM->AQ_Employee->Filter = "Employee_ID="+ME_Person->Text; //设置员工工号过滤器
DM->AQ_Employee->Filtered = true; //启动过滤器
DM->AQ_Employee->Open(); //打开员工信息表
}
}
//---------------------------------------------------------------------------
void __fastcall TF_Work::ME_BranchChange(TObject *Sender)
{ /*****部门屏蔽输入框OnChange事件*****/
if(!ME_Branch->Text.TrimRight().IsEmpty()){ //TrimRight()去掉空格函数
DM->AQ_Employee->Filter = "Employee_Branch="+ME_Branch->Text; //设置员工工号过滤器
DM->AQ_Employee->Filtered = true; //启动过滤器
DM->AQ_Employee->Open(); //打开员工信息表
}
}
//---------------------------------------------------------------------------
void __fastcall TF_Work::RunQuery(TADOQuery *AQ_Query,AnsiString Str)
{ /*****用户自定义执行SQL语句函数*****/
AQ_Query->Close(); //关闭数据集
AQ_Query->SQL->Clear(); //清除SQL语句
AQ_Query->SQL->Add(Str); //添加SQL语句
AQ_Query->Open(); //执行SQL语句,打开数据集
}
//---------------------------------------------------------------------------
int __fastcall TF_Work::WStatistic(void)
{ /*****用户自定义员工出勤、加班、出差、请假情况统计函数*****/
int Record; //数据表计数值
int Person_ID; //员工工号
AnsiString QStr; //SQL语句
// AnsiString DStart,DEnd; //工资统计开始日期和结束日期
int HWork,HOTime,HEvect,HLeave,DLate,DEarly,DAbsent; //定义工作时间、加班时间等变量
TDateTime Time[4];
HWork=0;HOTime=0;HEvect=0;HLeave=0; //变量初始化为0值
DLate=0;DEarly=0;DAbsent=0; //初化迟到、早退和旷工次数为0
Person_ID = DM->AQ_EmployeeEmployee_ID->Value; //员工工号赋值
TIniFile *ini; //申请一个TIniFile类对象
ini = new TIniFile(ExtractFilePath(ParamStr(0))+"Config.INI"); //ExtractFilePath(ParamStr(0))取得当前工作路径
Time[0] = StrToTime(ini->ReadString("WorkTime","Time1","08:00:00")); //读取上午上班时间,如果不存则赋第三项默认值
Time[1] = StrToTime(ini->ReadString("WorkTime","Time2","11:30:00")); //读取上午下班时间
Time[2] = StrToTime(ini->ReadString("WorkTime","Time3","13:30:00")); //读取下午上班时间
Time[3] = StrToTime(ini->ReadString("WorkTime","Time4","17:00:00")); //读取下午下班时间
// AnsiString s = TimeToStr(Time[0]);
delete ini; //释放ini对象
// DStart = FormatDateTime("yyyy-mm-dd '00:00:00'",DateTimePicker2->Date); //开始日期赋值
// DEnd = FormatDateTime("yyyy-mm-dd '23:59:59'",DateTimePicker3->Date); //结束日期赋值
TDateTime Start,End,WorkStart,WorkEnd,Temp,TLate,TEarly,TWStart,TWEnd;
AnsiString Str;
bool Late,Absent,Early;
unsigned short hour,min,sec,mse; //定义时分秒毫秒
Start = DateTimePicker2->Date; //统计开始日期赋值
End = DateTimePicker3->Date; //统计结束日期赋值
//统计员工出勤数据记录
while(Start.operator !=(End)){ //日期是否相当判断
DM->AQ_WSet->Filter = "WSet_Date='"+DateToStr(Start)+"'"; //设置应到考勤日过滤值
DM->AQ_WSet->Filtered = true; //启动过滤器
if(!DM->AQ_WSet->RecordCount){//当前Start日期不是休息日,即为工作日
QStr = "SELECT * FROM WSalary_Attendance WHERE Atten_PID="+IntToStr(Person_ID)+" AND "; //生成SQL语句
QStr.Insert("Atten_Time BETWEEN '"+DateToStr(Start)+" 00:00:00' AND '"+DateToStr(Start)+" 23:59:59'",QStr.Length()+1);
QStr.Insert("ORDER BY Atten_Time ASC",QStr.Length()+1);
RunQuery(DM->AQ_Atten,QStr);
if(DM->AQ_Atten->RecordCount){
DM->AQ_Atten->First(); //当前活动记录为第一条记录
for(int j=0;j<2;j++){
TLate = StrToDateTime(DateToStr(Start)+" "+TimeToStr(Time[2*j])); //得到迟到时间
TEarly = StrToDateTime(DateToStr(Start)+" "+TimeToStr(Time[2*j+1])); //得到早退时间
WorkStart = TLate; //设置工作开始时间
WorkEnd = TEarly; //设置工作结束时间
Late = true; //初始化退到判断
Absent = false; //初始化早退判断
//判断是否退到,可以踢除上班前两次打卡的错误
while(!DM->AQ_Atten->Eof&&TLate.operator >(DM->AQ_AttenAtten_Time->Value)){
Late = (DM->AQ_AttenAtten_In_Out->Value=="O"); //判断上班时间前是否报到,是的话Late为false
DM->AQ_Atten->Next(); //活动记录下条一条出勤记录
}
//判断是否旷工
if(Late){
if(TEarly.operator >(DM->AQ_AttenAtten_Time->Value))
WorkStart = DM->AQ_AttenAtten_Time->Value; //记录迟到时间
else
Absent = true; //判断为迟到后,如果下班前仍未报表视为旷工
}
//判断是否早退
Early = false; //初始化早退判断
while(!DM->AQ_Atten->Eof&&TEarly.operator >(DM->AQ_AttenAtten_Time->Value)){
Early = (DM->AQ_AttenAtten_In_Out->Value=="O"); //判断是否有早退
if(Early)
WorkEnd = DM->AQ_AttenAtten_Time->Value; //记录早退时间为工作结束时间
else
WorkEnd = TEarly; //正常下班时间记为工作结束时间
DM->AQ_Atten->Next(); //活动记录下条一条出勤记录
}
//如果有旷工,增加旷工次数
if(Absent)
DAbsent+=1;
//如果有迟到,增加迟到次数
if(Late)
DLate+=1;
//如果有早退,增加早退次数
if(Early)
DEarly+=1;
hour=0;min=0;sec=0;mse=0;
WorkEnd.operator -(WorkStart).DecodeTime(&hour,&min,&sec,&mse); //提到工作时间的小时,分钟
HWork+=hour*60+min; //累加实际工作时间,以分钟计算
}
}
else{ //没有找到在应到考勤日的出勤记录,作旷工处理
DAbsent+=2; //旷工计数器加2,一天算旷工两次
}
}
Start.operator +=(1); //计算日期后移一天
}
Start = DateTimePicker2->Date; //统计开始重新日期赋值
End = DateTimePicker3->Date; //统计结束重新日期赋值
//统计员工累计加班时间
QStr = "SELECT SUM(OTime_Time) AS TTime FROM WSalary_OTime WHERE OTime_PID="+IntToStr(Person_ID)+" AND "; //生成SQL语句
QStr.Insert("OTime_Date BETWEEN '"+DateToStr(Start)+"' AND '"+DateToStr(End)+"'",QStr.Length()+1);
RunQuery(DM->AQ_Back_Restore,QStr); //运行SQL语句得到累计加班总时间
try{
HOTime = DM->AQ_Back_Restore->Fields->Fields[0]->Value; //>AQ_OTimeOTime_Time->Value; //提取累计加班时间
}
catch(...){
HOTime = 0; //如果无加班记录则为0
}
//统计员工累计出差时间
QStr = "SELECT * FROM WSalary_Evection WHERE Evection_PID="+IntToStr(Person_ID)+" AND "; //生成SQL语句
QStr.Insert("Evection_TStart >= '"+DateToStr(Start)+" 00:00:00' AND Evection_TEnd <= '"+DateToStr(End)+" 23:59:59'",QStr.Length()+1);
RunQuery(DM->AQ_Evec,QStr); //运行SQL语句得到出差记录
try{
for(int i=0;i<DM->AQ_Evec->RecordCount;i++){
HEvect+=(DM->AQ_EvecEvection_Time->Value); //累加提取的出差间隔时间
}
}
catch(...){
HEvect=0; //没有出差记录,为0
}
//统计员工累计请假时间
QStr = "SELECT * FROM WSalary_Leave WHERE Leave_PID="+IntToStr(Person_ID)+" AND "; //生成SQL语句
QStr.Insert("Leave_DStart >= '"+DateToStr(Start)+" 00:00:00' AND Leave_DEnd <= '"+DateToStr(End)+" 23:59:59'",QStr.Length()+1);
RunQuery(DM->AQ_Leave,QStr); //运行SQL语句得到请假记录
try{
for(int i=0;i<DM->AQ_Leave->RecordCount;i++)
HLeave+=(DM->AQ_EvecEvection_Time->Value); //累加提取的请假间隔时间
}
catch(...){
HLeave=0; //没有请假记录,为0
}
//添加考勤统计记录
DM->AT_Count->Close(); //关闭记录编号数据表
DM->AT_Count->Filter = "Count_Name='Stat'"; //设置过滤器,提取考勤统计信息表计数值
DM->AT_Count->Filtered = true; //开启过滤器
DM->AT_Count->Open(); //打开记录编号计数表
Record = DM->AT_CountCount_Value->Value; //提取计数值
HWork=HWork/60; //工作时间转为小时计算
// DM->AQ_Stat->Close();
DM->AQ_Stat->Append(); //追加一条考勤统计记录
DM->AQ_StatStat_PID->Value = Person_ID; //员工工员赋值
DM->AQ_StatStat_YMonth->Value = ME_MStat->Text+"-01"; //统计月份赋值
DM->AQ_StatStat_HWork->Value = HWork; //累计工作时间赋值
DM->AQ_StatStat_HOvertime->Value = HOTime; //累计加班时间赋值
DM->AQ_StatStat_DLeave->Value = Ceil(HLeave/24); //累计请假时间赋值,以天为单位,向上取整
DM->AQ_StatStat_DEvection->Value = Ceil(HEvect/24); //累计出差时间赋值,以天为单位,向上取整
DM->AQ_StatStat_TLate->Value = DLate; //累计迟到次数赋值
DM->AQ_StatStat_TEarly->Value = DEarly; //累计早退次数赋值
DM->AQ_StatStat_TAbsent->Value = DAbsent; //累计旷工次数赋值
DM->AQ_StatStat_ID->Value = Record+1; //记录编辑赋值
DM->AQ_Stat->Post(); //提交追加操作数据集
return Record; //返加记录编号值
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -