如何设置动态时段? ( 积分: 50 )

  • 主题发起人 主题发起人 nhlong320
  • 开始时间 开始时间
N

nhlong320

Unregistered / Unconfirmed
GUEST, unregistred user!
小生遇一设置动态时段问题,百思不得其解,请各位大侠帮帮小生,谢谢!
程序如下:
adoquery4.Close;
adoquery4.SQL.Clear;
adoquery4.SQL.Add('select * from KQFZSZB');
adoquery4.Open;
sumTim:=adoquery4.RecordCount;//读入时段个数;
Setlength(timbegin,50);//开始时间存放数组;
Setlength(timend,50);//结束时间存放数组;
Setlength(timsave,50);//开始时间和结束时间比较存放数组;
for j:=1 to sumTim do
begin
timbegin[j]:=adoquery4.FieldByName('KQKSSJ').AsString;//开始时间
timend[j]:=adoquery4.FieldByName('KQJSSJ').AsString;//结束时间
varbegin:=timbegin[j];
varend:=timend[j];
st:=strtotime(rus);
t1:=strtotime(varbegin);
t2:=strtotime(varend);
res1:= CompareTime(t2,t1);
if res1=1 then
begin
timsave[j]:=inttostr(res1);//存放在数组中
end;
adoquery4.Next;
end;
可是这样做会让读卡时间在每个时段中都比较一次,请问大侠如何能让读卡时间先判断后直接存入数组timsave[]
 
小生遇一设置动态时段问题,百思不得其解,请各位大侠帮帮小生,谢谢!
程序如下:
adoquery4.Close;
adoquery4.SQL.Clear;
adoquery4.SQL.Add('select * from KQFZSZB');
adoquery4.Open;
sumTim:=adoquery4.RecordCount;//读入时段个数;
Setlength(timbegin,50);//开始时间存放数组;
Setlength(timend,50);//结束时间存放数组;
Setlength(timsave,50);//开始时间和结束时间比较存放数组;
for j:=1 to sumTim do
begin
timbegin[j]:=adoquery4.FieldByName('KQKSSJ').AsString;//开始时间
timend[j]:=adoquery4.FieldByName('KQJSSJ').AsString;//结束时间
varbegin:=timbegin[j];
varend:=timend[j];
st:=strtotime(rus);
t1:=strtotime(varbegin);
t2:=strtotime(varend);
res1:= CompareTime(t2,t1);
if res1=1 then
begin
timsave[j]:=inttostr(res1);//存放在数组中
end;
adoquery4.Next;
end;
可是这样做会让读卡时间在每个时段中都比较一次,请问大侠如何能让读卡时间先判断后直接存入数组timsave[]
 
sumTim:=adoquery4.RecordCount;//读入时段个数;
Setlength(timbegin,sumTim);//开始时间存放数组;
Setlength(timend,sumTim);//结束时间存放数组;
Setlength(timsave,sumTim);//开始时间和结束时间比较存放数组;
for j:=0 to sumTim-1 do//动态数组都是从0开始;

********
如何能让读卡时间先判断后直接存入数组timsave[]:
如果只要存t2>t1的 用变量代替就可了:
i:=0;
adoquery4.first;
// for j:=0 to sumTim-1 do//动态数组都是从0开始;
while not adoquery4.eof do
begin
...
t1:=adoquery4.FieldByName('KQKSSJ').AsDatetime;
t2:=adoquery4.FieldByName('KQJSSJ').AsDatetime;
res1:= CompareTime(t2,t1);
if res1=1 then
begin
inc(i);
setlength(timbegin,i);
setlength(TimeEnd,i);
setlength(Timesave,i);
timeBegin[i-1]:=FormatDateTime('YYYYMMDD',T1);
timeEnd[i-1]:=FormatDateTime('YYYYMMDD',T2);
timesave[i-1]:='1';//inttostr(res1);//存放在数组中
end;
adoquery4.Next;
end;
 
大侠我怎么没看懂,程序是怎么先进行比较的???谢谢
 
不太明白你的要求:
你原来的程序:
1:记录数不能超过49!
否则3个数组都越界;
2。如果规定1。。50足够,何不用定长数组,
如用动态不如用记录:
TTimeRec=record
Serial:byte;//记录号;
TimeBegin:array of string[8];
TimeEnd:array of string[8];
TimeSave:array of Byte;
end;
3.不是用了T2与T1的比较,就是读的时间要不同;
T2>T1才存TimeSave,按你原来的,不存的话IF不存立,TIMESAVE的值未定(或初始化);
我只是改成三个数组只保存T2>T1的值
*******************
没看明白?如果有40条记录,其中20条T1和T2相同,另20条T2>T1;
则你的结果是,三个数组都有1。。40记录,只是TimeSAVE有20个为'1';
其他20条是什么不定(没初始化);
而我的三个数组只有20条记录;0。。19,至于TIMESAVE全为‘1’已没有存在的意义了
 
大侠,我这会用来两种方案可是都不行:
1。是将每个时段都用comparetime判断比较,然后存入数据库;可是这种方法存入数据库的都是1,0,-1 对我现时读到的时间没法判断是哪个时段。
2。将系统时间和时段时间做比较,看comparetime大小;可是这种方法对每个时段时间都要做一次判断,显然是错了。
大哥怎么办?帮帮小弟,谢谢!
 
主要是你的目的没说明确;

KQKSSJ为开始时间,KQJSSJ为读卡结束时间,
你要保存或取什么东东?
两个时间相同或相差不到1秒对你有何影响?

***************
你的意思是不是一天24小时分成N个时段;T1,T2。。。Tn;
这个函数的目的是是在读卡/写卡时数据表中不要求存时间;
只要存时段数I?
或者你已存了时间,现在要按时段中外存和汇总;
总之,你要说清你的目的和想法
 
with ADOQ do
begin
SQL.ADD(select datediff(millisecond,KQKSSJ,KQJSSJ) as time from tablename);
Open;
Exesql;
end;
if ADOQ.FieldByName('time').AsString:=0 then
showmessage('相同')
else showmessage('不同');
 
假设我有三个时段07:00:00--08:00:00; 09:00:00--12:00:00;
12:00:00--17:00:00我这会刷卡则在第三个时段里,则KQKSSKJ为12:00:00
KQJSSJ为17:00:00,我的刷卡时间就要落在这第三个时段,可我用上面两种方法都不行
求大侠求我,我谢谢您了!!大侠
 
你说的是系统时间(刷卡时间)与设定时间比较;
你只能这样比:(从0/7/8..直到比它小就是它的前一级了)
7:00
8:00
9:00
12:00
17:00
不能有真空!比如8:00-9:00怎么办,17-23点,0-7点,必须是个闭环;
而且不能交叉;
只能比一个时间,

你说的是考勤系统吧,
打卡是上班还是下班有点复杂,排班问题做过考勤的都会
 
我懂,我也做了一个分成三个时段静态的,可是公司要可以随意添加,修改动态的。我实在
想破脑壳了,大侠就给我点思路也可以,就是不要用我上面那两种:
1。是将每个时段都用comparetime判断比较,然后存入数据库;可是这种方法存入数据库的都是1,0,-1 对我现时读到的时间没法判断是哪个时段。
2。将系统时间和时段时间做比较,看comparetime大小;可是这种方法对每个时段时间都要做一次判断,显然是错了。
我试过了不成的,谢谢!大侠
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部