![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дерево в БД [D7, IB6.x]
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]
там все это есть