Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как скопировать дерево? / 14 сообщений из 14, страница 1 из 1
15.02.2005, 14:26
    #32916561
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
Как из базы (id,parentid) можно скопировать какой-нибудь элемент со всеми вложениями?
...
Рейтинг: 0 / 0
15.02.2005, 14:36
    #32916600
Как скопировать дерево?
Код: plaintext
select * from [table] where table.id = m.id or table.parentid = m.id
...
Рейтинг: 0 / 0
15.02.2005, 14:57
    #32916683
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
Опять через рекурсию или вложенные циклы. То, что предложил Дмитрий, подойдет только для 2-х уровневых деревьев.

Классическая структура id, parentid в общем случае не предназначена для обработки через Select-SQL. Да, она легко модифицируется, но получение из нее выборок - это большие проблемы.
...
Рейтинг: 0 / 0
15.02.2005, 15:48
    #32916846
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
ВладимирМОпять через рекурсию или вложенные циклы.
Ну я в общем-то так и думал. Но всеж надеялс - может есть какое-нибудь простое решение...

ВладимирМ
Классическая структура id, parentid в общем случае не предназначена для обработки через Select-SQL. Да, она легко модифицируется, но получение из нее выборок - это большие проблемы.

Мне в принципе, надо просто скопировать (сдублировать) ветви в базе (но со всеми вложениями).
...
Рейтинг: 0 / 0
15.02.2005, 16:10
    #32916907
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
Ну, если очень хочется, то почитай здесь

http://www.foxclub.ru/zhur/index.php?id=6&act=view

Это выборка из иерархического списка с использованием UDF-функций.
...
Рейтинг: 0 / 0
16.02.2005, 11:02
    #32917908
ankr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  * table TREE ( ID I, PARENTID I, NAME C(  40  )  )   
  m.id = <value>
  m.lev =  1 
  SELECT Id, parentid, name, m.lev as level FROM tree ;
   WHERE Id = m.id INTO CURSOR Items READWRITE 
   
  DO WHILE _TALLY >  0  
     m.lev = m.lev +  1  
     INSERT INTO Items (  id, parentid, name, level ) ;
      SELECT id, parentid, name, m.lev FROM tree ;
       WHERE parentid in (select id from Items ) ;
         AND id NOT in (select id from Items )
        
   ENDDO 

* simple :)
...
Рейтинг: 0 / 0
19.02.2005, 09:55
    #32924531
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
ankr
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  * table TREE ( ID I, PARENTID I, NAME C(  40  )  )   
  m.id = <value>
  m.lev =  1 
  SELECT Id, parentid, name, m.lev as level FROM tree ;
   WHERE Id = m.id INTO CURSOR Items READWRITE 
   
  DO WHILE _TALLY >  0  
     m.lev = m.lev +  1  
     INSERT INTO Items (  id, parentid, name, level ) ;
      SELECT id, parentid, name, m.lev FROM tree ;
       WHERE parentid in (select id from Items ) ;
         AND id NOT in (select id from Items )
        
   ENDDO 

* simple :)
правильно ли я понял, что должно быть поле level в таблице?
...
Рейтинг: 0 / 0
19.02.2005, 10:36
    #32924545
AnKr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
Field Level is calculated, not from primary table, just for debugging.
Primary table actually must have fields ID ar ParentID, field Name is optional.
* Sorry za English, uz menia klava bez cirilici.
...
Рейтинг: 0 / 0
19.02.2005, 13:07
    #32924619
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
AnKrField Level is calculated, not from primary table, just for debugging.
Primary table actually must have fields ID ar ParentID, field Name is optional.
* Sorry za English, uz menia klava bez cirilici.
с английским я не силен, а с sql - еще хуже (я только учусь )
но как понять это:
Код: plaintext
SELECT id, parentid, name, m.lev FROM tree

если я чего-то не понимаю, чего читать на тему?
...
Рейтинг: 0 / 0
19.02.2005, 13:13
    #32924624
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
AnKrField Level is calculated, not from primary table, just for debugging.
Primary table actually must have fields ID ar ParentID, field Name is optional.
* Sorry za English, uz menia klava bez cirilici.

сейчас усиленно врубаюсь код ... может, и пойму
...
Рейтинг: 0 / 0
19.02.2005, 21:29
    #32924854
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
По сути, ankr предложил вложенный цикл. Просто результат промежуточных расчетов сохраняется в итоговой выборке.

m.lev - это НЕ поле таблицы. Это переменная памяти. Счетчик, который динамически формируется в процессе выполнения цикла. Поскольку очередной цикл формирует выборку следующего уровня, то m.Lev содержит порядковый номер уровня вложенности. В данном случае начиная с 1.

Его логика примерно следующая:

-) Первым шагом отбираем прямых потомков для заданного значения ID. Т.е. те записи у которых ParentID = заданному ID. Результат записывается в курсор Items

-) Далее организуется цикл, выход из которого возможен только в том случае, если в результат выборки не попадет ни одной записи (больше нечего выбирать)

-) Внутри цикла выбираются записи у которых значение ParentID = хотябы одному значению ID из курсора Items, но при этом значение собственно ID не равно ни одному значению ID из курсора Items. Т.е. по сути, отбираются все элементы следующего уровня для всех элементов, ранее отобранных в курсор Items

-) Результат выборки записывается в тот же самый курсор Items и выполняется следующий шаг цикла.

Правда, в приведенном синтаксисе уровень вложенности (значение m.Lev) корректно будет отображаться только до 9 уровня. Но это мелочь. Легко можно обойти.
...
Рейтинг: 0 / 0
19.02.2005, 22:01
    #32924866
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
Я для выбора всех Node дерева, относящиеся к данному, использую простой алгоритм, основанный на стеке:
1. Помещаем в стек исходный Node
2. Цикл: пока в стеке что-то есть
3. Снимаем с верхушки стека Node и добавляем в дерево
4. Помещаем в стек все подчиненные Node относительно текущего
5. Конец цикла.

С уважением, Алексей.

P.S. Если интресно, могу подробный код опубликовать.
P.P.S Стек создан на основе класса Custom
...
Рейтинг: 0 / 0
19.02.2005, 23:36
    #32924893
Cyrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
ankr
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  * table TREE ( ID I, PARENTID I, NAME C(  40  )  )   
  m.id = <value>
  m.lev =  1 
  SELECT Id, parentid, name, m.lev as level FROM tree ;
   WHERE Id = m.id INTO CURSOR Items READWRITE 
   
  DO WHILE _TALLY >  0  
     m.lev = m.lev +  1  
     INSERT INTO Items (  id, parentid, name, level ) ;
      SELECT id, parentid, name, m.lev FROM tree ;
       WHERE parentid in (select id from Items ) ;
         AND id NOT in (select id from Items )
        
   ENDDO 

* simple :)
easier :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  ..
DO WHILE _TALLY >  0  
     INSERT INTO Items (  id, parentid, name, level ) ;
      SELECT id, parentid, name, m.lev +  1  FROM tree ;
       WHERE parentid in (select id from Items where level= m.lev) 
     m.lev = m.lev +  1  
        
   ENDDO 
...
Рейтинг: 0 / 0
21.02.2005, 10:14
    #32925466
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать дерево?
Aleksey-K

P.S. Если интресно, могу подробный код опубликовать.
P.P.S Стек создан на основе класса Custom

Очень интересно!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как скопировать дерево? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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