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

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

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

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

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

Это выборка из иерархического списка с использованием UDF-функций.
...
Рейтинг: 0 / 0
Как скопировать дерево?
    #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
Как скопировать дерево?
    #32924531
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
Как скопировать дерево?
    #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
Как скопировать дерево?
    #32924619
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
Как скопировать дерево?
    #32924624
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
Как скопировать дерево?
    #32924854
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сути, ankr предложил вложенный цикл. Просто результат промежуточных расчетов сохраняется в итоговой выборке.

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

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

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

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

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

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

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

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

P.S. Если интресно, могу подробный код опубликовать.
P.P.S Стек создан на основе класса Custom
...
Рейтинг: 0 / 0
Как скопировать дерево?
    #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
Как скопировать дерево?
    #32925466
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K

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

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


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