Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CA временной таблицы SQL / 11 сообщений из 11, страница 1 из 1
01.10.2007, 17:50
    #34839076
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
Можно ли создать курсор-адаптер временной таблицы SQL?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQLEXEC(_Screen.nCon_DATD,[IF OBJECT_ID('Tempdb..#CurDoclist') IS NOT NULL DROP TABLE #CurDoclist])
SQLEXEC(_Screen.nCon_DATD,'SELECT * INTO #CurDoclist FROM DocList')

oMyCAD=CREATEOBJECT('CursorAdapter')
IF VARTYPE(oMyCAD)='O'
	WITH oMyCAD
		Alias='cDocList'
		.DataSourceType='ODBC'
		.DataSource=nHandle
		SelectCmd='SELECT doc_id, archive_id, filename FROM #CurDoclist'
		Tables='#CurDoclist'
		CursorSchema='doc_id i,archive_id i,filename v(80)'
		KeyFieldList='doc_id'
		UpdaTableFieldList='archive_id, filename'
		UpdateNameList='doc_id #CurDoclist.doc_id, archive_id #CurDoclist.archive_id, filename #CurDoclist.filename'
		IF !.CursorFill()
			RETURN
		ENDIF
	ENDWITH
ENDIF
...
Рейтинг: 0 / 0
01.10.2007, 17:57
    #34839101
CA временной таблицы SQL
И что мешает испробовать уже имеющийся код?
...
Рейтинг: 0 / 0
01.10.2007, 18:12
    #34839134
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
проходящий.И что мешает испробовать уже имеющийся код?
Что вы имеете в виду?
...
Рейтинг: 0 / 0
01.10.2007, 18:17
    #34839144
yss
yss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
нда уж ...
;-)))
...
Рейтинг: 0 / 0
01.10.2007, 18:21
    #34839153
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
Ясно... Когда я запускаю данный код, CursorFill() возвращает фелсе. Причина не известна. Возможно два варианта: где-то допущена ошибка; курсор-адаптер временной таблицы не возможен.
...
Рейтинг: 0 / 0
01.10.2007, 19:29
    #34839310
CA временной таблицы SQL
Возможно два варианта: где-то допущена ошибка; курсор-адаптер временной таблицы не возможен.
Ошибаетесь, возможны три варианта. Третий - сочетание первых двух.

1. Для начала, свойства адаптера не мешало бы предварять точкой:

Код: plaintext
1.
2.
3.
4.
5.
.SelectCmd='SELECT doc_id, archive_id, filename FROM #CurDoclist'
.Tables='#CurDoclist'
.CursorSchema='doc_id i,archive_id i,filename v(80)'
.KeyFieldList='doc_id'
.UpdaTableFieldList='archive_id, filename'
.UpdateNameList='doc_id #CurDoclist.doc_id, archive_id #CurDoclist.archive_id, filename #CurDoclist.filename'

2. Драйвер ODBC использует вызов sp_prepare для выполнения запросов и потому временные таблицы ему недоступны. Курсор_адаптер тут, похоже, не при чем, хотя это может кого-то и не радует. К тому же временные таблицы - это все-таки чисто серверные объекты и работа с ними разработчиками ODBC скорее всего и не предполагалась. Потому такие извраты лучше не использовать.
...
Рейтинг: 0 / 0
01.10.2007, 22:01
    #34839529
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
А у меня - работает

Код: 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.
PUBLIC nHandle
nHandle = _Screen.nCon_DATD

