Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Рекурсия / 6 сообщений из 6, страница 1 из 1
19.11.2014, 12:16
    #38810587
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия
Добрый день!
Вконец застрял... :(
Есть табличка на сервере - структура в виде дерева(полей на самом деле больше).

objects_app_id att_obj_id
4 0
18 0
17 0
17 0
17 0
17 0
17 0
37 0
38 0
39 0
39 0
39 0
39 37
39 38
39 4
17 39
44 0
44 0
17 18
53 0
53 0
44 53

Мне надо пробежаться только по куску дерева и загрузить в курсор данные.
Допустим в правом столбце значение 39. Потомки (они слева) являются родителями для других.
Выполнение прекращается, когда att_obj_id = 0
...
Рейтинг: 0 / 0
19.11.2014, 12:28
    #38810608
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия
Какое-то странное у тебя дерево. Обычно дерево хранят двумя полями ID, ParentID, где ID уникальный ключ, ParentID - ID родителя.
По твоему описанию objects_app_id должно быть ID, но оно не уникально, например для objects_app_id=39

Вобщем или это не дерево или не те поля смотришь.
...
Рейтинг: 0 / 0
19.11.2014, 12:48
    #38810643
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия
Не, дерево нормальное. На самом деле есть еще столбец - тип данных.

Смотрите для примера только по 39 коду
...
Рейтинг: 0 / 0
19.11.2014, 13:07
    #38810675
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия
Вроде поборол...

Нашел вот такое решение от ВладимирМ. Прямо как доктор прописал!

Код: sql
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.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Отчеты FoxPro всегда строятся как результат сканирования одной (главной) таблицы. Поэтому, в общем случае, сначала необходимо эту самую таблицу создать. Любым способом.

В данном случае, использование Select-SQL допустимо, но как вспомогательный механизм. Проще создать пустую временную таблицу и при помощи рекурсии ее заполнить.

Создавать курсор необходимо, чтобы выстроить записи в нужном порядке. При помощи индекса это решить очень сложно.

* Создаем курсор со структурой, повторяющей структуру исходной таблицы
* Плюс дополнительное поле, отображающее уровень вложенности
* относительно искомого узла
CREATE CURSOR curReport (IDprod I, IDParent I, ProdName C(50), IsProd L, Opisanie M, nLevel I)

* Код записи, для которой ищем все дочернии узлы
LOCAL lnBaseID
lnBaseID = 0

SELECT MyTab
LOCATE FOR IDprod = m.lnBaseID
IF FOUND() = .T.

	* Если необходимо, записываю информацию по искомому узлу
	INSERT INTO curReport (IDprod, IDParent, ProdName, IsProd, Opisanie, nLevel) ;
	VALUES ;
	(MyTab.IDprod, MyTab.IDParent, MyTab.ProdName, MyTab.IsProd, MyTab.Opisanie, 0)

	* Запуск рекурсии
	DO LoadNode WITH MyTab.IDprod, 0

ENDIF


* Рекурсивная функция
PROCEDURE LoadNode
LPARAMETERS tnParentID, tnLevel

* Увеличиваю уровень вложенности
tnLevel = m.tnLevel+1

LOCAL lnRecno
SELECT MyTab
SCAN FOR IDParent = m.tnParentID

	* Записываю информацию по найденному узлу
	INSERT INTO curReport (IDprod, IDParent, ProdName, IsProd, Opisanie, nLevel) ;
	VALUES ;
	(MyTab.IDprod, MyTab.IDParent, MyTab.ProdName, MyTab.IsProd, MyTab.Opisanie, m.tnLevel)

	* Сохранаяю текущий код записи до входа в рекурсию
	lnRecno = Recno()
	* Продолжение рекурсии
	DO LoadNode WITH MyTab.IDprod, m.tnLevel
	* Восстановление текущего положения указателя записи
	GO m.lnRecno

ENDSCAN

RETURN
 

В результате, должна получится временная таблица (курсор) с именем curReport, которая повторяет стркутуру исходной таблицы и содержит все дочернии узлы для записи с указанным кодом. Однако в отличии от основной таблицы здесь записи упорядочены (выстроены) в том порядке как они должны отображаться, если бы дерево было бы полностью раскрыто.

Плюс имеем поле nLevel, содержащее уровень вложенности (отступа) каждого узла от базового узла. Это поле понадобится для формирования древовидной структуры в отчете.

Теперь, можно строить отчет, взяв в качестве источника данных полученный курсор. По значению поля nLevel можно делать красивое оформление отчета, если это необходимо. 
...
Рейтинг: 0 / 0
19.11.2014, 13:26
    #38810707
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия
miv32Смотрите для примера только по 39 коду
его и смотрю, вот что вижу, например этот кусок
objects_app_idatt_obj_id39039371739
как он должен выглядеть после выборки?
Код: plaintext
1.
2.
3.
17
-39
-39
--37
Так?
...
Рейтинг: 0 / 0
19.11.2014, 14:21
    #38810794
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия
Вот так:

objects_app_id att_obj_id
17 39
39 37
37 0
39 38
38 0
39 4
4 0
39 0
39 0
39 0
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Рекурсия / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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