Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
Курдль ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.037 c
1-1085555356
ЁПРСТ
2004-05-26 11:09
2004.06.06
Delay в Delphi


1-1085670406
Raul
2004-05-27 19:06
2004.06.06
кто нибудь подскажите варианты многострочного PopupMenu


4-1082892953
DoG
2004-04-25 15:35
2004.06.06
GetExitCodeProcess


1-1085674813
Sergey
2004-05-27 20:20
2004.06.06
Удаленный файл


4-1082714319
Nataly
2004-04-23 13:58
2004.06.06
имитация нажатия Alt+C





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский