请问如何对TClientDataSet里的数据进行递归循环?(100)

  • 主题发起人 主题发起人 shunbing
  • 开始时间 开始时间
S

shunbing

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个ClientDataSet1,内有三字段(NO,NAME,BELONGNAME),其中NAME和BELONGNAME字段有所属关系,即树形关系,最顶级的记录中字段BELONGSITE为空.现需要根据一个NAME值,递归找出其下属的所有记录,请问在一个数据集内如何实现,有什么好办法?目前我使用的是Filter以后递归,但速度不理想,还有需要说明一下,只能对这个数据集进行操作,而不能使用数据集查询的方式,因为数据量较大且执行较频繁.
 
1、用visual tree控件显示树2、数据量大的话不要一次完成,选择才读取子层
 
我弄的一个,把有递归关系的数据显示在树形结构中.思路是:遇到任何一个记录,就不停找父结点,找到就写出来,直到根结点显示出来.跟你的要求可能是相反的,写的有点乱,不知道你能看明白不.///////////////////////////////////////////////////////////////////////////////function TForm1.searchnode(Q: TADOQuery; list: TStringlist; tv1: Ttreeview): Ttreenode;var node: TTreenode; BM: TBookMark; PID: integer;begin result := nil; BM := Q.GetBookmark; PID := Q.fieldbyname('PID').AsInteger; Q.Locate('ID', Pid, []); //找到当前结点的父结点 //当前结点的父结点的父结点是根结点; if (Q.FieldByName('PID').AsInteger = 0) and (list.IndexOf(ExecQ.FieldByName('ID').AsString) = -1) then begin result := tv1.Items.AddObjectFirst(nil, Q.fieldbyname('姓名').AsString, Q.GetBookmark); list.AddObject(Q.fieldbyname('ID').AsString, result); end; if (list.IndexOf(Q.fieldbyname('PID').AsString) > -1) and (list.IndexOf(Q.FieldByName('ID').AsString) = -1) then begin //当前结点的父结点的父结点在里面,而当前结点的父结点不在里面的 ,就加入当前结点的父结点; showmessage('ok'); result := tv1.Items.AddChildObject(Ttreenode(list.Objects[list.IndexOf(Q.fieldbyname('PID').AsString)]), Q.fieldbyname('姓名').AsString, Q.GetBookmark); end; //当前结点的父结点的父结点不在列表里面,而它又是存在的; while (list.IndexOf(Q.fieldbyname('PID').AsString) = -1) and (Q.FieldByName('PID').AsInteger <> 0) do searchnode(ExecQ, list, tv1); list.AddObject(Q.fieldbyname('ID').AsString, result); //保存当前结点的ID Q.GotoBookmark(BM); //回到当前位置 //当前结点有父结点而且自己没被加进去 if (list.IndexOf(ExecQ.FieldByName('PID').AsString) > -1) and (list.IndexOf(ExecQ.FieldByName('ID').AsString) = -1) then begin node := tv1.Items.AddChildObject(Ttreenode(list.Objects[list.IndexOf(ExecQ.FieldByName('PID').AsString)]), ExecQ.fieldbyname('姓名').AsString, ExecQ.GetBookmark); list.AddObject(ExecQ.fieldbyname('ID').AsString, node); end;end;
 
后退
顶部