📄 u_stat.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 + -