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

标签 delphi recursion

我有一个数据表 (MDTasks),其中包含以 TreeView 表示的记录。每条记录都有一个唯一的字段“ID”和一个字段“Parent_ID”,它指的是父记录的 ID。我正在尝试列出具有给定 ID 的任何记录级别的所有 child 的列表。我有以下内容,它获取每个级别的第一个 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/

相关文章:

delphi - 如何在 Delphi 的 OLE 自动化过程中使 Word 不可见

delphi - 最小枚举大小在 Delphi 中不起作用

delphi - DAX错误:访问冲突读取地址00000000

ruby-on-rails - 使用 Rspec 的 Ruby 递归深度搜索

recursion - Elixir map_reduce 引用最后一个元素

Delphi - 免费泛型

delphi - FirebaseOptions.fromResource 返回 null 使得所有 Firebase 框架无法工作

c++ - 确定函数的复杂性(大 O 表示法)

algorithm - Q-Learning 算法的实现是递归的吗?

使用链表的 Java 递归二项式系数