powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CA временной таблицы SQL
11 сообщений из 11, страница 1 из 1
CA временной таблицы SQL
    #34839076
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли создать курсор-адаптер временной таблицы 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
CA временной таблицы SQL
    #34839101
И что мешает испробовать уже имеющийся код?
...
Рейтинг: 0 / 0
CA временной таблицы SQL
    #34839134
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.И что мешает испробовать уже имеющийся код?
Что вы имеете в виду?
...
Рейтинг: 0 / 0
CA временной таблицы SQL
    #34839144
Фотография yss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нда уж ...
;-)))
...
Рейтинг: 0 / 0
CA временной таблицы SQL
    #34839153
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно... Когда я запускаю данный код, CursorFill() возвращает фелсе. Причина не известна. Возможно два варианта: где-то допущена ошибка; курсор-адаптер временной таблицы не возможен.
...
Рейтинг: 0 / 0
CA временной таблицы SQL
    #34839310
Возможно два варианта: где-то допущена ошибка; курсор-адаптер временной таблицы не возможен.
Ошибаетесь, возможны три варианта. Третий - сочетание первых двух.

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
CA временной таблицы SQL
    #34839529
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у меня - работает

Код: 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
CA временной таблицы SQL
    #34839558
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое интересное в том, что дома у меня работает, а вот на работе не сработало. Бум ковыряться.
...
Рейтинг: 0 / 0
CA временной таблицы SQL
    #34839842
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы не настраивать руками КАД
пример КАДа, который динам-ки настраивает сам себе все необх-е св-ва


подъем КАДа

Код: 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
CA временной таблицы SQL
    #34839849
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сохранение изменений

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


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

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


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