请指教怎样改善? |
尚未結案
|
liangzai
初階會員 ![]() ![]() 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
我现在从存放上下班的TXT文档中(比如说文件名20051101,20051102。。。。。。通常选择多个文本,里面的数据是这样的形式:
000460670003685020051117080000P10(上班)
000460970003685020051117170000P20(下班)。。。)
提取最早上班和最晚下班的时间,我使用现在这种方式,需要很长的时间读取数据到数据库中,请教一下怎样改善,谢谢! var fname,instring:string; /将txt文档数据读至table1
infile:Textfile;
I,J,K:integer;
sDataStringList:TStringList;
sEmpNo,sDate:string; begin //..........1.........
dm.Table1.Active:=false;
dm.Table1.EmptyTable;
dm.Table1.ReadOnly:=false;
dm.Table1.Active:=true;
if(opendialog1.Execute) and (copy(opendialog1.FileName,2,2)=':\') then
begin //...........2..........
sDataStringList:=TStringList.Create;
try
for I:=1 to opendialog1.Files.Count do
begin //..........3..........
J:=I;
if J=opendialog1.Files.Count then J:=0;
fname:=opendialog1.Files.Strings[J];
assignfile(infile,fname);
reset(infile);
while not Eof(infile) do
begin //........4.........
readln(infile,instring); with gtemp1 do
begin
if copy(instring,1,4)='0000' then gtemp1.employee_no:=copy(instring,5,4)
else
gtemp1.employee_no:=copy(instring,4,5);
gtemp1.g_date:=copy(instring,17,8);
gtemp1.g_time:=copy(instring,25,2) copy(instring,27,2);
gtemp1.text:=copy(instring,31,3);
end;
if gtemp1.text='P10' then
begin
if not dm.Table1.Locate('Employee_no;G_date;Text',vararrayof([gtemp1.employee_no,gtemp1.g_date,gtemp1.text]),[]) then
begin
with dm.Query1 do
begin
close;
sql.Clear;
sql.Text:='insert into ":hr:gsw1.db" (Employee_No,G_date,G_time,Text)';
sql.Append('values("' gtemp1.employee_no '","' gtemp1.g_date '","' gtemp1.g_time '","' gtemp1.text '")');
prepare;
execsql;
end;
end;
end;
if gtemp1.text='P20' then
sDataStringList.Add(instring);
end; //........4........
closefile(infile); if (sDataStringList.Count>0) then
begin
sDataStringList.Sort;
sEmpNo := LeftStr(sDataStringList[sDataStringList.Count-1],8);
sDate:= LeftStr(sDataStringList[sDataStringList.Count-1],24);
for K:=sDataStringList.Count-2 downto 0 do
begin
if (sEmpNo=LeftStr(sDataStringList[K],8)) and (sDate=LeftStr(sDataStringList[K],24)) then
sDataStringList.Delete(K)
else
begin
sEmpNo := LeftStr(sDataStringList[K],8);
sDate:= LeftStr(sDataStringList[K],24);
end;
end;
end;
for K:=0 to sDataStringList.Count-1 do
begin
with gtemp1 do
begin
if copy(sDataStringList[K],1,4)='0000' then
gtemp1.employee_no:=copy(sDataStringList[K],5,4)
else
gtemp1.employee_no:=copy(sDataStringList[K],4,5);
gtemp1.g_date:=copy(sDataStringList[K],17,8);
gtemp1.g_time:=copy(sDataStringList[K],25,2) copy(sDataStringList[K],27,2);
gtemp1.text:=copy(sDataStringList[K],31,3);
end;
with dm.Query1 do
begin
close;
sql.Clear;
sql.Text:='insert into ":hr:gsw1.db" (Employee_No,G_date,G_time,Text)';
sql.Append('values("' gtemp1.employee_no '","' gtemp1.g_date '","' gtemp1.g_time '","' gtemp1.text '")');
prepare;
execsql;
end;
end; end; //........3........
finally
sDataStringList.Free;
end; end; //.........2......... //将txt文档数据读至table1
|
liangzai
初階會員 ![]() ![]() 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
|
liangzai
初階會員 ![]() ![]() 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
怎么没有哪位前辈能够指教一下?我现在这样做,如果将一个月30天的所有打卡记录导入到数据库时,会需要近一个小时的时间,效率很低,CPU只能一直在做这件事。
请指教一个提取最早上班和最晚下班记录到数据库的好方法,急,谢谢!
00046067(工号)00036850(卡号)20051117(日期)080000(时间)P10(表示上班)
00046097(工号)00036850(卡号)20051117(日期)170000(时间)P20(表示下班) 如果能够在这段代码上改善,要怎么做?那位大哥抽空看一下,非常感谢!
|
liangzai
初階會員 ![]() ![]() 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
|
kgt
高階會員 ![]() ![]() ![]() ![]() 發表:17 回覆:308 積分:165 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |