Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дерево в БД [D7, IB6.x]


Страницы:   1 2 3 4

goozman ©   (2004-05-06 10:12:00) 

Помогите пожалуйста, есть таблица, главные поля (ID, PARENT_ID) по ним строится дерево- по полю ID я могу добратся к самому верхнему родителю, а теперь вопрос помогите создать запрос по которому можно по родителю (самому верхнему) узнать все дочерние его ветки! Очень надеюсь на Вашу помощь!


Мунька   (2004-05-06 11:46:00) [41]

Ладно, ловите. Суть такая. Таблица, как я понимаю, как у нашего вопрошающего. Сначала я извлекаю данные все, а уж потом строю дерево, результат, то бишь дерево, скидываю в StringList

//---------------------------------------------------------------
//Извлечение всех записей и скидывание их в StringList при помощи рекурсивной функции RecursDepartment, для идентификаторов используется отдельный TStringList * DepListId
bool TDM::SelectAllDepartment(WideString ConnectionADO, TStringList * DepList, TStringList * DepListId)
{
int RecNo;

if(ADOQDepart->Active)
 ADOQDepart->Close();
  ADOConnection1->Connected  = false;
  ADOConnection1->ConnectionString = ConnectionADO;
  ADOConnection1->Connected  = true;
  ADOQDepart->Connection = ADOConnection1;

ADOQDepart->SQL->Clear();
ADOQDepart->SQL->Add("SELECT * FROM  tdivision ORDER BY id_parent, id_division");
try{
  ADOQDepart->Open();
}
catch(...)
{
 return false;
}
ADOQDepart->First();
DepList->Clear();

if(DepListId!=NULL)
DepListId->Clear();
while(!ADOQDepart->Eof&&(ADOQDepart->FieldByName("id_parent")->AsInteger==-1 ) )
{
  DepList->Add(ADOQDepart->FieldByName("name_division")->AsString);
    if(DepListId!=NULL)
      DepListId->Add(IntToStr(ADOQDepart->FieldByName("id_division")->AsInteger));

  RecNo =ADOQDepart->RecNo;
  RecursDepartment(DepList, ADOQDepart->FieldByName("id_division")->AsInteger, DepListId);
  ADOQDepart->RecNo=RecNo;
  ADOQDepart->Next();
}

return true;
}
//сама рекурсивная функция
void TDM::RecursDepartment(TStringList * DepList, int id_parent, TStringList * DepListId)
{
int RecNo;

 while(!ADOQDepart->Eof)
 {
  if(ADOQDepart->FieldByName("id_parent")->AsInteger==id_parent)
   {
    DepList->Add(ADOQDepart->FieldByName("name_division")->AsString);
    if(DepListId!=NULL)
      DepListId->Add(IntToStr(ADOQDepart->FieldByName("id_division")->AsInteger));
    RecNo = ADOQDepart->RecNo;
    RecursDepartment(DepList, ADOQDepart->FieldByName("id_division")->AsInteger, DepListId);
    ADOQDepart->RecNo=RecNo;

   }
   ADOQDepart->Next();
 }

}


gu_est   (2004-05-06 11:43:00) [42]

Автор вообще не заострял внимание на визуализации дерева как такового (может полученный в результате запроса набор данных он собарается использовать для дальнейших вычислений, а не для визуализации в виде дерева).
Посему ХП (ИМХО) это то, что "доктор прописал"


Курдль   (2004-05-06 11:37:00) [43]


> У меня ветка строится когда пользователь решил ее рскрыть.

Это разумно. Не спорю. Но я, чаще всего, беру TdxDBTreeList, подставляю ему набор данных и не парюсь :)


Johnmen   (2004-05-06 11:36:00) [44]

>Именно загнать на клиента ВСЕ!

Да ? А если их много ? А нас много не интересует ?

>Ведь от перестроения записей их количество не изменится!

А где здесь "перестроение" ?


Курдль   (2004-05-06 11:34:00) [45]


> Соловьев ©   (06.05.04 11:28) [14]

> Таким образом я понял что Оракл вернет уже типа готовой
> компоненты... Значит я не понял ответа.
> Но имхо ХП самое оно.

Нифига похожего оно не вернет! Только root-node-subnode...node-subnode-subsubnode... и т.д. Еще поле LEVEL.
Компонент визуальный наполнять все равно придется со стороны клиента - иначе никак!


