![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дерево в БД [D7, IB6.x]
goozman © (2004-05-06 10:12:00)Помогите пожалуйста, есть таблица, главные поля (ID, PARENT_ID) по ним строится дерево- по полю ID я могу добратся к самому верхнему родителю, а теперь вопрос помогите создать запрос по которому можно по родителю (самому верхнему) узнать все дочерние его ветки! Очень надеюсь на Вашу помощь!
}|{yk (2004-05-14 13:43:00) [1]А в [38] и [48] я что предлагал, не рекурсию?
Digitman (2004-05-14 13:16:00) [2]
> goozman (14.05.04 09:00) [58]
все верно) ... для концептуального решения задачи достаточно реализации вот такой вот рекурс.ХП
клиент, обращаясь к такой ХП, получает курсор НД и волен двигать его как угодно - хоть для позиционирования/выборки одной нужной ему записи, хоть для позиц-я/выборки всего результирующего НД .. а уж как клиент будет всю эту бодягу визуализировать - это не проблема сервера)
Соловьев (2004-05-14 09:29:00) [3]
> 59] gu_est
см. первый пост. Там все это уже давно было.
gu_est (2004-05-14 09:28:00) [4]о чем я и говорил [21], а все уперлись в визуализацию...
goozman (2004-05-14 09:00:00) [5]Знаете, я почитал ....-Все это полнейший бред!
Вот я решил свою проблему процедурой рекурсии
ВХОД (ROTT)
ИСХОД (ID)
ПЕР(CUR_NODE)
begin
for select d.id
from department d
where d.parent_id = :root
into :id do
begin
suspend;
cur_node = id;
for select id from temp(:CUR_NODE)
into :id do suspend;
end
end
Курдль (2004-05-06 14:17:00) [6]
> }|{yk © (06.05.04 14:12) [56]
> >Забавная методика построения дерева методами древовидного
> компонента :)
> Чем забавная? Нет у этого компонента функции загрузки дерева
Тем и забавная, что применяются методы самого же компонента типа
StartSearch. Я не сказал, что плохая. А о том, что нет метода загрузки мне рассказывать и не надо - см. [55]
}|{yk (2004-05-06 14:12:00) [7]>Забавная методика построения дерева методами древовидного компонента :)
Чем забавная? Нет у этого компонента функции загрузки дерева
Курдль (2004-05-06 14:03:00) [8]Ладно, чтобы не быть голословным к своим разглагольствованиям о пользе построения дерева на клиенте приложу код, который был создан несколько лет назад и вместе с [34] успешно реализовывал отображение набора данных, единожды полученного от бди переписанного в List:
//------------------------------------------------------------------------------
procedure TfrmAccounts.ListToTree(aList: TList);
var i, act, lev: Integer; P: ptrAcc;
dxnArr: array [0..63] of TdxTreeListNode;
begin
dxt1.ClearNodes;
dxnArr[0]:=dxt1.AddFirst; if dxnArr[0]nil then dxnArr[0].MakeVisible;
dxnArr[0].Data:=Ptr(0);
dxnArr[0].ImageIndex:=0;
dxnArr[0].SelectedIndex:=1;
dxnArr[0].Strings[0]:='Ðååñòð ñ÷åòîâ';
dxnArr[0].Strings[1]:=dmSB.SelfUlName;
if aList = nil then Exit;
dxt1.Visible:=False;
for i:=0 to aList.Count-1 do
begin
P:=aList.Items[i];
lev:=P.level;
dxnArr[lev]:=dxnArr[lev-1].AddChild; if dxnArr[lev]nil then dxnArr[lev].MakeVisible;
dxnArr[lev].Data:=Ptr(P.id);
dxnArr[lev].Strings[0]:=P.num;
dxnArr[lev].Strings[1]:=P.name;
case P.act of
-1: begin
dxnArr[lev].ImageIndex:=2;
dxnArr[lev].SelectedIndex:=3;
dxnArr[lev].Strings[2]:='Àêòèâ';
end;
0: begin
dxnArr[lev].ImageIndex:=4;
dxnArr[lev].SelectedIndex:=5;
dxnArr[lev].Strings[2]:='Àêòèâ/ïàññèâ';
end;
1: begin
dxnArr[lev].ImageIndex:=6;
dxnArr[lev].SelectedIndex:=7;
dxnArr[lev].Strings[2]:='Ïàññèâ';
end;
end;
case P.col of
1: begin
dxnArr[lev].StateIndex:=8;
dxnArr[lev].Strings[3]:='Áàëàíñîâûé';
end;
2: begin
dxnArr[lev].StateIndex:=9;
dxnArr[lev].Strings[3]:='Çàáàëàíñîâûé';
end;
3: begin
dxnArr[lev].StateIndex:=10;
dxnArr[lev].Strings[3]:='Âñïîìîãàòåëüíûé';
end;
else begin
dxnArr[lev].StateIndex:=10;
dxnArr[lev].Strings[3]:='Íå îïðåäåëåí';
end;
end;
if P.dt00 then dxnArr[lev].Values[4]:=P.dt0;
if P.kt00 then dxnArr[lev].Values[5]:=P.kt0;
if lev>1 then dxnArr[lev-1].Collapse(false);
end;
dxt1.FullCollapse;
dxnArr[0].Expand(false);
dxt1.Visible:=True;
end;
//------------------------------------------------------------------------------
Курдль (2004-05-06 13:46:00) [9]
> }|{yk © (06.05.04 13:42) [52]
> Кстати функция формирования дерева
Забавная методика построения дерева методами древовидного компонента :)
Соловьев (2004-05-06 13:44:00) [10]
> }|{yk © (06.05.04 13:42) [52]
> Кстати функция формирования дерева
procedure TForm1.FormActivate(Sender: TObject);
begin
DBVirtualStringTree1.LoadTree;
end;
И все :)))
}|{yk (2004-05-06 13:42:00) [11]Кстати функция формирования дерева
procedure TFormCUST2TREE.GenerateTree(ID: Integer);
var
column: Integer;
Node: tdxTreeListNode;
find: Boolean;
pid: string;
begin
DataModuleMain.APP_CUST2_TREE.Active:=False;
DataModuleMain.APP_CUST2_TREE.ParamByName('VSET_ID').AsInteger:=ID;
DataModuleMain.APP_CUST2_TREE.Active:=True;
DataModuleMain.APP_CUST2_TREE.First;
column:=dxTreeListCUST2TREEMEM_ID.Index;
while not DataModuleMain.APP_CUST2_TREE.Eof do
begin
pid:=DataModuleMain.APP_CUST2_TREEMEM_PID.AsString;
dxTreeListCUST2TREE.StartSearch(column, pid);
find:=dxTreeListCUST2TREE.FocusedNode<>nil;
if (find) then
node := dxTreeListCUST2TREE.FocusedNode.AddChild
else
node := dxTreeListCUST2TREE.Add;
SetNodeValues(Node,DataModuleMain.APP_CUST2_TREEMEM_ID.AsString,DataModuleMain.APP_CUST2_TREEMEM_NAME.AsString,pid);
DataModuleMain.APP_CUST2_TREE.Next;
end;
dxTreeListCUST2TREE.GotoFirst;
end;
Курдль (2004-05-06 13:35:00) [12]
> Мунька (06.05.04 13:32) [50]
> Смею заметить, что Вы не привели кусок кода формирования
> вашего листа, содержащего дерево
Оно немного больше того, которое строите Вы (по функциональности а не размеру кода) - включает в себя разнообразные признаки и графические элементы, но если Вы подтвердите свое желание - след. постом выложу.
Мунька (2004-05-06 13:32:00) [13]Смею заметить, что Вы не привели кусок кода формирования вашего листа, содержащего дерево
Курдль (2004-05-06 13:11:00) [14]
> Скорее не являющимся критичным - из поставленной задачи.
> Поскольку известно, что дерево подразделений не будет большим,
> соответсвенно не будет тысяч Select и Insert + требования
> к ресурсам компа (в силу других решаемых задач) достаточно
> высоки.
А Вы, девушка, не в Microsoft работаете с Вашим замахом на ресурсы? :) Я же привел пример кода, который в тысячи раз эффективнее Вашего. Что может быть проще?
Разве что сканировать ChildLevel только при раскрытии узла, как писал Соловьев © (06.05.04 11:34) [18]
(И это наиболее экономичный способ, если не надо делать никаких "восходящих расчетов", как в моем случае).
Соловьев (2004-05-06 13:04:00) [15]
> Мунька (06.05.04 12:47) [44]
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=488
тоже не привязано к серверу. Очень поучительная статья
}|{yk (2004-05-06 13:04:00) [16]Посмотри код по ссылке. После выполнения 1 запроса далее идет один цикл по полученному результату и строится дерево. Время выполнения и построения минимально
Мунька (2004-05-06 13:02:00) [17]> а лишь внутри отдельно взятого компа Вы считаете хорошим >основанием?..
Скорее не являющимся критичным - из поставленной задачи. Поскольку известно, что дерево подразделений не будет большим, соответсвенно не будет тысяч Select и Insert + требования к ресурсам компа (в силу других решаемых задач) достаточно высоки. Хотя, действительно, использование временной таблицы не есть хорошо в принципе,но в данном случае допустимо - учитывая временные рамки разработки и полное отсутсвие времени на оптимизацию
Курдль (2004-05-06 12:56:00) [18]
> Это нормально, поскольку приведенный код не есть клиент-серверное
> приложение, а программа, функционирующая на одном компе,
> создание деревьев подразделей - не ее цель, а так, утилита
> для удобства юзера, не более того
Создание деревьев - это всегда не цель. Чаще всего цель - автоматизация какого-нибудь процесса.
А то, что Ваша программа не гоняет "select + Набор данных" и "insert + Набор данных" тысячи раз за единичный циклпостроения дерева по сети, а лишь внутри отдельно взятого компа Вы считаете хорошим основанием?..
Мунька (2004-05-06 12:47:00) [19]Вернее сама программа клиент... но в совершенно другом смысле, к БД не имеющем отношение
Мунька (2004-05-06 12:46:00) [20]>А если Ваш юзер не имеет привелегий на создание временных таблиц?
Таблица создается в шаблоне базе данных не юзером
>И как Вы сами-то оцениваете "select в цикле" с клиента? Это нормально?
Это нормально, поскольку приведенный код не есть клиент-серверное приложение, а программа, функционирующая на одном компе, создание деревьев подразделей - не ее цель, а так, утилита для удобства юзера, не более того