求一个算法
需求:类似客户抽奖,每到一个固定数(N)后取最后一个,比如每5个取1个。1,2,3,4,5取1;6,7,8,9,10取2,。。。。。
实现:
procedure TOutForm.ISok;
var TmpQuery:TADOQuery;
begin
TmpQuery:= TADOQuery.Create(nil);
TmpQuery.Connection:= DataM.ADOCon;
with TmpQuery do
begin
close;
sql.Clear;
sql.Add('select count(*) from CusTable');
try
open;
//SumData为因子,满SumData数后执行
if (fields[0].AsInteger mod SumData=0) then ChangeIsoK
except
exit
end;
end;
end;
procedure TOutForm.ChangeIsoK;
var TmpQuery1,TmpQuery2:TADOQuery;
cusTmp:integer;
xm,dh,kh,qh,rq:string;
begin
TmpQuery1:= TADOQuery.Create(nil);
TmpQuery1.Connection:= DataM.ADOCon;
cusTmp:=0; xm:='';dh:='';kh:='';qh:='';rq:='';
with TmpQuery1 do
begin
close;
sql.Clear;
//取IsOk为0的最后一条弹出
sql.Add('select TOP 1 Cusid,CusName,Phone,CarId,JunNo,SysDate from CusTable where IsOk=0 order by Cusid asc');
try
open;
cusTmp:=fields[0].AsInteger;
xm:= fields[1].AsString;
dh:= fields[2].AsString;
kh:= fields[3].AsString;
qh:= fields[4].AsString;
rq:= fields[5].AsString;
TmpQuery2:= TADOQuery.Create(nil);
TmpQuery2.Connection:= DataM.ADOCon;
with TmpQuery2 do
begin
close;
sql.Clear;
//把弹出的记录isok=1
sql.Add('update CusTable set isok=1,GetDate='''+datetostr(now())+''' where Cusid='+inttostr(cusTmp)+'');
try
ExecSQL;
LuckForm:=TLuckForm.Create(nil);
LuckForm.Label8.Caption:=inttostr(cusTmp); LuckForm.Label9.Caption:=xm; LuckForm.Label10.Caption:=dh;
LuckForm.Label11.Caption:=kh; LuckForm.Label12.Caption:=qh; LuckForm.Label13.Caption:=rq;
LuckForm.ShowModal;
//刷新数据
ALLFalshDate;
except
free
end;
end;
except
exit
end;
end;
//添加数据成功后调用ISok。
问题:没有删除的情况下正常,一旦有删除数据后程序执行异常,比如到6条记录时删除一条,添加第七条记录后就跳出2了。