Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Дерево в БД   Найти похожие ветки 

 
Курдль ©   (2004-05-06 12:18) [40]


> aList.Sort(@SortCompareIndex);

Не обязательно - можно и без @.


> и вообще не понятно к чему твой код :)

Да "не вынесла душа поэта" :))) Привел код, который выстраивает данные в древовидную структуру и еще суммирует остатки по счетам "вверх по иерархии". Это не 10 строк, а аж 30...


 
Курдль ©   (2004-05-06 12:29) [41]


> Мунька   (06.05.04 12:18) [39]
> Всего-навсего ответила на вопрос, где при построении дерева
> не использовалась НИКАКАЯ специфика СУБД, все в рамках Ansi
> - стандарта. Если за вас УЖЕ извлечены все потомки - это
> хорошо, здесь показано все с 0 (почти, как format c:).

Про "никакую специфику". А если Ваш юзер не имеет привелегий на создание временных таблиц?
И как Вы сами-то оцениваете "select в цикле" с клиента? Это нормально?


 
Johnmen ©   (2004-05-06 12:37) [42]

>Мунька
>Всего-навсего ответила на вопрос, где при построении дерева не использовалась НИКАКАЯ специфика СУБД,

Неужели ? А что по поводу временной таблицы ? Откуда она ? И что с ней ?
И насколько это эффективно ?

>все в рамках Ansi - стандарта.

В смысле ?

>И еще не штурмовал, а штурмовалА

Виноват. Сразу не сообразил...:)


 
Мунька   (2004-05-06 12:46) [43]

>А если Ваш юзер не имеет привелегий на создание временных таблиц?
Таблица создается в шаблоне базе данных не юзером

>И как Вы сами-то оцениваете "select в цикле" с клиента? Это нормально?
Это нормально, поскольку приведенный код не есть клиент-серверное приложение, а программа, функционирующая на одном компе, создание деревьев подразделей - не ее цель, а так, утилита для удобства юзера, не более того


 
Мунька   (2004-05-06 12:47) [44]

Вернее сама программа клиент... но в совершенно другом смысле, к БД не имеющем отношение


 
Курдль ©   (2004-05-06 12:56) [45]


> Это нормально, поскольку приведенный код не есть клиент-серверное
> приложение, а программа, функционирующая на одном компе,
> создание деревьев подразделей - не ее цель, а так, утилита
> для удобства юзера, не более того

Создание деревьев - это всегда не цель. Чаще всего цель - автоматизация какого-нибудь процесса.
А то, что Ваша программа не гоняет "select + Набор данных" и "insert + Набор данных" тысячи раз за единичный цикл построения дерева по сети, а лишь внутри отдельно взятого компа Вы считаете хорошим основанием?..


 
Мунька   (2004-05-06 13:02) [46]

> а лишь внутри отдельно взятого компа Вы считаете хорошим >основанием?..
Скорее не являющимся критичным - из поставленной задачи. Поскольку известно, что дерево подразделений не будет большим, соответсвенно не будет тысяч Select и Insert + требования к ресурсам компа (в силу других решаемых задач) достаточно высоки. Хотя, действительно, использование временной таблицы не есть хорошо в принципе,но в данном случае допустимо - учитывая временные рамки разработки и полное отсутсвие времени на оптимизацию


 
Соловьев ©   (2004-05-06 13:04) [47]


> Мунька   (06.05.04 12:47) [44]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=488
тоже не привязано к серверу. Очень поучительная статья


 
}|{yk ©   (2004-05-06 13:04) [48]

Посмотри код по ссылке. После выполнения 1 запроса далее идет один цикл по полученному результату и строится дерево. Время выполнения и построения минимально


 
Курдль ©   (2004-05-06 13:11) [49]


> Скорее не являющимся критичным - из поставленной задачи.
> Поскольку известно, что дерево подразделений не будет большим,
> соответсвенно не будет тысяч Select и Insert + требования
> к ресурсам компа (в силу других решаемых задач) достаточно
> высоки.

А Вы, девушка, не в Microsoft работаете с Вашим замахом на ресурсы? :)  Я же привел пример кода, который в тысячи раз эффективнее Вашего. Что может быть проще?
Разве что сканировать ChildLevel только при раскрытии узла, как писал Соловьев ©   (06.05.04 11:34) [18]
(И это наиболее экономичный способ, если не надо делать никаких "восходящих расчетов", как в моем случае).


 
Мунька   (2004-05-06 13:32) [50]

Смею заметить, что Вы не привели кусок кода формирования вашего листа, содержащего дерево


 
Курдль ©   (2004-05-06 13:35) [51]


> Мунька   (06.05.04 13:32) [50]
> Смею заметить, что Вы не привели кусок кода формирования
> вашего листа, содержащего дерево

Оно немного больше того, которое строите Вы (по функциональности а не размеру кода) - включает в себя разнообразные признаки и графические элементы, но если Вы подтвердите свое желание - след. постом выложу.


 
}|{yk ©   (2004-05-06 13:42) [52]

Кстати функция формирования дерева

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:44) [53]