if  1 >SQLEXEC(nHandle,[IF OBJECT_ID('Tempdb..#CurDoclist') IS NOT NULL DROP TABLE #CurDoclist])
	=AERROR(aaa)
	set Step On 
	RETURN
endif

if  1 >SQLEXEC(nHandle,'CREATE TABLE #CurDoclist (doc_id int, archive_id int, filename VarChar(80))')
	=AERROR(aaa)
	set Step On 
	RETURN
endif

if  1 >SQLEXEC(nHandle,[INSERT INTO #CurDoclist (doc_id, archive_id, filename) VALUES ( 1 ,  2 , 'Пример')])
	=AERROR(aaa)
	set Step On 
	RETURN
endif

oMyCAD=CREATEOBJECT('CursorAdapter')
IF VARTYPE(oMyCAD)='O'
	WITH oMyCAD
		.Alias='cDocList'
		.DataSourceType='ODBC'
		.DataSource=nHandle
		.SelectCmd='SELECT doc_id, archive_id, filename FROM #CurDoclist'
		.Tables='#CurDoclist'
		.CursorSchema='doc_id i,archive_id i,filename v(80)'
		.KeyFieldList='doc_id'
		.UpdaTableFieldList='archive_id, filename'
		.UpdateNameList='doc_id #CurDoclist.doc_id, archive_id #CurDoclist.archive_id, filename #CurDoclist.filename'
		IF .CursorFill()
			select cDocList
			browse
		ELSE
			=AERROR(aaa)
			RETURN
		ENDIF
	ENDWITH
ENDIF

Используйте AERROR() для уточнения причины ошибки. Как правило, любые команды связанные с сервером, обязательно сообщаяют в чем причина не удачи.

Как вариант, Вы используете другое соединение. Ведь нигде в коде не показано, что значение переменной nHandle равно значению свойства _Screen.nCon_DATD

Для CursorAdapter сугубо "фиолетово", что там за источник данных используется. Он просто посылает формально сконструированные строки на сервер. А есть там кому их принять и обработать его уже не касается.
...
Рейтинг: 0 / 0
01.10.2007, 22:26
    #34839558
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
Самое интересное в том, что дома у меня работает, а вот на работе не сработало. Бум ковыряться.
...
Рейтинг: 0 / 0
02.10.2007, 09:18
    #34839842
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
чтобы не настраивать руками КАД
пример КАДа, который динам-ки настраивает сам себе все необх-е св-ва


подъем КАДа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
local loReportCad 
loReportCad  =  createobject('_cursoradapter',	;
		              '#tt',	;	&& таблица на сервере
			 'Id',	;	&& ключь-линк в таблице
			 'TT,NOTE', 	;	&& обновляемые поля в таблице
			 .f.,		;	&& схема - преобразов-е типов
			 '1=2' )				&& условие в запросе



Код: 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.
DEFINE CLASS _cursoradapter AS cursoradapter


	Height =  22 
	Width =  23 
	BufferModeOverride =  5 
	DataSourceType = "ODBC"
	FetchSize = - 1 
	WhereType =  1 
	MapVarchar = .T.
	UseTransactions = .F.
	nconnection = .F.
	Name = "_cursoradapter"


	PROCEDURE setproperties
		lparameters tcSql_updateTableName, tcCADkeyFieldList, tcCADupdatableFieldList, tcCADcursorSchema, tcWhere
		with this
			if !.CheckConnection()
				return .f.
			endif
			.DataSource         = .nConnection
			text to .SelectCmd noshow textmerge pretext  15 
				select <<tcCADkeyFieldList>>, <<tcCADupdatableFieldList>>
					from <<tcSql_updateTableName>> 
					<<iif(!empty(tcWhere), 'WHERE '+tcWhere, '')>>
			endtext
			.Tables             = tcSql_updateTableName
			.keyFieldList		= tcCADkeyFieldList
			.UpdatableFieldList = tcCADupdatableFieldList && строка в виде 'Fld1, Fld2'
			if !empty(tcCADcursorSchema)
				.cursorsChema 	= tcCADcursorSchema   && строка в виде 'Fld c(16)'
			endif
			local laFieldsArr( 1 ), lnField, lcField 
			* формируем строку
			.updateNameList 	=  tcCADkeyFieldList + ' ' + .Tables+'.'+tcCADkeyFieldList
			for lnField= 1  to alines(laFieldsArr,.UpdatableFieldList,',')
				lcField = alltrim(laFieldsArr(lnField))
				if !empty(lcField)
					.updateNameList = .updateNameList +iif(!empty(.updateNameList),', ','') + lcField + ' ' + .Tables+'.'+lcField
				endif
			endfor
			.UseCursorSchema = !empty(.cursorschema)
		endwith
	ENDPROC


	HIDDEN PROCEDURE checkconnection
		* сейчас создаем доп.коннект
		* но затем нужно забуферить коннект
		* на постоянный
		with this
			if empty(.nConnection)
				.nConnection = sqlstringconnect(бубен.sql_sqlgetprop('ConnectString'))
				if .nConnection> 0 
					sqlsetprop(.nConnection,"Asynchronous",.f.)
					sqlsetprop(.nConnection,"BatchMode",.t.)
				else 
					return .f.
				endif 
			endif
		endwith
		return .t.
	ENDPROC


	PROCEDURE savecursor
		with this
			if !empty(getNextModified( 0 ,.Alias))
				msg('Ждите ... Происходит обновление данных на сервере ...')
				* в курсоре что-то потрогали
				sqlsetprop(.nConnection, 'Transactions',  2 )
				if !tableupdate(.t.,.t.,.Alias)
					* ошибка, не смогли сохранить изменения на сервер
					sqlrollback(.nConnection)
					msg()
					local laErrors( 1 ), lcErrMessage
					=aerror(laErrors)
					text to lcErrMessage noshow pretext  7 
						КАД. Ошибка сохранения изменений в таблице <<.Tables>>.
						<<iif(alen(laErrors)>= 2 ,laErrors[ 2 ],'Ошибка не идентифицирована.')>>
					endtext
					messagebox(lcErrMessage, 16 ,'Класс КА')
					return .f.
				else &&!tableupdate(.t.,.t.,.Alias)
					* все хорошо, сохранились
					sqlcommit(.nConnection)
				endif
			else
				* в курсоре ничего не трогали - нечего обновлять на сервере
				return .f.
			endif 
		endwith 
		msg('Данные на сервере обновлены успешно.')
		return .t.
	ENDPROC


	PROCEDURE Destroy
		with this
			if !empty(.Alias)
				use in select(.Alias)
			endif
			if !empty(.nConnection)
				* убиваем соединение, созданное для КАДа
				sqldisconnect(.nConnection)
			endif 
		endwith
	ENDPROC


	PROCEDURE Init
		lparameters tcSql_updateTableName, tcCADkeyFieldList, tcCADupdatableFieldList, tcCADcursorSchema, tcWhere
		with this
			.Alias = 'Cad'+Sys( 2015 )
			if  !empty(tcSql_updateTableName) and !empty(tcCADkeyFieldList) and !empty(tcCADupdatableFieldList)
				if .SetProperties(tcSql_updateTableName, tcCADkeyFieldList, tcCADupdatableFieldList, tcCADcursorSchema, tcWhere)
					if !.CursorFill(!empty(.CursorSchema))
						messagebox('Ошибка загрузки КА!', 16 ,'Класс КА')
						return .f.
					endif
				endif
			endif
		endwith
		return .t.
	ENDPROC


ENDDEFINE

...
Рейтинг: 0 / 0
02.10.2007, 09:24
    #34839849
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
сохранение изменений

Код: plaintext
1.
2.
3.
4.
5.
if vartype(loReportCad)='O'
     if !loReportCad.SaveCursor()
        return - 1 
     endif
endif


приведен самый простой пример,
котрый показывает как дин-ки настроить
св-ва классу в зависим-ти от переданных параметров

имеются примеры (М.Касланд), которые демонстрируют
автом-е создание подготовленных классов в засвис-ти
от стр-ры таблиц, которые при мимним-й доработке
возможно применить для создания виз-х построителей КАДов
...
Рейтинг: 0 / 0
02.10.2007, 10:46
    #34840058
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CA временной таблицы SQL
ВладимирМКак вариант, Вы используете другое соединение. Ведь нигде в коде не показано, что значение переменной nHandle равно значению свойства _Screen.nCon_DATD
Причина именно в этом. Для каждого CA я создавал свой дискриптор соединения, поэтому временную таблицу он не видел. Убедился что курсорадаптер одинаково работает с обычными и временными таблицами SQL-сервер.
ВладимирМИспользуйте AERROR() для уточнения причины ошибки. Как правило, любые команды связанные с сервером, обязательно сообщаяют в чем причина не удачи.nCon_DATD
это очень кстати. Большое спасибо!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CA временной таблицы SQL / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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