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

📄 u_stat.pas

📁 考勤管理系统 数据库系列
💻 PAS
字号:
unit u_stat;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGrids, StdCtrls, Gauges, Mask, Inifiles;

type
  TF_stat = class(TForm)
    GroupBox1: TGroupBox;
    Label3: TLabel;
    i_time: TMaskEdit;
    Label4: TLabel;
    i_start_time: TMaskEdit;
    Label5: TLabel;
    i_end_time: TMaskEdit;
    B_stat: TButton;
    Gauge1: TGauge;
    GroupBox9: TGroupBox;
    Label42: TLabel;
    Seek_person_id: TMaskEdit;
    Seek_by_person: TCheckBox;
    Seek_by_time: TCheckBox;
    Seek_person_name: TEdit;
    Seek_time: TMaskEdit;
    DBGrid1: TDBGrid;
    B_seek: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Seek_person_idChange(Sender: TObject);
    procedure B_seekClick(Sender: TObject);
    procedure B_statClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_stat: TF_stat;

implementation

uses u_datamodule;

{$R *.DFM}

procedure TF_stat.FormCreate(Sender: TObject);
begin
  i_start_time.Text:=DateToStr(now-30);
  i_end_time.Text:=DateToStr(now);
  i_time.Text:=FormatDateTime('yyyy-mm',now);
  Seek_time.Text:=i_time.Text;
  DM_main.T_stat.Open;
end;

