⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wsalary_work.~cpp

📁 考勤工资管理系统
💻 ~CPP
📖 第 1 页 / 共 2 页
字号:
    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 + -