Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Доступ к локальному курсору / 8 сообщений из 8, страница 1 из 1
19.02.2005, 13:49
    #32924640
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к локальному курсору
Привет всем !
Кто подскажет способ, как добраться из методов формы с DataSession = 2 (Privat) к локальным курсорам (CREATE CURSOR...), созданным в другой форме с DataSession = 2 ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
19.02.2005, 14:38
    #32924665
Диченка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к локальному курсору
Aleksey-KПривет всем !
Кто подскажет способ, как добраться из методов формы с DataSession = 2 (Privat) к локальным курсорам (CREATE CURSOR...), созданным в другой форме с DataSession = 2 ?
С уважением, Алексей.

Напрямую - вроде бы никак. Есть два варианта - создавать временную таблицу на винте, с которой можно работать из любой формы либо, если у тебя фокс последних версий, ты можешь передавать курсоры между формами как xml-переменную.

Например:
Форма № 1 содержит в себе курсор, который нужно по каким-либо критериям изменить в форме №2 и вернуть обратно. В методе формы № 1 конвертируешь курсор в переменную с помощью = CURSORTOXML("Cursor","prmXML") и передаешь переменную prmXML в метод или проперти формы № 2. В форме № 2 в определенном методе принимаешь prmXML из первой формы и делаешь обратную операцию преобразования переменной в курсор с помощью команды CURSORTOXML(). Затем вносишь в курсор изменения и проделываешь точно такую же операцию по пересылке измененного курсора в форму № 1. Единственное но - на размер переменной имеется ограничение в 16 мегабайт, так что особо тяжелые по размеру курсоры передавать таким способом будет затруднительно. Но для небольших курсоров - этот способ подходит вполне.
...
Рейтинг: 0 / 0
19.02.2005, 14:42
    #32924668
Диченка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к локальному курсору
Диченко
Поправка - обратно из xml с помощью XMLTOCURSOR
...
Рейтинг: 0 / 0
19.02.2005, 14:43
    #32924669
kdanylo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к локальному курсору
Привет, можно так:
Код: plaintext
1.
SET DATASESSION TO  (_screen.activeform.datasessionid)
здесь я переключась на сессию данных активной формы.

Найти открытую форму по заголовку можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
local lni as integer
for lni =  1  to _screen.FormCount
if _screen.Forms(lni).Caption = MyKnownCaption
set datasession to (_screen.forms(lni).datasessionid)
exit
endif
endfor

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

Я бы посоветовал такого не делать а придумать другую архитектуру: например поместить нужную логику в методы формы, которая владеет необходимыми курсорами, дергать методы из другой формы и получать возвращаемые значения : хоть массив, хоть коллекцию , хоть XML.
...
Рейтинг: 0 / 0
19.02.2005, 14:56
    #32924683
Cyrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к локальному курсору
Код: 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.
LOCAL x, y
x = CREATEOBJECT("testform")
y = CREATEOBJECT("testform", x)
x.Show()
y.Show()
READ EVENTS

DEFINE CLASS testform AS form

	DataSession =  2 
	Name = "testform"

	ADD OBJECT grid1 AS grid WITH ;
		Height =  217 , ;
		Left =  12 , ;
		Top =  12 , ;
		Width =  349 , ;
		Name = "Grid1"

	PROCEDURE Init
		LPARAMETERS oForm
		IF VARTYPE(oForm)="O" AND !ISNULL(oForm)
			LOCAL ARRAY laData[ 1 ]
			LOCAL ARRAY laFields[ 1 ]
			LOCAL lnDS
			lnDS = this.DataSessionId
			SET DATASESSION TO oForm.DataSessionId
			=AFIELDS(laFields, "test")
			SELECT * FROM test INTO ARRAY laData
			SET DATASESSION TO lnDS
			CREATE CURSOR extern FROM ARRAY laFields
			APPEND FROM ARRAY laData
			SELECT a.id, a.test as own, b.test as extern ;
			FROM test a INNER JOIN extern b ON a.id = b.id ;
			INTO CURSOR new
			USE IN extern
			USE IN test
			WITH this.Grid1
				.ColumnCount =  3 
				.RecordSource = "new"
				WITH .Column3.Header1
					.Caption = "Extern"
					.Alignment =  2 
				ENDWITH 
			ENDWITH 
			this.AutoCenter = .T. 
		ELSE
			this.Grid1.RecordSource = "test"
		ENDIF 
		this.Caption = "DataSessionID: " + STR(this.DataSessionId)
	ENDPROC

	PROCEDURE Load
		CREATE CURSOR test (id i, test c( 10 ))
		FOR i =  1  TO  10 
			INSERT INTO test VALUES (i, SYS( 2015 ))
		ENDFOR 
		GO TOP 
	ENDPROC
ENDDEFINE
...
Рейтинг: 0 / 0
19.02.2005, 21:55
    #32924862
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к локальному курсору
Да..., в INIT-е у меня все тоже нормально работает :)
А попробуйте выдать команду SET DATESESSION TO ... не в конструкторе формы(метод INIT)... Привязки всех GRID-ов слетят.. (как kdanylo и справедливо отметил..)
Насчет XML, можно конечно, но тогда проще через временную таблицу: SELECT ... INTO TABLE...
Похоже, в VFP нет стандартных методов из одной DataSessionID добраться к данным другого DataSessionID
С уважением, Алексей.
...
Рейтинг: 0 / 0
19.02.2005, 23:17
    #32924884
Cyrus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к локальному курсору
Aleksey-KА попробуйте выдать команду SET DATESESSION TO ... не в конструкторе формы(метод INIT)... Привязки всех GRID-ов слетят.. (как kdanylo и справедливо отметил..)
1. Стандартное поведение поведение Grid, когда источник выпадает из области видимо. Не раз перетералось.
http://www.sql.ru/forum/actualthread.aspx?tid=154754&hl=recordsource#1272946

2. Можно бойтись и без прямого указания SET DATESESSION TO
Код: plaintext
1.
2.
3.
4.
5.
*!* Метод формы-источника
PROCEDURE Export
LPARAMETERS taFields, taData
	=AFIELDS(taFields, "test")
	SELECT * FROM test INTO ARRAY taData
ENDPROC
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
*!* Метод формы-получателя
PROCEDURE Import
LPARAMETERS oForm
IF VARTYPE(oForm)="O" AND !ISNULL(oForm)
	LOCAL ARRAY laData[ 1 ]
	LOCAL ARRAY laFields[ 1 ]
	oForm.Export(@laFields, @laData)
	CREATE CURSOR extern FROM ARRAY laFields
	APPEND FROM ARRAY laData
ENDIF 
ENDPROC
Код: plaintext
1.
2.
3.
4.
5.
6.
*!* Пример вызова
PROCEDURE Command1.Click
	thisform.Import(x)
	ACTIVATE SCREEN 
	SELECT a.id, a.name as own, b.name as extern ; 
 	FROM test a INNER JOIN extern b ON a.id = b.id 
ENDPROC
...
Рейтинг: 0 / 0
20.02.2005, 11:54
    #32925001
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к локальному курсору
Да.. можно и через массив, но мне удобнее через таблицу.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Доступ к локальному курсору / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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