gpt4 book ai didi

delphi - 获取分层数据集中子记录的递归过程

转载 作者:行者123 更新时间:2023-12-03 19:38:14 25 4
gpt4 key购买 nike

我有一个数据表(MDTasks),它的记录以 TreeView 表示。每条记录都有一个唯一的字段“ID”和一个字段“Parent_ID”,它指的是父级的 ID。我正在尝试列出具有给定 ID 的记录的任何级别的所有子项。我有以下内容,它可以在每个级别获得第一个 child ,但不会回过头来获得任何级别的 sibling 。如果有任何帮助,我将不胜感激。谢谢你。

procedure TfmList.GetChildren(TaskID: integer);
var
iChildID: integer;
begin
with MDTasks do
begin
first;
while not EOF do
begin
if FieldByName('Parent_ID').AsInteger = TaskID then
begin
iChildID := FieldByName('ID').AsInteger;
Memo1.Lines.Add(IntToStr(iChildID));
GetChildren(iChildID);
end;
next;
end;
end;
end;

最佳答案

如果我理解正确,下面的代码应该做你想做的事。它使用 ClientDataSet 以便我的答案是自包含的,因此可以轻松设置测试数据。

它使用对 CloneCursor 的调用。对指定父节点 ID 的子节点进行递归搜索。

procedure TForm1.FormCreate(Sender: TObject);
begin
CDS1.CreateDataSet;
CDS1.InsertRecord([1, -1]);
CDS1.InsertRecord([2, -1]);
CDS1.InsertRecord([3, -1]);
CDS1.InsertRecord([4, 2]); // This and the following rows are all children of ID = 2
CDS1.InsertRecord([5, 2]);
CDS1.InsertRecord([6, 4]);
CDS1.InsertRecord([7, 4]);
CDS1.InsertRecord([8, 7]);

FindChildren(2);
end;

procedure TForm1.FindChildren(ParentID : Integer);

procedure FindChildrenInner(ParentID : Integer);
var
TempCDS : TClientDataSet;
ID : Integer;
begin
TempCDS := TClientDataSet.Create(Nil);
try
TempCDS.CloneCursor(CDS1, False, True);
TempCDS.First;
while not TempCDS.Eof do begin
if TempCDS.FieldByName('Parent_ID').AsInteger = ParentID then begin
ID := TempCDS.FieldByName('ID').AsInteger;
Memo1.Lines.Add(Format('ID: %d, Parent: %d', [ID, ParentID]));
FindChildrenInner(ID);
end;
TempCDS.Next;
end;
finally
TempCDS.Free;
end;
end;

begin
Memo1.Lines.BeginUpdate;
try
Memo1.Lines.Clear;
Assert(CDS1.Locate('ID', ParentID, []));
FindChildrenInner(ParentID);
finally
Memo1.Lines.EndUpdate;
end;
end;

关于delphi - 获取分层数据集中子记录的递归过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40458858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com