求一个算法

thisisxutao 2011-12-14 03:42:50
需求:类似客户抽奖,每到一个固定数(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了。
...全文
124 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
thisisxutao 2011-12-14
  • 打赏
  • 举报
回复
funxu

虽然没解决,但从你的方法得到了启示。谢谢了
请到
http://topic.csdn.net/u/20111214/23/ed36d96c-c74d-4fd7-b902-ecec80248439.html?25476
接分
kaikai_kk 2011-12-14
  • 打赏
  • 举报
回复
我来解释,LZ的意思是
表中有N条数据,给你一个或者多个骰子扔,点数记为t,N mod t=0时,就表示抽中了
则在N条记录中,先升序排序取第1条记录,然后标记isok=1表示抽中了

不过楼主的设计似乎不合理
1.抽奖当中是不可能出现有数据录入或者删除的,isok=0的数据小于一定数量时再增加数据(奖券)
2.增加或者删除当中是不能进行抽奖
3.N应该要过滤掉已经抽中的记录(即isok=1)
4.判断中奖条件多些花样,如果是这边抽奖那边添加数据,就不要用这个取记录数做条件啦

不过不清楚LZ须求,以上纯属个人理解...
thisisxutao 2011-12-14
  • 打赏
  • 举报
回复
分数分配错误,郁闷,funxu
我另外开贴给你200分
try__again 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sz_haitao 的回复:]

没看懂:类似客户抽奖,每到一个固定数(N)后取最后一个,比如每5个取1个。1,2,3,4,5取1;6,7,8,9,10取2,。。。。。
[/Quote]
我也表示没看懂,人老了,唉
haitao 2011-12-14
  • 打赏
  • 举报
回复
没看懂:类似客户抽奖,每到一个固定数(N)后取最后一个,比如每5个取1个。1,2,3,4,5取1;6,7,8,9,10取2,。。。。。
funxu 2011-12-14
  • 打赏
  • 举报
回复
刚才忙着下班,少写了半句
解决方法是'select count(*) from CusTable' 加上条件 where iosk=0
更新的时候不仅把 sql.Add('update CusTable set isok=1,GetDate='''+datetostr(now())+''' where Cusid='+inttostr(cusTmp)+'');
而且把其他 Cusid=0的值也替换掉,比如-1
update CusTable set isok=-1
kaikai_kk 2011-12-14
  • 打赏
  • 举报
回复
把IsOk=0的过滤掉
chhrsas 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thisisxutao 的回复:]

没人来接分?准备结了
[/Quote]
看来是解决了嘛。
npkaida 2011-12-14
  • 打赏
  • 举报
回复
跟踪一下,看看 if (fields[0].AsInteger mod SumData=0) then ChangeIsoK
的 fields[0].AsInteger 数值是否符合要求。
funxu 2011-12-14
  • 打赏
  • 举报
回复
你的SumData是多少?
以5为例
1,2,3,4,5 mod 5=1,2,3,4,0
5条时会计算一次
6,7,8,9,10 mod 5=1,2,3,4,0
10条时会计算2次
但是有个bug

插入第六条数据时删除一条数据5此时计数为5又会运算一次,而且因为插入的数据6iosk=0,所以计算成功,数据+1
解决方法是'select count(*) from CusTable' 加上条件 where iosk=0
thisisxutao 2011-12-14
  • 打赏
  • 举报
回复
没人来接分?准备结了

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