procedure TF_stat.Seek_person_idChange(Sender: TObject);
begin
  with DM_main do
  begin
    T_person.Filter:='ID='''+Seek_person_id.Text+'''';
    T_person.Filtered:=True;
    T_person.Open;
    if T_person.RecordCount=1 then
      Seek_person_name.Text:=T_person['NAME']
    else
      Seek_person_name.Text:='';
    T_person.Close;
  end;
end;

procedure TF_stat.B_seekClick(Sender: TObject);
var
  FilterStr:String;
begin
  With DM_main.T_stat do
  begin
    Close;
    FilterStr:='';
    if Seek_by_person.Checked then
      FilterStr:='PERSON='''+Seek_person_id.Text+'''';
    if Seek_by_time.Checked then
    begin
      if length(FilterStr)>0 then
        FilterStr:=FilterStr+' AND ';
      FilterStr:=FilterStr+'YEAR_MONTH='+Seek_time.Text;
    end;
    if length(FilterStr)>0 then
    begin
      Filter:=FilterStr;
      Filtered:=True;
    end
    else
      Filtered:=False;
    Open;
  end;
end;

procedure TF_stat.B_statClick(Sender: TObject);
var
  MyInifile:Tinifile;
  Person_id:String;
  i,j,n,counter:integer;
  Time:Array [0..3] of TDateTime;
  Hour:Array [0..1] of Integer;
  StartTime,EndTime:TDate;
  TimeStamp,Late_Time,Early_Time,Work_start,Work_end:TDateTime;
  Late,Early,Absent,Leave,Errand:Boolean;
  WorkHour,OverHour,LeaveHDay,ErrandHDay:Integer;
  LateTimes,EarlyTimes,AbsentTimes:SmallInt;
  Temp:String;
begin
  MyInifile:=Tinifile.Create(ExtractFilePath(Paramstr(0))+'workplan.ini');
  Time[0]:=StrToTime(MyInifile.ReadString('WorkPlan','Time1','9:00:00'));
  Time[1]:=StrToTime(MyInifile.ReadString('WorkPlan','Time2','12:00:00'));
  Time[2]:=StrToTime(MyInifile.ReadString('WorkPlan','Time3','13:00:00'));
  Time[3]:=StrToTime(MyInifile.ReadString('WorkPlan','Time4','18:00:00'));
  Hour[0]:=Round((Time[1]-Time[0])*24);
  Hour[1]:=Round((Time[3]-Time[2])*24);
  StartTime:=StrToDate(i_start_time.Text);
  EndTime:=StrToDate(i_end_time.Text);
  with DM_main do
  begin
    //提取员工列表
    T_person.Filter:='STATE=''T''';
    T_person.Filtered:=True;
    T_person.Open;
    n:=T_person.RecordCount;
    i:=0;
    Gauge1.Progress:=0;
    T_person.First;
    while not T_person.Eof do
    begin
      //获取出勤记录
      Person_id:=T_person['ID'];
      Q_attend.Close;
      Q_attend.Params.ParamValues['PERSON']:=Person_id;
      Q_attend.Params.ParamValues['STARTTIME']:=StartTime;
      Q_attend.Params.ParamValues['ENDTIME']:=EndTime+1;
      Q_attend.Open;
      Q_attend.First;
      //初始化
      WorkHour:=0;
      OverHour:=0;
      LeaveHDay:=0;
      ErrandHDay:=0;
      LateTimes:=0;
      EarlyTimes:=0;
      AbsentTimes:=0;
      TimeStamp:=StartTime;
      while TimeStamp<EndTime+0.1 do
      begin
       if (DayOfWeek(TimeStamp)<>1) and (DayOfWeek(TimeStamp)<>7) then
       begin
        for j:=0 to 1 do //遍历班次
        begin
          Late_Time:=TimeStamp+Time[2*j];
          Early_Time:=TimeStamp+Time[2*j+1];
          //判断是否请假
          Q_leave.Close;
          Q_leave.Params.ParamValues['PERSON']:=Person_id;
          Q_leave.Params.ParamValues['STARTTIME']:=Late_Time;
          Q_leave.Params.ParamValues['ENDTIME']:=Early_Time;
          Q_leave.Open;
          Leave:=(Q_leave.RecordCount>0);
          //判断是否出差
          Q_errand.Close;
          Q_errand.Params.ParamValues['PERSON']:=Person_id;
          Q_errand.Params.ParamValues['STARTTIME']:=Late_Time;
          Q_errand.Params.ParamValues['ENDTIME']:=Early_Time;
          Q_errand.Open;
          errand:=(Q_leave.RecordCount>0);
          if leave then  //请假
            Inc(LeaveHDay)
          else if errand then   //出差
          begin
            Inc(ErrandHDay);
            WorkHour:=WorkHour+Hour[j];
          end
          else        //正常上班
          begin
            Work_start:=Late_Time;
            Work_end:=Early_Time;
            Late:=True;
            Absent:=False;
            //判断是否迟到
            while (not Q_attend.Eof) and (Q_attend['IO_TIME']<=Late_Time) do
            begin
              Late:=(Q_attend['IN_OUT']='O');
              Q_attend.Next;
            end;
            //判断是否旷工
            if Late then
            begin
              if (not Q_attend.Eof) and (Q_attend['IO_TIME']<Early_Time) then
                Work_start:=Q_attend['IO_TIME']  //记录迟到时间
              else
                Absent:=True;
            end;
            Early:=False;
            //判断是否早退
            while (not Q_attend.Eof) and (Q_attend['IO_TIME']<Early_Time) do
            begin
              Early:=(Q_attend['IN_OUT']='O');
              if Early then
                Work_end:=Q_attend['IO_TIME']
              else
                Work_end:=Early_Time;
              Q_attend.Next;
            end;
            if Absent then
              Inc(AbsentTimes)
            else
            begin
              if Late then
                Inc(LateTimes);
              if Early then
                Inc(EarlyTimes);
              WorkHour:=WorkHour+Round((Work_end-Work_start)*24); //计算实际工作时间
            end;
          end;//一个班次判断结束
        end; //下一班次
       end; //是否休息日
       TimeStamp:=TimeStamp+1;//推进一天
      end; //后一天考勤
      //统计加班时间
      Q_overtime.Close;
      Q_overtime.Params.ParamValues['PERSON']:=Person_id;
      Q_overtime.Params.ParamValues['STARTTIME']:=StartTime;
      Q_overtime.Params.ParamValues['ENDTIME']:=EndTime;
      Q_overtime.Open;
      try
        OverHour:=Q_overtime['SUM'];
      except
        OverHour:=0;
      end;
      //增加/修改考勤记录
      T_stat.Close;
      T_stat.Filter:='PERSON='''+Person_id+''' AND YEAR_MONTH='''+i_time.Text+'''';
      T_stat.Filtered:=True;
      T_stat.Open;
      if T_stat.RecordCount=0 then
      begin
        //获取计数
        T_counter.Filter:='ID=''S''';
        T_counter.Filtered:=True;
        T_counter.Open;
        counter:=T_counter['COUNTER_VALUE'];
        Inc(counter);
        T_counter.Edit;
        T_counter['COUNTER_VALUE']:=counter;
        T_counter.Post;
        T_counter.Close;
        T_stat.AppendRecord([counter,i_time.Text,Person_id,WorkHour,OverHour,LeaveHDay,ErrandHDay,LateTimes,EarlyTimes,AbsentTimes]);
      end
      else
      begin
        T_stat.Edit;
        T_stat['WORK_HOUR']:=WorkHour;
        T_stat['OVER_HOUR']:=OverHour;
        T_stat['LEAVE_HDAY']:=LeaveHDay;
        T_stat['ERRAND_HDAY']:=ErrandHDay;
        T_stat['LATE_TIMES']:=LateTimes;
        T_stat['EARLY_TIMES']:=EarlyTimes;
        T_stat['ABSENT_TIMES']:=AbsentTimes;
        T_stat.Post;
      end;
      Inc(i);
      Gauge1.Progress:=(100*i) div n;
      T_person.Next;
    end;  //下一个员工考勤
  end; //with
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -