以前这样的嵌套算法用过很多次,这次却怎么也搞不懂问题出在了那里,唯一和以前不同的时,以前两个嵌套循环是在两个不同的表中,这次是在同一个表中循环,难道是第二次循环就把循环的记录指针定位在了最后一行,之后再返回第一循环时不再按以前的循环顺序依次Next下去(第二次的循环对于第一次记录指针也起作用),所以第一次循环无效了。那如果是这样的话应当是怎样的解决,算法是怎样。
procedure TCCSmainfrm.TreeView1DblClick(Sender: TObject);
var
  olg:Toutlookgroup;
  Sl:Tstrings;
  prostr:string;   //设置了一个查询和对比判断时要用到字符的参数
begin
 case treeview1.Selected.AbsoluteIndex of   //这里取treeview选择的项  1:begin
     prostr:='';     
     with datamodule1.ADOStock do  //这里主要作用是一、取的查询字符,并在这个表中循环取这个查询字符
     begin
     close;
     sql.Clear;
     sql.Add('select * from stocklist');
     open;
     while not eof do           //这里开始循环取查询字符,
     begin
      if fieldbyname('name').asstring<>prostr then  //当这个取的查询的字符不相等时,开始取值显示在
                                                              advoutlooklist1表中
      begin
          prostr:=fieldbyname('name').AsString;
          Olg:=advoutlooklist1.AddGroup(prostr);
     
       with datamodule1.ADOStock do
       begin
         close;
         sql.Clear;
         sql.Add('select * from stocklist where name='+quotedstr(prostr));
         open;
         while not eof do   //这是第二个循环,将查询到的数据显示在advoutlooklist1上
         begin
           Sl:=advoutlooklist1.AddItem(olg);  //在上面群组名下面开始逐项添加ITEM
           sl.Add('');
           sl.Add(fieldbyname('adress').AsString);
           sl.Add(fieldbyname('Floor').AsString);
           sl.Add(fieldbyname('overtime').AsString);
           sl.Add(fieldbyname('amount').AsString);
           sl.Add(fieldbyname('outamount').AsString);
           sl.Add(fieldbyname('proID').AsString);
         next;  //第二个循环完成        end;   //添加ITEM项while结束       end;  //查找的With结束
     end;
      next;    //这里返到第一个循环出问题了,返不回了,到这里就结束,不再循环了,不解啊要,不知那里有问题了
      end;    //添加群组号判断While 结束
     end; //With结束    end;

解决方案 »

  1.   

    把第二个循环中with datamodule1.ADOStock do的ado控件换一个,不要跟第一个循环使用同一个试试
      

  2.   

    你在循环中用了同一个数据集ADOStock ,第二个循环此数据集的sql语句发生变换,此时其中的记录已经不是第一次循环时的记录了,所以这个过程肯定有问题
    用两个数据分部用在不同的循环中
      

  3.   

    两次循环使用了相同的datamodule1.ADOStock来进行控制,当第二层循环时,第一层就失效了,换一个adoquery
      

  4.   

    用同一个QUERY去再次循环能不出问题吗?
    换一个
      

  5.   

    方法:
       事先将name存入TStringList,遍历TStringList进行操作。