> }|{yk ©   (06.05.04 13:42) [52]
> Кстати функция формирования дерева

procedure TForm1.FormActivate(Sender: TObject);
begin
 DBVirtualStringTree1.LoadTree;
end;
И все :)))


 
Курдль ©   (2004-05-06 13:46) [54]


> }|{yk ©   (06.05.04 13:42) [52]
> Кстати функция формирования дерева

Забавная методика построения дерева методами древовидного компонента :)


 
Курдль ©   (2004-05-06 14:03) [55]

Ладно, чтобы не быть голословным к своим разглагольствованиям о пользе построения дерева на клиенте приложу код, который был создан несколько лет назад и вместе с [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]:="&#208;&#229;&#229;&#241;&#242;&#240; &#241;&#247;&#229;&#242;&#238;&#226;";
 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]:="&#192;&#234;&#242;&#232;&#226;";
       end;
    0: begin
        dxnArr[lev].ImageIndex:=4;
        dxnArr[lev].SelectedIndex:=5;
        dxnArr[lev].Strings[2]:="&#192;&#234;&#242;&#232;&#226;/&#239;&#224;&#241;&#241;&#232;&#226;";
       end;
    1: begin
        dxnArr[lev].ImageIndex:=6;
        dxnArr[lev].SelectedIndex:=7;
        dxnArr[lev].Strings[2]:="&#207;&#224;&#241;&#241;&#232;&#226;";
       end;
   end;
   case P.col of
    1: begin
        dxnArr[lev].StateIndex:=8;
        dxnArr[lev].Strings[3]:="&#193;&#224;&#235;&#224;&#237;&#241;&#238;&#226;&#251;&#233;";
       end;
    2: begin
        dxnArr[lev].StateIndex:=9;
        dxnArr[lev].Strings[3]:="&#199;&#224;&#225;&#224;&#235;&#224;&#237;&#241;&#238;&#226;&#251;&#233;";
       end;
    3: begin
        dxnArr[lev].StateIndex:=10;
        dxnArr[lev].Strings[3]:="&#194;&#241;&#239;&#238;&#236;&#238;&#227;&#224;&#242;&#229;&#235;&#252;&#237;&#251;&#233;";
       end;
   else begin
         dxnArr[lev].StateIndex:=10;
         dxnArr[lev].Strings[3]:="&#205;&#229; &#238;&#239;&#240;&#229;&#228;&#229;&#235;&#229;&#237;";
        end;
   end;
   if P.dt0<>0 then dxnArr[lev].Values[4]:=P.dt0;
   if P.kt0<>0 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;
//------------------------------------------------------------------------------



 
}|{yk ©   (2004-05-06 14:12) [56]

>Забавная методика построения дерева методами древовидного компонента :)
Чем забавная? Нет у этого компонента функции загрузки дерева


 
Курдль ©   (2004-05-06 14:17) [57]


> }|{yk ©   (06.05.04 14:12) [56]
> >Забавная методика построения дерева методами древовидного
> компонента :)
> Чем забавная? Нет у этого компонента функции загрузки дерева

Тем и забавная, что применяются методы самого же компонента типа
StartSearch. Я не сказал, что плохая. А о том, что нет метода загрузки мне рассказывать и не надо - см. [55]


 
goozman   (2004-05-14 09:00) [58]

Знаете, я почитал ....-Все это полнейший бред!
Вот я решил свою проблему процедурой рекурсии

ВХОД (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


 
gu_est   (2004-05-14 09:28) [59]

о чем я и говорил [21], а все уперлись в визуализацию...


 
Соловьев ©   (2004-05-14 09:29) [60]


> 59] gu_est

см. первый пост. Там все это уже давно было.


 
Digitman ©   (2004-05-14 13:16) [61]


> goozman   (14.05.04 09:00) [58]


все верно) ... для концептуального решения задачи достаточно реализации вот такой вот рекурс.ХП

клиент, обращаясь к такой ХП, получает курсор НД и волен двигать его как угодно - хоть для позиционирования/выборки одной нужной ему записи, хоть для позиц-я/выборки всего результирующего НД .. а уж как клиент будет всю эту бодягу визуализировать - это не проблема сервера)


 
}|{yk ©   (2004-05-14 13:43) [62]

А в [38] и [48] я что предлагал, не рекурсию?



Страницы: 1 2 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.035 c
14-1084793714
Mox Fulder
2004-05-17 15:35
2004.06.06
Посоветуйте почитать....


1-1085325898
vajo
2004-05-23 19:24
2004.06.06
TreeView


14-1084803148
Delphi5.01
2004-05-17 18:12
2004.06.06
Mircosoft Access, eto realno?


4-1082818484
gRad
2004-04-24 18:54
2004.06.06
Параметры ф-ий из dll


14-1084860282
Viking
2004-05-18 10:04
2004.06.06
Периодика по программированию