需求:类似客户抽奖,每到一个固定数(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了。

解决方案 »

  1.   

    你的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
      

  2.   

    跟踪一下,看看 if (fields[0].AsInteger mod SumData=0) then ChangeIsoK
    的 fields[0].AsInteger 数值是否符合要求。
      

  3.   

    刚才忙着下班,少写了半句
    解决方法是'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
      

  4.   

    分数分配错误,郁闷,funxu
    我另外开贴给你200分
      

  5.   

    我来解释,LZ的意思是
    表中有N条数据,给你一个或者多个骰子扔,点数记为t,N mod t=0时,就表示抽中了
    则在N条记录中,先升序排序取第1条记录,然后标记isok=1表示抽中了不过楼主的设计似乎不合理
    1.抽奖当中是不可能出现有数据录入或者删除的,isok=0的数据小于一定数量时再增加数据(奖券)
    2.增加或者删除当中是不能进行抽奖
    3.N应该要过滤掉已经抽中的记录(即isok=1)
    4.判断中奖条件多些花样,如果是这边抽奖那边添加数据,就不要用这个取记录数做条件啦不过不清楚LZ须求,以上纯属个人理解...
      

  6.   

    funxu
     
    虽然没解决,但从你的方法得到了启示。谢谢了
    请到
    http://topic.csdn.net/u/20111214/23/ed36d96c-c74d-4fd7-b902-ecec80248439.html?25476
    接分