powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Рекурсия
6 сообщений из 6, страница 1 из 1
Рекурсия
    #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
Рекурсия
    #38810608
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое-то странное у тебя дерево. Обычно дерево хранят двумя полями ID, ParentID, где ID уникальный ключ, ParentID - ID родителя.
По твоему описанию objects_app_id должно быть ID, но оно не уникально, например для objects_app_id=39

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

Смотрите для примера только по 39 коду
...
Рейтинг: 0 / 0
Рекурсия
    #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
Рекурсия
    #38810707
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miv32Смотрите для примера только по 39 коду
его и смотрю, вот что вижу, например этот кусок
objects_app_idatt_obj_id39039371739
как он должен выглядеть после выборки?
Код: plaintext
1.
2.
3.
17
-39
-39
--37
Так?
...
Рейтинг: 0 / 0
Рекурсия
    #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
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Рекурсия
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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