Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Очень нужен совет по реализации родословной / 4 сообщений из 4, страница 1 из 1
16.06.2009, 23:02
    #36044779
Дицентра
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень нужен совет по реализации родословной
Я новичек...
Нужно реализовать родословную поросят. Есть 2 таблицы (свинки и хряки) в которой внесены записи по всем хрюшкам, в ней же ссылки на родителей.

ng- хрюшка
m - мама
o - папа
родители берутся из этих же таблиц.


Так вот строить курсор чередой запросов получаеться долго. Необходимо быстро просматривать родословную с возможностью изменения данных. Поэтому строить общую таблицу в которой прописана родословная нерезонно, изменение внесенные в одну таблицу, повлекут изменения по другим строчкам.

Вобщем вопрос вот в чем. В плане реализации возможно открыть сразу несколько раз одну и туже таблицу (вернее представление из нее, потомучто требуется подвязать данные из других таблиц). Но получиться что нужно открыть 2 таблицы 7 раз и связать их друг с другом. Или это полный изврат?
...
Рейтинг: 0 / 0
17.06.2009, 05:51
    #36044943
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень нужен совет по реализации родословной
Дицентра,

Приведу свой любимый пример работы с деревьями.

Код: 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.
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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
*****************************************************************************************
*-* (IGEL)
*-* Данная хрень является демонстрашкой одного из методов построения деревянных структур.
*-* Запускайте, нажимайте периодически AnyKey
lnTimeOut =  10 
*-* (IGEL)  0 . Первоначальное заполнение курсора
USE IN SELECT ("TstCursor")
CREATE CURSOR TstCursor (Kod I, KodPar I NULL, Punkt C( 20 ), nLft I, nRgt I, nLev I)
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 1 , .NULL.)
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 2 , .NULL.)
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 3 ,  1 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 4 ,  1 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 5 ,  3 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 6 ,  5 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 7 ,  5 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 8 ,  5 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 9 ,  2 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 10 ,  2 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 11 ,  10 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 12 ,  10 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 13 ,  2 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 14 ,  11 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 15 ,  11 )
INSERT INTO TstCursor (Kod, KodPar) VALUES ( 16 ,  15 )
GO TOP
BROWSE LAST NOWAIT
WAIT WINDOW "Изначальный грид" TIMEOUT lnTimeOut

*-* (IGEL)  1 . 1  Строим иерархию...
IF BuildHierarhy(.NULL.,  0 ,  0 , "Kod", "KodPar") != RECCOUNT()* 2 
	=MESSAGEBOX("ERROR1",  0 + 16 , "ERROR")
	RETURN .F.
ENDIF
INDEX ON nLft TO SYS( 2015 )
GO TOP

*-* (IGEL)  1 . 2  Обход дерева (для построения дерева стек уже не нужен).
LOCAL lcKey, lnLev
lcKey = ""
lnLev =  0 
SCAN	
	DO CASE
		CASE lnLev < nLev AND !ISNULL(KodPar)
			lcKey = lcKey + TRANSFORM(KodPar) + "."
		CASE lnLev > nLev AND !EMPTY(lcKey) 
			IF nLev >  1 
				lcKey = LEFT(lcKey, AT(".", lcKey, nLev -  1 ))
			ELSE
				lcKey = ""
			ENDIF				
	ENDCASE
	lnLev = nLev
	REPLACE Punkt WITH lcKey + TRANSFORM(Kod)
ENDSCAN

GO TOP
BROWSE LAST NOWAIT
WAIT WINDOW "Построена иерархия" TIMEOUT lnTimeOut
*-* (IGEL)  2 . 1  Выборки хочу всех детей первого элемента
SELECT TstCursor
SET FILTER TO 
LOCATE FOR Kod =  1 
IF FOUND()
	lcFilterClause = TEXTMERGE([BETWEEN(nLft, <<nLft>>, <<nRgt>>)])
	SET FILTER TO &lcFilterClause
	GO TOP
	BROWSE LAST NOWAIT
	WAIT WINDOW "Тест 1. Хочу всех детей от родителя с кодом 1" TIMEOUT lnTimeOut
ENDIF
*-* (IGEL)  2 . 2  Выборки хочу всех родителей восьмого элемента
SELECT TstCursor
SET FILTER TO 
LOCATE FOR Kod =  8 
IF FOUND()
	lcFilterClause = TEXTMERGE([nLft <= <<nLft>> AND nRgt >= <<nRgt>>])
	SET FILTER TO &lcFilterClause
	GO TOP
	BROWSE LAST NOWAIT
	WAIT WINDOW "Тест 2. Хочу всех родителей элемента с кодом 8" TIMEOUT lnTimeOut
ENDIF
*-* (IGEL)  2 . 3  Для кода  11  хочу выбрать и родителей и детей, +/-  1  уровень
SELECT TstCursor
SET FILTER TO 
LOCATE FOR Kod =  11 
IF FOUND()
	lcFilterClause = TEXTMERGE([nRgt >= <<nLft>> AND nLft <= <<nRgt>> AND ABS(nLev - <<nLev>>) =  1 ])
	SET FILTER TO &lcFilterClause
	GO TOP
	BROWSE LAST NOWAIT
	WAIT WINDOW "Тест 3. Хочу всех родителей и детей элемента с кодом 11" TIMEOUT lnTimeOut
ENDIF



******************************************************************
* Один из не самых быстрых методов построения иерархии в курсоре.
FUNCTION BuildHierarhy
LPARAMETERS tuNode, tnCounter, tnLevel, tcKeyField, tcParField

IF tnLevel >  100 
	=MESSAGEBOX("Уровней иерархии более 100!!!",  0 + 16 , "Error")
	RETURN tnCounter
ENDIF
IF VARTYPE(tcParField)#"C" OR EMPTY(tcParField)
	tcParField = "KodPar"
ENDIF

LOCAL lcUslovie, lnRecno

IF ISNULL(tuNode)
	lcUslovie = TEXTMERGE("ISNULL(<<tcParField>>)")
ELSE
	lcUslovie = TEXTMERGE("<<tcParField>> == <<tuNode>>")
ENDIF

tnLevel = tnLevel +  1 

GO TOP
SCAN FOR &lcUslovie
	tnCounter = tnCounter +  1 
	REPLACE nLft WITH tnCounter, ;
			nLev WITH tnLevel
			
	lnRecno = RECNO()
	
	tnCounter = BuildHierarhy(&tcKeyField, tnCounter, tnLevel, tcKeyField, tcParField)
	
	IF lnRecno <= RECCOUNT()
		GOTO lnRecno
	ENDIF	
	tnCounter = tnCounter +  1 
	REPLACE nRgt WITH tnCounter
ENDSCAN


RETURN tnCounter
ENDFUNC

Вот как бы этот пример преобразовать для работы с двухголовыми деревьями ;)
...
Рейтинг: 0 / 0
17.06.2009, 09:50
    #36045114
Дицентра
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень нужен совет по реализации родословной
Kruchinin Pahan,

Спасибо, буду разбираться...
...
Рейтинг: 0 / 0
18.06.2009, 04:03
    #36047345
Мука
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень нужен совет по реализации родословной
Кода много, родословная не важная )
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Очень нужен совет по реализации родословной / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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