Соловьев   (2004-05-06 11:34:00) [46]


> Ведь от перестроения записей их количество не изменится!
>

это если один клиент :)
А если много? У меня ветка строится когда пользователь решил ее рскрыть. И сразу выполняется запрос к БД. А в твоем варианте данные не актуальны.


Курдль   (2004-05-06 11:29:00) [47]


> gu_est   (06.05.04 11:26) [13]
> Загнать на клиента ВСЕ и там строить дерево? А на кой тогда
> сервер вообще нужен?

Именно загнать на клиента ВСЕ! Ведь от перестроениязаписей их количество не изменится! А сервер БД нужен вовсе не для того, чтобы заниматься бантиками клиентского интерфейса.


Sergey_Masloff   (2004-05-06 11:28:00) [48]

Курдль ©   (06.05.04 11:24) [12]
В запросе надо отобрать все счета клиента а клиент это иерархическая структура - центральный офис, представительства и так далее. Куда ты в этой задаче засунешь свое дерево на клиенте?
Это только самый простой пример реально деревью могут использоваться на сервере и покруче.


Соловьев   (2004-05-06 11:28:00) [49]


> Только оракл вернет по запросу, а не из ХП

Просто разработчики Оракла уже это реализовали. Вот тебе и запрос. Но не вижу сложности в ХП...
не будем спорить, автор и сам решит что ему нужно...
Противоречие здесь.

> Преобразовывать их в стволы, ветки и узлы придется все равно
> на клиенте.

Таким образом я понял что Оракл вернет уже типа готовой компоненты... Значит я не понял ответа.
Но имхо ХП самое оно.


gu_est   (2004-05-06 11:26:00) [50]

>Курдль ©   (06.05.04 11:16) [8]
Что значит не мучать сервер? А кого мучать? Клиента?
Загнать на клиента ВСЕ и там строить дерево? А на кой тогда сервер вообще нужен?


Курдль   (2004-05-06 11:24:00) [51]


> Соловьев ©   (06.05.04 11:21) [10]
> а оракл вернет что? не
> > последовательность деревянно-отсортированных записей!

Ее самую, а где противоречия? Только оракл вернет по запросу, а не из ХП. Но я повторяю - чаще всего удобнее "делать дерево" на клиенте.


Курдль   (2004-05-06 11:22:00) [52]


> Мунька   (06.05.04 11:19) [9]
> Не вижу проблем такого преобразования

Так я более того - не вижу проблем разложения древовидно-заточенного набора данных в дерево вовсе на клиенте! Это рекурсия в 10 строк!


Соловьев   (2004-05-06 11:21:00) [53]


> Курдль ©   (06.05.04 11:16) [8]

а оракл вернет что? не
> последовательность деревянно-отсортированных записей!
?


Мунька   (2004-05-06 11:19:00) [54]

>последовательность деревянно-отсортированных записей! >Преобразовывать их в стволы, ветки и узлы придется все равно на >клиенте.
Не вижу проблем такого преобразования


Курдль   (2004-05-06 11:16:00) [55]


> Соловьев ©

На ХП можно построить дерево с цепью, русалкой и ученым котом впридачу! Автор просил запрос. Но я считаю, что ради "дерева" не следует мучать сервер. Ведь все, что он сможет вернуть - последовательность деревянно-отсортированных записей! Преобразовывать их в стволы, ветки и узлы придется все равно на клиенте.


Соловьев   (2004-05-06 11:15:00) [56]


> Мунька   (06.05.04 11:13) [6]

в Access - не решается в ИБ решается.


Мунька   (2004-05-06 11:13:00) [57]

Одним запросом не решается. Я строила дерево из таблицы Access - дерево подразделений, находила также предков-потомков, но одним запросом это не решается, если интересно, могу кусок кода поиска потомков кинуть


Соловьев   (2004-05-06 11:10:00) [58]


> Курдль ©   (06.05.04 11:06) [4]

ХП


Курдль   (2004-05-06 11:06:00) [59]

Это не решается запросом (разве что на Оракле).


Соловьев   (2004-05-06 10:25:00) [60]


> goozman   (06.05.04 10:19) [2]

там все это есть


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо