:: Visual Foxpro, Foxpro for DOS
Как определить глубину уровня узла дерева ?
Myhailo
Автор

Сообщений: 750
Дата регистрации: 07.02.2006
Здраствуйте

Есть таблица (счетчиков) поле id - pk счетчика, iparent - id счетчмка родителя. Если заполнено iparent значит id -

субсчетчик. Для расчета показаний нужно определить порялок расчета, столбец ilevel т.е. рассчитать показания счетчиков в

порядке убивания ilevel.

Подскажите пожалуйста как из приведенного примера получить столбец ilevel

Спасибо.

CREATE CURSOR test (id I, iparent I, ilevel i)
INSERT INTO test (id , iparent , ilevel) VALUES (13, 0, 0)
INSERT INTO test (id , iparent , ilevel) VALUES (15,13,1)
INSERT INTO test (id , iparent , ilevel) VALUES (25,15,3)
INSERT INTO test (id , iparent , ilevel) VALUES (26,15,2)
INSERT INTO test (id , iparent , ilevel) VALUES (30,25,2)
INSERT INTO test (id , iparent , ilevel) VALUES (41,0,0)
Ratings: 0 negative/0 positive
Re: Как определить глубину уровня узла дерева ?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Как-то я делал - всего через один хитрый запрос формировал на основе справочника с перечнем.
Который потом и сканировал в дереве. Но думаю его пришлось бы сильно адаптировать, чтобы применить к этому случаю.
Поскольку для простоты формирования всех подобных вещей - на мой взгляд, лучше все идентификаторы делать не численного типа (N), а сразу символьного (С), чтобы меньше всяких преобразований было при формировании дерева.
При этом удобнее скажем для дерева с 4 уровнями вложенности изначально иметь в поле таблицы строку-идентификатор такого вида: "01010000" или "01020000" - для двух объектов "01" и "02" (3-4 позиция в этом поле), чей родитель "01" (1-2 позиция). понятно, что это, если они сами могут быть родителями еще двух уровней.
При этом корень у дерева такой глубины вложенности имеет идентификатор "00000000".
Для дерева же со всего 2 уровнями естественно будет "0000". И у этих двух объектов в поле значения: "0101" и "0102".

Обычно конечно делают чуть иначе, ставя каждому объекту числовой идентификатор в поле, как показано у тебя, но использование для идентификатора именно символьной строки, на мой взгляд, затем многое упрощает при всяких операциях работы с узлами и прочим.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 04.09.20 15:22
Ratings: 0 negative/0 positive
Re: Как определить глубину уровня узла дерева ?
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Подскажите пожалуйста как из приведенного примера получить столбец ilevel

Т.е. в примере не заполняем INSERT-ами поле iLevel. Задача расчитать глубину вложения и заполнить это поле?

> INSERT INTO test (id , iparent , ilevel) VALUES (13, 0, 0)
INSERT INTO test (id , iparent , ilevel) VALUES (15,13,1)
INSERT INTO test (id , iparent , ilevel) VALUES (25,15,3) && почему iLevel=3 а не 2 ?
INSERT INTO test (id , iparent , ilevel) VALUES (26,15,2) && почему iLevel отличается от предыдущей строки, ведь родитель такой же (15)?
Ratings: 0 negative/0 positive
Re: Как определить глубину уровня узла дерева ?
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Если не мудрить, то для каждой записи делать что-нибудь типа
DO WHILE !EMPTY(iparent) AND SEEK(iparent ...)

а в цикле просто добавлять 1 к счетчику уровней - на выходе и будет номер уровня текущей записи.

Crispy
Для дерева же со всего 2 уровнями естественно будет "0000".
А у дерева с N уровнями?
И почему именно 2 символа на уровень?
Ratings: 0 negative/0 positive
Re: Как определить глубину уровня узла дерева ?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
akvvohinc
И почему именно 2 символа на уровень?

Просто эмпирически. Обычно в моем случае принципиально не бывало больше 99 дочерних элементов.
Для каких-то гигантских случаев, возможно этот вариант был бы не слишком хорошим. Хотя мне кажется дерево, где даже 1000 дочерних элементов - нечто, что если не до конца повесится, то будет страшно тормозить. В любом случае конечно - каждый решает для себя, у каждого свои нюансы, имеет смысл лишь ориентироваться на чужие решения.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как определить глубину уровня узла дерева ?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
CREATE CURSOR test (ID I, iparent I)
INSERT INTO test (ID, iparent) VALUES (13, 0)
INSERT INTO test (ID, iparent) VALUES (15,13)
INSERT INTO test (ID, iparent) VALUES (25,15)
INSERT INTO test (ID, iparent) VALUES (26,15)
INSERT INTO test (ID, iparent) VALUES (30,25)
INSERT INTO test (ID, iparent) VALUES (41, 0)
INDEX ON ID TAG ID
INDEX ON iparent TAG iparent
CREATE CURSOR result (ID I, iparent I, ilevel I)
INDEX ON ID TAG ID
INDEX ON ilevel TAG ilevel
SET ORDER TO
* Get roots
INSERT INTO result (ID, iparent, ilevel) ;
SELECT ID, iparent, 0 FROM test WHERE iparent = 0
* Get levels
lnLevel = 1
DO WHILE _TALLY > 0
INSERT INTO result (ID, iparent, ilevel) ;
SELECT test.ID, test.iparent, m.lnLevel ;
FROM test ;
WHERE test.iparent IN (SELECT ID FROM result ;
WHERE result.ilevel = m.lnLevel - 1) ;
AND test.ID NOT IN (SELECT ID FROM result)
lnLevel = m.lnLevel + 1
ENDDO
BROWSE


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как определить глубину уровня узла дерева ?
Myhailo
Автор

Сообщений: 750
Дата регистрации: 07.02.2006
Всем спасибо, то что нужно, и конечно особенная благодарнось Igor Korolyov
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 29 (Гостей: 29)

© 2000-2024 Fox Club 
Яндекс.Метрика