📄 readrecord.pas
字号:
finally
Animate1.Active:=False;
pbar1.visible:=false;
label1.visible:=false;
speedbutton1.enabled:=true;
speedbutton2.enabled:=false;
closefile(f);
closefile(logfile);
query1.close;
query1.sql.text:='Drop table tt';
query1.sql.add('Drop procedure readrecord');
query1.execsql;
end;
query2.close;
query2.sql.clear; //离职换卡人员打印的报表
query2.sql.add('update atd15010 set workno=a.workno,name=a.name,dept=a.dept from per24010 a where a.cardno=atd15010.cardno and a.leave=0 and '+
'a.indate<=atd15010.recdate ');
query2.sql.add('update atd15010 set workno=a.workno, name=a.name,dept=a.dept from per24010 a left join per_changecard b on a.workno=b.workno '+
'where atd15010.cardno=b.oldcard ');
query2.sql.add('update atd15010 set workno=a.workno, name=a.name,dept=a.dept from per16010 a left join per24010 b on a.workno=b.workno where a.cardno=atd15010.cardno and '+
'atd15010.recdate between b.indate and a.leavedate-1 ');
// query2.sql.add('update atd15010 set atd15010.workno=a.workno,name=a.name,dept=a.dept from per24010 a left join per15010 b on a.cardno=b.cardno where a.cardno=atd15010.cardno and b.agreedate>atd15010.recdate ');
query2.sql.savetofile('c:\readrecord.sql');
query2.ExecSQL;
query2.Close;
end; //with datamod
end;
procedure TFormreadrecord.onebyone;
label go;
var
StrL_ClockRec:TStringlist;
i,j,handle:integer;
Card_No,Rec_Date,Rec_Time,Mac_Id,State_Id,Rec_Year,Rec_StrDateTime,
Min_Date,Max_Date:String;
Rec_DateTime,p:string;//TDateTime;
test_datetime:TDatetime;
logfile,f:TextFile;
log,workno,cname,cdept:string;
x:boolean;
begin
Animate1.Active:=True;
pbar1.visible:=true;
label1.visible:=true;
label2.visible:=true;
speedbutton1.enabled:=false;
speedbutton2.enabled:=false;
log:=ExtractFilePath(Application.ExeName)+'log\readcarderr.log';
p:=extractfilepath(application.exename)+'log\readcard.log';
assignfile(f,p);
append(f);
if not fileexists(log) then
begin
handle:=filecreate(log);
if handle>0 then
Fileclose(Handle);
end;
assignfile(logfile,log);
append(logfile);
application.ProcessMessages;
for j:=listbox1.items.count-1 downto 0 do
begin //for listbox
if FileExists(listbox1.items[j]) then
begin//文件存在
try
writeln(f,'---------------------------------------------------------');
writeln(f,'开始读取文件'+listbox1.items[j]+'中的打卡数据:'+formatdatetime('yyyy/mm/dd hh:mm:ss',now));
StrL_ClockRec:=TStringlist.Create;
StrL_ClockRec.LoadFromFile(listbox1.items[j]);//读入字符串
Min_Date:=FormatDateTime('yyyy'+dateseparator+'mm'+dateseparator+'dd',Date);
Max_Date:=Min_Date;
with Datamod do
begin
Query1.Close;
adoclock.Close;
adoclock.CommandText:='select top 1 * from atd09010 where clockname='''+combobox1.text+''' and Yndefault=1 ';
adoclock.Open;
PBar1.Max:=StrL_ClockRec.Count;
PBar1.Position:=0;
PBar1.Step:=1;
For i:=0 to StrL_ClockRec.Count-1 do
begin
x:=false;
Label2.Caption:=IntToStr(i+1)+'/'+IntToStr(StrL_ClockRec.Count);
Label2.Update;
if length(StrL_ClockRec.Strings[i])=adoclockTextlength.AsInteger then
begin
Card_No:=Copy(StrL_ClockRec.Strings[i],adoclockCardB.AsInteger,adoclockCardE.AsInteger);
adoquery1.Close;
adoquery1.SQL.Text:='select workno,name,cardno,dept from per24010 where cardno='''+card_no+''' and leave=0';
adoquery1.Open;
workno:=adoquery1.fieldbyname('workno').asstring;
cname:=adoquery1.fieldbyname('name').asstring;
cdept:=adoquery1.fieldbyname('dept').asstring;
Label1.Caption:='正在读取 '+Card_No;
Label1.Update;
Rec_Year:=Copy(StrL_ClockRec.Strings[i],adoclockYearB.AsInteger,adoclockYearE.AsInteger);
if adoclockYearE.AsInteger =2 then
Rec_Year:=Copy(FormatDateTime('yyyy',date),1,2)+Rec_Year;
//日期
Rec_Date:=Rec_Year+dateseparator+Copy(StrL_ClockRec.Strings[i],adoclockMonthB.AsInteger,2)+dateseparator+
Copy(StrL_ClockRec.Strings[i],adoclockDayB.AsInteger,2);
//时间
Rec_Time:=Copy(StrL_ClockRec.Strings[i],adoclockTimeB.AsInteger,2)+':'+
Copy(StrL_ClockRec.Strings[i],adoclockTimeE.AsInteger,2);
Rec_StrDateTime:=Rec_Date+' '+Rec_Time;
//日期时间,日期型
Rec_DateTime:={StrToDateTime}(Rec_Date+' '+Rec_Time);
try
test_datetime:=strtodatetime(Rec_DateTime);
except
writeln(logfile,pchar(formatdatetime('yyyy'+dateseparator+'mm'+dateseparator+'dd hh:mm:ss',now)+'读卡时读到一个无效的时间值:'+rec_datetime));
x:=true;
end;
if x then goto go;
//比较大小
if Min_Date>Rec_Date then Min_Date := Rec_Date;
if Max_Date<Rec_Date then Max_Date := Rec_Date;
//机器号
Mac_Id:=Copy(StrL_ClockRec.Strings[i],adoclockMacB.AsInteger,adoclockMacE.AsInteger);
//状态号
State_Id:=Copy(StrL_ClockRec.Strings[i],adoclockStateB.AsInteger,adoclockstatee.asinteger);
try
Query1.SQL.text:='Insert into atd15010(macname,cardno,recdate,rectime,state,deldate,recdatetime,readok,name,dept,workno) '+
'values( '''+mac_id+''','''+card_no+''','''+Rec_Date+''','''+Rec_Time+''','''+State_Id+''','''','''+Rec_Datetime+''',0,'''+cname+''','''+cdept+''','''+workno+''') ';
Query1.ExecSQL;
except
writeln(logfile,pchar('发现重复打卡记录'''+card_no+'''的员工'));
end;
end else
writeln(logfile,pchar('读取打卡资料时发现实际文本行长度(长度为:'+inttostr(length(StrL_ClockRec.Strings[i]))+')与卡钟参数设定中的文本行长度(长度为:'+inttostr(adoclockTextlength.AsInteger)+'不一致.'));
go: PBar1.StepIt;
end;
// query2.close;
// query2.sql.clear; //离职换卡人员打印的报表
// query2.sql.add('update atd15010 set workno=a.workno,name=a.name,dept=a.dept from per24010 a where a.cardno=atd15010.cardno and a.leave=0 and '+
// 'a.indate<=atd15010.recdate ');
// query2.sql.add('update atd15010 set workno=a.workno, name=a.name,dept=a.dept from per24010 a left join per_changecard b on a.workno=b.workno '+
// 'where atd15010.cardno=b.oldcard ');
// query2.sql.add('update atd15010 set workno=a.workno, name=a.name,dept=a.dept from per16010 a left join per24010 b on a.workno=b.workno where a.cardno=atd15010.cardno and '+
// 'atd15010.recdate between b.indate and a.leavedate-1 ');
// query2.sql.add('update atd15010 set atd15010.workno=a.workno,name=a.name,dept=a.dept from per24010 a left join per15010 b on a.cardno=b.cardno where a.cardno=atd15010.cardno and b.agreedate>atd15010.recdate ');
// query2.sql.savetofile('c:\readrecord.sql');
// query2.ExecSQL;
// query2.Close;
end;
finally
StrL_ClockRec.free;
end;
label1.Caption:='正在整理刷卡记录...';
label1.Update;
writeln(f,'从文件'+listbox1.items[j]+'中共读取了'+inttostr(pbar1.max)+'笔刷卡数据!');
writeln(f,'结束读取文件'+listbox1.items[j]+'中的打卡数据:'+formatdatetime('yyyy/mm/dd hh:mm:ss',now));
writeln(f,'---------------------------------------------------------');
end else //if fileexist
Application.MessageBox(pchar('文件'+listbox1.items[j]+'不存在,请重新选择!'),'文件不存在',mb_iconstop+mb_ok);
listbox1.Items.Delete(j);
listbox1.update;
end; //for listbox
Animate1.Active:=False;
pbar1.visible:=false;
label1.visible:=false;
label2.visible:=false;
closefile(logfile);
closefile(f);
speedbutton1.enabled:=true;
speedbutton2.enabled:=true;
end;
procedure TFormreadrecord.N1Click(Sender: TObject);
var i:integer;
list:TStringList;
begin
if listbox1.SelCount>0 then
begin
list:=TStringList.Create;
for i:=0 to listbox1.items.count-1 do
list.add(listbox1.items[i]);
for i:=0 to listbox1.items.count-1 do
if listbox1.Selected[i] then
list.delete(i);
listbox1.items.clear;
for i:=0 to list.Count-1 do
listbox1.Items.Add(list.Strings[i]);
end else application.messagebox('你没有选择要删除的项目','齐协提示',mb_ok+mb_iconinformation);
if listbox1.items.count>0 then
speedbutton2.enabled:=true
else speedbutton2.enabled:=false;
end;
procedure TFormreadrecord.N2Click(Sender: TObject);
begin
listbox1.Items.Clear;
if listbox1.items.count>0 then speedbutton2.enabled:=true
else speedbutton2.enabled:=false;
end;
procedure TFormreadrecord.SpeedButton2Click(Sender: TObject);
begin
if radiobutton1.Checked then onebyone
else if radiobutton2.checked then batchread;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -