Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Список родителей и потомков узла дерева  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1062
Заранее извините за идиотский вопрос.

В Dephi есть датасет, который получает данные из иерархической таблицы БД:

cData: TDataSet;

cData.FiledByName('ID').AsInteger - даёт значение ID узла дерева
cData.FiledByName('PARENT_ID').AsInteger - даёт значение ID родительского узла дерева
PARENT_ID корня = null

есть список prList: TStringList;
есть список chList: TStringList;

нужно написать функцию GetParentsList(selID: Integer), которая вытаскивает по указанному ID в список prList ID-шники всех родительских по иерархии по отношению к нему узлов до самого корня.

а так же, обратную функцию GetChildsList(selID: Integer), которая вытаскивает по указанному ID в список chList ID-шники всех узлов дерева, являющихся его потомками по всей иерархии.
31 май 21, 16:18    [22329411]     Ответить | Цитировать Сообщить модератору
 Re: Список родителей и потомков узла дерева  [new]
alekcvp
Member

Откуда:
Сообщений: 2878
verter,

А через хранимку не проще будет?
31 май 21, 16:30    [22329418]     Ответить | Цитировать Сообщить модератору
 Re: Список родителей и потомков узла дерева  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1062
alekcvp
verter,

А через хранимку не проще будет?


нужно именно на клиенте
31 май 21, 16:31    [22329419]     Ответить | Цитировать Сообщить модератору
 Re: Список родителей и потомков узла дерева  [new]
antox
Member

Откуда: РФ
Сообщений: 1267
Должно рекурсией решаться, как-то делал получение родителей и потомков именно через рекурсию
31 май 21, 16:34    [22329421]     Ответить | Цитировать Сообщить модератору
 Re: Список родителей и потомков узла дерева  [new]
alekcvp
Member

Откуда:
Сообщений: 2878
verter
нужно именно на клиенте

Ну тогда рекурсивный запрос, если БД в них умеет.

Либо что-то вроде:
  varParent := DataSet['PARENT_ID'];
  while not VarIsNull(varParent) and DataSet.Locate('ID', varParent) do
  begin
    prList.Add(DataSet['ID']); // считаем что ID не может быть Null, иначе через FieldByName().AsString
    varParent := DataSet['PARENT_ID'];
  end;    


Сообщение было отредактировано: 31 май 21, 18:48
31 май 21, 18:52    [22329509]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить