|
|
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Zmeishe , Извиняюсь ... видимо заработался ... ID = 0 - будет цикл по верхнему звену. Но смысла делать ID = 0 как мне кажется нет. PARENTID = 0 это и есть корень и какой у него ID вообщем-то по барабану. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 15:41 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
херачить будет - будет. 4Змеище А чтобы не херачил, надо именно так Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 15:43 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Dnico > Не должно вообще-то ... Давай рассуждать логически по шагам. Параметр = 0 первый for select вытащит все PID равные 0, в том числе и тот который ID = 0. присвоит :node_id в 0. поскольку САМОЕ верхнее звено это папка, то далее рекурсия с :node_id = 0. И понеслась 'душа в рай'. Но это частный случай. Если у тебя нет такого звена ID=ID_PARENT=0, то циклить до бесконечности естественно не будет. Я это звено делаю для того, чтобы 1. Избавиться от NULL 2. Создать внешний ключ для контроля целостности данных самим IB. 3. Это звено служебное. Его даже можно не показывать юзеру в программе. Все остальные ветви юзеру только кажуться САМЫМИ верхними. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 15:47 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Zmeishe, ты не прав! Чел согласился, что корнем должен быть ID=0 PID= null Тогда при вызове процы с параметром 0 вытаскиваются все записи, лежащие в корне (сам корень не вытащится т.к. у него ещё раз повторяю, PID=null <> 0) потом рекурсия. Всё путём, Dnico. Змеище тоже молодец за идею с рутом. Gallagher ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 16:01 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Я решил эту задачу в общем виде. И мне необходимо вытаскивать и вершину и всё остальное. Поскольку ID_PARENT участвует в WHERE, то для быстродействия нужен индекс. Если там будет NULL, то для индекса это ДЫРРРКА, что не есть хорошо. К тому же ссылочную целостность в дереве контролировать надо. Мне надо, а вы как хотите. Чтобы это не делать руками, я избавился от NULL и построил внешний ключ. В нём и индекс и ссылочная целостность. Один единственный нолик избавил меня от кучи лишних телодвижений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 16:12 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Так! Предлагаю самое простое решение: Вершина ID PARENTID 1 0 Ветви: ID PARENTID 2 1 3 1 4 1 5 2 6 2 и т.д. GET_TREE будет прекрасно работать с любым номерм PARENTID. + Zmeishe Я это звено делаю для того, чтобы 1. Избавиться от NULL 2. Создать внешний ключ для контроля целостности данных самим IB. 3. Это звено служебное. Его даже можно не показывать юзеру в программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 16:25 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Поправим Gallaher'a Ну ладно. Если хочешь, чтобы был FK , тогда первая запись в таблице ID=0 PID=0 name='root' следующая запись ID=1 PID=0 name='root' ID=2 PID=1 name='dir1' ID=3 PID=1 name='dir2' ............................ Выполняй процедуру get_tree c параметром 1 Код: plaintext Вытащатся все с PID>=1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 16:26 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Всё гораздо проще. Я эту процедуру вызываю не с одним параметром, а с двумя. Первый это ID или ID_PARENT кому, что нравиться, а вот воторой это флажок. При самом первом вызове процедуры флажок = 0, при рекусии 1 Если процедуру Dnico дополнить if(:flag = 0) then тогда получится моя процедура. Но не ломайте голову в понедельник принесу полный текст. Он больше текста Dnico буквально на пару, тройку коротких строчек. Не помню я сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 16:36 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Кстати, есть еще одна задачка не тему Tree . Требуется процедура, которая выдает сумму по некоему полю на всех уровнях дерева. Есть ли какие соображения? Я вот задумался, как сделать эффективнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 16:54 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Есть! И работает не один год. Причём считанные секунды по всему дереву сверху до низу. Но дарить или продавать - я ещё не решил! Я мерзкий и противный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 18:00 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Таблица ID ID_PARENT 0 0 // То без чего FK весьма проблематично построить, чтобы работал быстро. С Null тормоза жуткие! 1 0 2 0 3 1 4 1 и т.д. Итак единственное принципиальное отличие от процедуры Dnico это WHERE (D.ID <> D.ID_PARENT) AND Код: 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. Смысл FLAG следующий: В моей задаче иногда необходимо вытаскивать одим набором данных не только потомков, но и самого родителя. Если get_tree( 1, 0 ) то результат 1 0 // Родитель 3 1 // Потомок 1 4 1 // Потомок 1 Если get_tree( 1, 1 ) то результат 3 1 // Потомок 1 4 1 // Потомок 1 Если get_tree( 0, 0 ) то результат 0 0 // Родитель 1 0 // Потомок 0 2 0 // Потомок 0 3 1 // Потомок 1 4 1 // Потомок 1 Если get_tree( 0, 1 ) то результат 1 0 // Потомок 0 2 0 // Потомок 0 3 1 // Потомок 1 4 1 // Потомок 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 08:51 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Zmeishe , Да, по поводу вытаскивания и родителя и потомков, это тоже хорошо, иногда требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 08:57 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
В своё оправдание хотел только напомнить, что мне нужно было вытаскивать упорядоченное по полю order дерево, причём папки по своему order 'у а файлы по своему. Этим и обуславливалась громоздкость. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 11:10 |
|
||
|
Interbase VS Firebird Heeeeeelp!
|
|||
|---|---|---|---|
|
#18+
Сорри конечно что опаздал... но могу сказать, что для корневого узла parent=null так же прекрасно работает.... равно как и работает условие where D.SubId = :RootId где RootId=null только что специально смотрел процу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 11:46 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32232439&tid=1580132]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
186ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 549ms |

| 0 / 0 |
