Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как найте все подгруппы в древовидной структуре? / 15 сообщений из 15, страница 1 из 1
08.04.2003, 10:34
    #32135411
Calm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
Уважаемые коллеги,
имеется простая таблица классификации объектов по группам

Код: plaintext
1.
2.
id
root  /*указатель на родительскую группу*/ 
name


Можно ли написать ХП, которая по заданному id группы находила бы все ее подгруппы любой(!) вложенности?

Заранее спасибо за советы.
...
Рейтинг: 0 / 0
08.04.2003, 10:43
    #32135431
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
можно, классический рекурсивный разбор дерева, со сбросом данных во временную таблицу. Моку выслать пример работающей процедуры для разбора дерева подразделений
...
Рейтинг: 0 / 0
08.04.2003, 10:44
    #32135434
Calm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
Было робкое предположение, что подошел бы запрос с использованием
временной таблицы TempTree, в которую заносились бы найденные подгруппы.

Сналача в Temp_Tree заносится корневая для поиска группа, а затем содержимое Temp_Tree перебирается и для каждой группы, занесенной в нее добавляются все ее подгруппы первого уровня. Таким образом, в таблице Temp_Tree ожидались бы все подгруппы корневой группы.
Код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  insert into temp_tree (groupid)
  values (:hhogroup_id);  /*заносим корневую группу поиска*/ 
   /* Для каждой записи из Temp_Tree находим все подгруппы 1-ог уровня*/ 
  for select HG.id
      from hhogroup HG, temp_tree TT
      where
        TT.groupid=hg.root
      order by TT.id
      into :lhhogroupid
  do begin
    insert into temp_tree (groupid)
    values (:lhhogroupid);
  end


Однако находятся только подгруппы первого уровня. Это может быть и логично,
однако запрос для нахождения всех родительских групп заданной подгруппы, построенный аналогичным образом, работает вполне исправно.
...
Рейтинг: 0 / 0
08.04.2003, 10:45
    #32135437
Calm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
2 StarWind
Был бы очень признателен за пример кода.
...
Рейтинг: 0 / 0
08.04.2003, 10:48
    #32135440
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
 /*структура таблицы*/ 

Create table zDepartment (
	Id		INTEGER NOT NULL, 
	SubId		INTEGER, // ссылка на родителя
	D_From		Date NOT NULL,
	D_To		Date NOT NULL,
	Name		VARCHAR30,
	FullName	VARCHAR100,
	Id_ItemType	Integer,
	Check		(D_To >= D_From),
	Constraint PK_Department Primary Key(ID) ); 


 /*процедура для разбора*/ 

 /* список всех узлов у конкретного корня дерева zDepartment (полный доступ) */ 
CREATE PROCEDURE Sys_ListDeptSheetFull(
	RootId		Integer,  /* Идентефикатор корневого узла */ 
	DTime		Date,  /* текущая дата */ 
	TmpId		Integer,  /* Идентефикатор списка */ 
	ListOnly	Integer  /* если = 1 то только листья, =0 все узлы*/ 
)
AS
Declare Variable Flag		INTEGER;
Declare Variable NewRootId	integer;
begin
  Flag = null;
  for
    select D.id
    from zDepartment D
    where D.SubId = :RootId
    Into :NewRootId
  do
  begin
    Flag =  1 ;
    execute procedure Sys_ListDeptSheetFull (:NewRootId, :DTime,:TmpId,:ListOnly);
  end
  if (((Flag is null) or (ListOnly <>  1 )) and exists(
    select * from zDepartment where Id = :RootId
  ) and (not exists(
    select * from TmpIntTable where Id = :TmpId and F1 = :RootId
  ))) then
    insert into TmpIntTable(id,F1) values(:TmpId,:RootId);
  suspend;
end
^
...
Рейтинг: 0 / 0
08.04.2003, 10:52
    #32135446
Calm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
2 StarWind
Спасибо, буду разбираться.

Возможно, возникнут вопросы. Если Вас не затруднит, загляните через некоторое врямя в эту ветку.
...
Рейтинг: 0 / 0
08.04.2003, 11:11
    #32135480
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
ну я еще тут 50 минут, а дальше только завтра
...
Рейтинг: 0 / 0
08.04.2003, 11:15
    #32135489
Calm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
2 StarWind
Большое спасибо!
У меня все получилось.

Успехов и вам.
...
Рейтинг: 0 / 0
08.04.2003, 11:21
    #32135502
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
спасибо, вам того же
...
Рейтинг: 0 / 0
08.04.2003, 11:24
    #32135506
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
сорри, маленький комментарий... недавно читал, что в IB максимальная глубина рекурсии (кол-во раз вызова процедуры самой себя) под виндой около 700 под юниксами около 1000
...
Рейтинг: 0 / 0
08.04.2003, 11:29
    #32135517
Calm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
Да, я в курсе, что ограничения по глубине рекурсии имеются.
Специфика проги такова, что ожидается глубина не более 7-12 уровней.

P.S.
Поэтому на практике она не должна превысить 25-35 :)
...
Рейтинг: 0 / 0
15.04.2003, 08:37
    #32140467
pvnic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
а если несколько изменить задачу - как выбрать только те группы, у которых есть товары, сохраняя иерархию?
тут трабл в том, что группа может и не иметь товара, но вложенная в нее группа имеет...

те мб так
g1
|_g2
|_ware1
|_ware2

соотв нужно выбрать обе группы...
...
Рейтинг: 0 / 0
15.04.2003, 08:41
    #32140471
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
Верно и что дальше? Вообще говоря не всякое дерево можно построить если на его узлы накладываются ограничения. Только в чем проблема? Топик был на то чтоб разобрать уже построенное дерево, а ты предлагаешь его построить . Чувствуешь разницу?
...
Рейтинг: 0 / 0
15.04.2003, 08:47
    #32140479
pvnic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
если честно, то не очень:

1-е сообщение
Можно ли написать ХП, которая по заданному id группы находила бы все ее подгруппы любой(!) вложенности?

накладывая два ограничения получается
Можно ли написать ХП, которая находила бы все подгруппы любой(!) вложенности, с условием, что группа с максимальным уровнем вложенности должна иметь товары...

при этом таблица почти 1-в-1...
...
Рейтинг: 0 / 0
15.04.2003, 08:48
    #32140480
pvnic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найте все подгруппы в древовидной структуре?
Ладно, переношу в отдельный топик, чтобы флейм не разводить...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как найте все подгруппы в древовидной структуре? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]