powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с добавлением данных через курсорадаптер
57 сообщений из 57, показаны все 3 страниц
Помогите с добавлением данных через курсорадаптер
    #37348408
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаю курсорадаптер и отображаю данные в grid:

Код: 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.
WITH THIS

	SET STEP ON 
	
	SET MULTILOCKS ON 
	
	.AddProperty('lo_CA')
	.lo_CA = CREATEOBJECT("CursorAdapter")
	.lo_CA.Alias='fin'
	.lo_CA.DataSourceType = 'ODBC'
	.lo_CA.DataSource=PubCon
	.lo_CA.fetchsize=- 1 
	.lo_CA.FetchAsNeeded=.f.
	.lo_CA.SelectCmd = 'select * from test_fin order by fin_id, god'
	.lo_CA.Tables = 'count.dbo.test_fin'
	.lo_CA.BufferModeOverride =  3 
	.lo_CA.AllowUpdate=.t.
	.lo_CA.UpdateType= 2 
	.lo_CA.keyFieldList = 'fin_id'	

	IF .lo_CA.AutoOpen()=.t.
	
			
	.grid1.recordsource=.lo_CA.Alias
	
	
		.lo_CA.UpdateNameList=" LPUCODE fin.LPUCODE, DATE fin.DATE, SUM fin.SUM, PRIM fin.PRIM, SKIND fin.SKIND, NDOC fin.NDOC, RF fin.RF, GOD fin.GOD, PRIZ fin.PRIZ, OSTATOK fin.OSTATOK"
		.lo_CA.UpdatableFieldList=" LPUCODE, DATE, SUM, PRIM, SKIND, NDOC, RF, GOD, PRIZ, OSTATOK"
		
		.lo_CA.UpdateCmdDataSourceType="ODBC"
		.lo_CA.UpdateCmdDataSource=PubCon

	ENDIF
	
	
	ELSE
		MESSAGEBOX('Произошла ошибка при создании курсорадаптера')		
	ENDIF 
ENDWITH

Затем в click() кнопки пишу
APPEND BLANK
TABLEUPDATE()

sqlsetprop(PubCon, 'Transactions', 2)

if !tableupdate(.t.,.t.,.lo_CA.alias)
sqlrollback(PubCon)
aerror(laErrors)
messagebox(iif(type('laErrors[2]')='C',laErrors[2],'Неопознанная ошибка!'),16,'Ошибка')
else
sqlcommit(PubCon)
.lo_CA.CursorRefresh()
.SetFocus()
ENDIF

Подскажите что не так делаю, как правильно данные добавить?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37348512
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМ,

ошибку мы должны отгадать? Или она только для лохов пишется?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37348523
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SizovНадеждаМ,

ошибку мы должны отгадать? Или она только для лохов пишется?

а как ты ее отгадаешь?

там написано TABLEUPDATE()

буфер сброшен без анализа


я вот одно не понимаю: реальные ли люди пишут на данном форуме?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350065
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря я вобще запуталась с курсорадаптером.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350087
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМ,

Пока можно сказать, что в вашем коде один ENDIF лишний
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350132
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNG,

Это да, увидела.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350212
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не могу отловить ошибку
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350234
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
if tableupdate(.t.,.t.,.lo_CA.alias)<>.t.
sqlrollback(PubCon)
aerror(laErrors)
messagebox(iif(type('laErrors[2]')='C',laErrors[2],'Íåîïîçíàííàÿ îøèáêà!'),16,'Îøèáêà')

не отлавливается ошибка. tableupdate(.t.,.t.,.lo_CA.alias) =.t. получается.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350339
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМ tableupdate(.t.,.t.,.lo_CA.alias) =.t. получается.

перед этой командой какой код у Вас в кнопке?

вот это у Вас написано?
Код: plaintext
1.
2.
3.
4.
Затем в click() кнопки пишу 
APPEND BLANK
TABLEUPDATE()

...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350905
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350909
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоесть было написано.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350910
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМif tableupdate(.t.,.t.,.lo_CA.alias)<>.t.
sqlrollback(PubCon)
aerror(laErrors)
messagebox(iif(type('laErrors[2]')='C',laErrors[2],'Íåîïîçíàííàÿ îøèáêà!'),16,'Îøèáêà')

не отлавливается ошибка. tableupdate(.t.,.t.,.lo_CA.alias) =.t. получается.
Проверяется ошибка функции sqlrollback(). Оно так и задумано? или все-таки aerror() надо перед sqlrollback() сделать?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350912
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас добавила еще одну кнопку, по клику которой просто пустая строка появляется в grid.

Код: plaintext
1.
2.
3.
4.
5.
WITH this.parent.grid1
	Select (.recordsource)
	Append Blank
	.setFocus()
EndWith
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350914
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Нет, не задумано. Вы правы.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350917
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И надо ли тут sqlrollback() ?
sqlrollback() откатывает на сервере изменения сделанные в текущей транзакции.
Т.к. tableupdate() не сработал - сервер изменения не принял, т.е. в базе ничего не менялось, т.е. имеем курсор в котором есть изменения для сохранения на сервер. Для возврата курсора в исходное состояние надо использовать tablerevert()
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350924
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перечитал топик, вопросы возникли:
НадеждаМsqlsetprop(PubCon, 'Transactions', 2)
if !tableupdate(.t.,.t.,.lo_CA.alias)
sqlrollback(PubCon)
else
sqlcommit(PubCon)
ENDIF
Зачем вообще вручную рулить транзакциями? Нужны проблемы с блокировками на сервере?

НадеждаМif tableupdate(.t.,.t.,.lo_CA.alias)<>.t.
sqlrollback(PubCon)
aerror(laErrors)
messagebox(iif(type('laErrors[2]')='C',laErrors[2],'Íåîïîçíàííàÿ îøèáêà!'),16,'Îøèáêà')

не отлавливается ошибка. tableupdate(.t.,.t.,.lo_CA.alias) =.t. получается.
Если tableupdate(.t.,.t.,.lo_CA.alias) =.t. то в чем вообще ошибка? .t. это значит все на сервер успешно сохранилось.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350961
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТ.к. tableupdate() не сработал - сервер изменения не принял, т.е. в базе ничего не менялось,

вай ит из?

если буфериз-я табличная, в курсор добавили 2 записи, и если 1 запись легла, а вторая нет?

ну или триггер какой хитрый на инсерт, апдейт и т.д.?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37350965
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗачем вообще вручную рулить транзакциями? Нужны проблемы с блокировками на сервере?


а как ими рулить?

да еще и учитывая косяки в рантайме относительно св-ва UseTransactions.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351011
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую BufferModeOverride = 3 - Мягкую буферизация строк.

Записи я добвляю по одной. Вроде как tableupdate () = .t., только понять не могу почему в таблице нет добавляемых данных.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351031
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимоDima TТ.к. tableupdate() не сработал - сервер изменения не принял, т.е. в базе ничего не менялось,

вай ит из?

если буфериз-я табличная, в курсор добавили 2 записи, и если 1 запись легла, а вторая нет?

ну или триггер какой хитрый на инсерт, апдейт и т.д.?
А фокс (по дефолтным настройкам) апдейты разве не в одной транзакции сервера делает? Второй не пройдет - первый откатиться вместе с изменениями хитрых триггеров и т.п.

прошелмимоDima TЗачем вообще вручную рулить транзакциями? Нужны проблемы с блокировками на сервере?


а как ими рулить?

да еще и учитывая косяки в рантайме относительно св-ва UseTransactions.
В простых случаях оно само разрулится. Любое изменение MS-SQL оборачивает в транзакцию, другое дело кто ее закрывает, сам сервер автоматом, фокс где-то во внутренностях КА, либо явно в коде прописывать.
Зачем велосипед усложнять на простых конструкциях? Забыли/пропустили в одном месте sqlcommit() вставить и висит база заблокированная транзакцией, остальное у юзера работает как вложенное в эту транзакцию, а по закрытию фокса транзакция откатывается, т.к. этот sqlcommit() никто не дает.
Согласен что для изменения нескольких связанных таблиц нужна транзакция, но тут нет нескольких таблиц.

Лично я предпочитаю явно открывать транзакцию для сложных случаев. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
if SQLEXEC(SQLhandle, 'begin tran') >  0 
   ... тут куча TABLEUPDATE() 
   if <все нормально>
      SQLEXEC(SQLhandle, 'commit tran')
   else
      SQLEXEC(SQLhandle, 'rollback tran')
   endif
endif
PS описал примерно, реально это в объект обернуто, который всегда закроет транзакцию: принудительно или автоматом при уничтожении этого объекта.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351079
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас добавила пустую строку и сделала browse, данные в курсорадаптере есть.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351190
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМсейчас добавила пустую строку и сделала browse, данные в курсорадаптере есть.
Поздравляю. А если попробовать непустые строки добавлять? После APPEND BLANK заполнить запись REPL ... а потом уже сохранять.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351253
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

не получается
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351352
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: НадеждаМ
> не получается


Очень информативно

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351623
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Мне надо чтобы пользователь мог в грид добавить новую строку и заполнить ее своими данными.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351793
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавляю заполненную строку. В коде click() кнопки "Добавить":

Код: 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.
WITH this.parent.grid1
SET STEP ON 

*IF USED('fin')
	Select (.recordsource)

*SELECT fin
	Append Blank
	
	TABLEUPDATE()
							
	replace lpucode with  1 , ;
		    date WITH CTOD(''),;
		    sum WITH  1 ,;
		    prim WITH '1',;
		    skind with  1 , ;
            ndoc with  1 , ;
            rf with '1',;
            god WITH  2011 ,;
            priz WITH  1 ,;
            paydate WITH CTOD(''),;
            paynum WITH  1 ,;
            ostatok WITH  1 ;
			

	endif
EndWith

В гриде появилась строка. Далее командой browse проверяю что в курсорадаптере.

Далее пытаюсь сохранить

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH this.parent
if empty(getnextmodified( 0 ))
	MESSAGEBOX('Èçìåíåíèé íåò')

ELSE
	messagebox("Èìåþòñÿ èçìåíåíèÿ. ", 16 )
  
if !tableupdate(.t.,.t.,this.parent.lo_Ca.Alias)
	aerror(lArr)
    messagebox(lArr( 2 ))
else
    this.parent.lo_Ca.cursorrefresh()
    this.parent.grid1.SetFocus()
ENDIF

endif
endwith


После cursorrefresh() строка исчезает.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351852
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМДобавляю заполненную строку. В коде click() кнопки "Добавить":

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH this.parent.grid1
SET STEP ON 

*IF USED('fin')
	Select (.recordsource)

*SELECT fin
	Append Blank
	
	TABLEUPDATE()							
...

В гриде появилась строка. Далее командой browse проверяю что в курсорадаптере.

Далее пытаюсь сохранить Ошибаетесь, Вы уже сохранили. И не проверили Ваше сохранение. Внимательно смотрим последнюю строку процитированного кода. Зачем там TableUpdate()?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37351880
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov,

Тоесть мне вместо tableupdate() нужно вставить эту проверку?:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if empty(getnextmodified( 0 ))
		MESSAGEBOX('Èçìåíåíèé íåò')
	ELSE
		messagebox("Èìåþòñÿ èçìåíåíèÿ.", 16 )
  
		if !tableupdate(.t.,.t.,this.parent.lo_Ca.Alias)
			aerror(lArr)
	    	messagebox(lArr( 2 ))
		else
    		this.parent.lo_Ca.cursorrefresh()
	    	this.parent.grid1.SetFocus()
		ENDIF

	endif
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37352061
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМДобавляю заполненную строку. В коде click() кнопки "Добавить":

Код: 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.
WITH this.parent.grid1
SET STEP ON 

*IF USED('fin')
	Select (.recordsource)

*SELECT fin
	Append Blank
	
	TABLEUPDATE() && Вот Ваша попытка сохранения, 
 && которую Вы не проверяете и которая скорее всего обламывается из-за каких-то ограничений
 && Поэтому все дальнейшие действия происходят в локальном буфере и никакого отношения к серверу не имеют
							
	replace lpucode with  1 , ;
		    date WITH CTOD(''),;
		    sum WITH  1 ,;
		    prim WITH '1',;
		    skind with  1 , ;
            ndoc with  1 , ;
            rf with '1',;
            god WITH  2011 ,;
            priz WITH  1 ,;
            paydate WITH CTOD(''),;
            paynum WITH  1 ,;
            ostatok WITH  1 ;
			
 * TABLEUPDATE() && Как вариант можно перенести сюда сохранение записи, после того как Вы заполните её 
 && какими-то данными, которые не будут противоречить констрейнам в таблице и строка вставится в базу
	endif
EndWith
В гриде появилась строка. Далее командой browse проверяю что в курсорадаптере.
Строка появилась потому что это локальный курсор, а исчезла после cursorrefresh() потому, что в базе этой записи не появлялось.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37352129
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМSergey Sizov,

Тоесть мне вместо tableupdate() нужно вставить эту проверку?:
ЗАЧЕМ?
1. Зачем сразу поле добавления пустой записи проверять наличие изменений в курсоре? А добавление не есть изменение?
2. Зачем на сервер гнать пустую запись? Потом ее заполнять и опять изменения гнать на сервер?
Кстати, сколько уже пустых записей туда загнали? А допустима ли на сервере пустая запись?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37352841
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SizovНадеждаМSergey Sizov,

Тоесть мне вместо tableupdate() нужно вставить эту проверку?:
ЗАЧЕМ?
1. Зачем сразу поле добавления пустой записи проверять наличие изменений в курсоре? А добавление не есть изменение?
2. Зачем на сервер гнать пустую запись? Потом ее заполнять и опять изменения гнать на сервер?
Кстати, сколько уже пустых записей туда загнали? А допустима ли на сервере пустая запись?

1. согласна.
2. так задумано природой :).
3. Пустая запись допустима, сколько их там, не могу сказать.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37352924
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ простых случаях оно само разрулится.

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

Dima TЛично я предпочитаю явно открывать транзакцию для сложных случаев. Примерно так:


предпочитайте. эти команды
sqlsetprop()
sqlcommit()
sqlrollback()

делают то-же самое
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37352927
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМ
Append Blank

TABLEUPDATE()



зачем?

зачем Вы суете везде где надо и не надо?

еще раз вопрос: Вы реальный человек или это обладателям ресурса нечем заняться и
так поддерживается активность на умирающем форуме?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37352984
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимоНадеждаМ Append Blank

TABLEUPDATE()



зачем?

зачем Вы суете везде где надо и не надо?

еще раз вопрос: Вы реальный человек или это обладателям ресурса нечем заняться и
так поддерживается активность на умирающем форуме?

Я просто не понимаю надо оно или нет и куда его сунуть. Конечно я реальный человек и реальный нуб.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37353115
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМЯ просто не понимаю надо оно или нет и куда его сунуть.

гмм... пальцы в розетку тоже "суете" ?

с примерами какими-то игрались? смотрели?

классически то делается так:

изменения на сервер отправлять нужно единожды, когда уже все ввели, изменили и т.д.
пробуем "сохраняться" и проверяем результат.

не получилось - откатываемся до момента начала сохранения,
иначе - ладушки - сообщаем об успехе.

что не понятно в таком принципе работы посредством буфера ?
зачем этот принцип в Вашем случае необходимо ставить "на уши" ?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37354667
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМЯ просто не понимаю надо оно или нет и куда его сунуть.
Физически, данные находятся на SQL-сервере. CursorAdapter посылает запрос к серверу и получает из него выборку , которая физически хранится уже у клиента. Другими словами, то, что отображает CursorAdapter - не есть то, что реально хранится на SQL-сервере. Это уже другая (физически другая) таблица.

Следовательно, все манипуляции с CursorAdapter - это манипуляции с локальными данными, хранящимися на машине клиента. Чтобы перенести изменения, сделанные на клиенте на SQL-сервер необходимо выполнить ряд операций. Ну, чтобы не "заморачиваться" считаем, что надо дать команду TableUpdate(). Хотя, возможны варианты, но сейчас не будем углубляться...

Чтобы понять дальнейшие рассуждения, еще раз напомню, что у нас есть.

- Есть некий курсор на клиенте, как результат открытия и наполнения CursorAdapter
- Есть некая таблица на SQL-сервере, которая послужила источником данных для наполнения курсора на клиенте

Обращаю особое внимание - это две таблицы между собой никак не связаны. Т.е. вообще. Это две разные (физически разные) таблицы.

Теперь, ставим себя на место разработчиков FoxPro. Есть две таблицы. Необходимо перенести изменения, сделанные в одной из этих таблиц (CursorAdapter) в другую таблицу (SQL-сервер). Как это сделать?

Собственно, существуют всего 3 команды, которые это и делают

- Вставка новой записи - Insert-SQL
- Удаление существующей записи - Delete-SQL
- Изменение существующей записи - Update-SQL

Это значит, что после внесения изменения в CursorAdapter по команду TableUpdate() формируется одна из указанных команд, которая и переносит изменения на SQL-сервер.

Что произойдет, если сделать вот это

Код: plaintext
1.
2.
APPEND BLANK
TableUpdate()

Ну, очевидно, первая команда создаст новую пустую запись в CursorAdapter, а вторая команда попытается сформировать команду Insert-SQL, чтобы передать ее на SQL-сервер и создать там новую строку . А сможет она это сделать?

Напомню, что синтаксис команды Insert-SQL выглядит следующим образом

Код: plaintext
INSERT INTO myTable (Field1, Field2, ...) VALUES (Value1, Value2, ...)

Т.е. для успешного формирования (создания) команды Insert-SQL необходимо:

- Имя таблицы, в которую пойдет вставка
- Имена полей, значение которых будет записано
- Значения для наполнения указанных полей

FoxPro, по умолчанию, пытается оптимизировать формируемые команды. Т.е., как правило, он передает на SQL-сервер только то, что было введено. Если в новой записи CursorAdapter какое-то поле не было заполнено, то это поле не попадет в список полей, формирующих команду Insert-SQL. Зачем передавать "пустоту"?

Это все хорошо работает, до тех пор, пока есть хотя бы одно значение. А что передавать, если еще ни одно поле не было заполнено? Чисто формально, получится вот такая команда

Код: plaintext
INSERT INTO myTable () VALUES ()

Т.е. просто нет ни списка полей, ни значений. Ведь на момент подачи команды TableUpdate() ни одно из полей еще не было изменено. Естественно, что подобная команда вызовет синтаксическую ошибку. Невозможно выполнить такую команду.

В принципе, если бы Вы поставили проверку успешности выполнения команды TableUpdate(), то сразу же и получили бы сообщение об ошибке о том, что невозможно сформировать "пустую" команду Insert-SQL
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37359653
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чего-то я все-таки недопонимаю...

в ините формы:
WITH THIS

SET MULTILOCKS ON

.AddProperty('lo_CA')
.lo_CA = CREATEOBJECT("CursorAdapter")
.lo_CA.Alias='fin'
.lo_CA.DataSourceType = 'ODBC'
.lo_CA.DataSource=PubCon
.lo_Ca.fetchsize=-1
.lo_ca.FetchAsNeeded=.f.
.lo_CA.SelectCmd = 'select * from test_fin2 order by fin_id, god'

.lo_CA.Tables = 'test_fin2'
.lo_CA.BufferModeOverride = 3
.lo_CA.AllowUpdate=.t.
.lo_CA.AllowInsert=.t.
.lo_CA.UpdateType=1
.lo_CA.keyFieldList = 'fin_id'

.lo_CA.UpdateNameList=" LPUCODE fin.LPUCODE, DATE fin.DATE, SUM fin.SUM, PRIM fin.PRIM, SKIND fin.SKIND, NDOC fin.NDOC, RF fin.RF, GOD fin.GOD, PRIZ fin.PRIZ, OSTATOK fin.OSTATOK"
.lo_CA.UpdatableFieldList=" LPUCODE, DATE, SUM, PRIM, SKIND, NDOC, RF, GOD, PRIZ, OSTATOK"


IF .lo_CA.AutoOpen()=.t.
.grid1.recordsource=.lo_CA.Alias

ELSE
MESSAGEBOX('Ïðîèçîøëà îøèáêà ïðè ñîçäàíèè êóðñîðàäàïòåðà')
ENDIF
ENDWITH

в кнопке:

Код: 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.
WITH this.parent.grid1
SET STEP ON 
	Select (.recordsource)
	Append Blank
	
								
	REPLACE lpucode with  1 , ;
		    date WITH CTOD(''),;
		    sum WITH  1 ,;
		    prim WITH '1',;
		    skind with  1 , ;
            ndoc with  1 , ;
            rf with '1',;
            god WITH  2011 ,;
            priz WITH  1 ,;
            paydate WITH CTOD(''),;
            paynum WITH  1 ,;
            ostatok WITH  1 ;
			
	 TABLEUPDATE() 

if TableUpdate(.T.) = .F.
* Ïðîèçîøëà îøèáêà. Óòî÷íÿåì ïðè÷èíó îøèáêè
Local laError( 1 )
=AError(laError)
MessageBox(laError( 2 ) + ' ' + laError(3))
else
	*	sqlcommit(pubcon)
	    .parent.lo_CA.CursorRefresh()
	    .SetFocus()
endif 
*!*	endif
  
EndWith
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37359707
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: НадеждаМ
> чего-то я все-таки недопонимаю...


Вопрос то в чем? :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37359712
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМчего-то я все-таки недопонимаю...


TABLEUPDATE()


а мне кажется, что просто "троллите".
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37359718
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странный код:
НадеждаМ
Код: plaintext
1.
2.
3.
4.
5.
...			
	 TABLEUPDATE() 

if TableUpdate(.T.) = .F.
...

первый TABLEUPDATE() тут не нужен
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37361305
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://forum.foxclub.ru/read.php?29,527868

натолкну на мысль.

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

http://msdn.microsoft.com/ru-ru/library/ms181091.aspx

покажите нам трейс
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #37368603
_Brroe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очевидно,
что не хватает
прописанного поля in_id (keyFieldList)
в строках UpdateNameList и UpdatableFieldList.
Без этого обновление работать не будет.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Помогите с добавлением данных через курсорадаптер
    #39396272
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток

Данный топ нашел по ключевым CAD TABLEUPDATE синтаксическая ошибка, и решил написать здесь.
Существовала много лет обертка обновления таблиц кадом которая без проблем работала и сам туда давно не лазил(и основательно забыл, что там да как делал)- и тут перестала
в связи с этим 1й Вопрос: кроме

If !tableupdate(.....)
...=aerror(...)

есть возможность чуть поконкретней узнать что "не нравится". "синтаксическая ошибка"-не о чем, облазил все что можно и последняя догадка:"А хрен его знает как tableupdate вообще обновляет, а у меня в источниках есть поля с именами group и sort - может он их за ключевые слова перепутает"- сработала, переименовав поля все заработало.
2й вопрос:
где бы поподробней прочитать tableupdate- где и откуда что берет, как "действует"
Грузить общество своими тараканами(исходниками)- не хочется, тем более довольно много нагромождений о которых и сам подзабыл зачем. Собирает нормально, а обновляет при отсутствии полей которые можно воспринять за ключевое, те надо еще tableupdate покататься - дайте ссылку или что еще плиз
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39396315
rock-n-rollв связи с этим 1й Вопрос: кроме

If !tableupdate(.....)
...=aerror(...)

есть возможность чуть поконкретней узнать что "не нравится". "синтаксическая ошибка"-не о чем, Надо просто научиться читать всё сообщение, а не отдельные его части. В частности, обращать внимание на номер фоксоыой ошибки. Если номер 1526 - ругается сервер, иначе - фокс. Тогда и ясно будет кто и на что ругается.2й вопрос:
где бы поподробней прочитать tableupdate- где и откуда что берет, как "действует"Использует стандартный механизи буферизации таблиц, ищет изменения и сочиняет по ним команды insert/delete/update, которые и отсылает на сервер.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39396335
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
првильный проходящий.rock-n-rollв связи с этим 1й Вопрос: кроме

If !tableupdate(.....)
...=aerror(...)

есть возможность чуть поконкретней узнать что "не нравится". "синтаксическая ошибка"-не о чем, Надо просто научиться читать всё сообщение, а не отдельные его части. В частности, обращать внимание на номер фоксоыой ошибки. Если номер 1526 - ругается сервер, иначе - фокс. Тогда и ясно будет кто и на что ругается.2й вопрос:
где бы поподробней прочитать tableupdate- где и откуда что берет, как "действует"Использует стандартный механизи буферизации таблиц, ищет изменения и сочиняет по ним команды insert/delete/update, которые и отсылает на сервер.

а как научиться читать, в данном случае номер 10 - наверно есть какой то справочник где хотя бы намеком примерно где копать

так меня и интересует как он сочинает insert/delete/update .Повторюсь обертка работала многие годы и тут нарвался когда имена полей можно воспринять как ключевое слово(хотя может и я гоню) - поэтому и интересует как
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39396456
rock-n-rollпрвильный проходящий.пропущено...
Надо просто научиться читать всё сообщение, а не отдельные его части. В частности, обращать внимание на номер фоксоыой ошибки. Если номер 1526 - ругается сервер, иначе - фокс. Тогда и ясно будет кто и на что ругается.пропущено...
Использует стандартный механизи буферизации таблиц, ищет изменения и сочиняет по ним команды insert/delete/update, которые и отсылает на сервер.

а как научиться читать, в данном случае номер 10 - наверно есть какой то справочник где хотя бы намеком примерно где копатьКак ни странно некотроым покажется, но это документация по фоксу, родная. В ней есть список всех выдаваемых фоксом ошибок. Если ошибка серверная - то документация по серверу. Внезапно, да?
так меня и интересует как он сочинает insert/delete/update .Повторюсь обертка работала многие годы и тут нарвался когда имена полей можно воспринять как ключевое слово(хотя может и я гоню) - поэтому и интересует какВы думаете, что, например, команду Insert into ... кад генерерит каким-то особенным способом, отличным от самой обычной конкатенации строк?
Вы доку по функции GetFieldState() не пробовали читать?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397099
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильный проходящий.rock-n-rollпропущено...


а как научиться читать, в данном случае номер 10 - наверно есть какой то справочник где хотя бы намеком примерно где копатьКак ни странно некотроым покажется, но это документация по фоксу, родная. В ней есть список всех выдаваемых фоксом ошибок. Если ошибка серверная - то документация по серверу. Внезапно, да?так меня и интересует как он сочинает insert/delete/update .Повторюсь обертка работала многие годы и тут нарвался когда имена полей можно воспринять как ключевое слово(хотя может и я гоню) - поэтому и интересует какВы думаете, что, например, команду Insert into ... кад генерерит каким-то особенным способом, отличным от самой обычной конкатенации строк?
Вы доку по функции GetFieldState() не пробовали читать?

1. Файлсервер,номер ошибки 10- просто попросил ссылку.К чему весь пафос о не о чем?
2. Вообще к чему это?

Вопрос к другим форумчанам, НЕ К првильный проходящий.

код - вроде работает на любых полях таблиц источников
Код: 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.
clear
field1='group1'
field2='sort1'

CREATE TABLE C:\test (id i,&field1 i,&field2 i)
INSERT INTO test(id,&field1,&field2)value(1,1,1) 
xxx=CREATEOBJECT('mcad','test','id')
SELECT (xxx.alias)
REPLACE &field1 WITH 2,;
        &field2 WITH 2
xxx.save()
SELECT test
browse

******************
define class mcad as CursorAdapter
BufferModeOverride =5
DataSourceType ='Native'
PROCEDURE Init
PARAMETERS cTable,cKey
WITH this
    .alias=SYS(2015)
    .tables=cTable
    .keyfieldlist=cKey
    .AddProperty('array_fields[256,18]')
    select (.tables)
    gnFieldcount = AFIELDS(.array_fields)  && создается массив.
    .updatableFieldList=.array_fields(1,1)
    FOR nCount = 2 TO gnFieldcount 
       .updatableFieldList=.updatableFieldList+','+.array_fields(nCount,1) 
    NEXT     .
    
    .updateNameList=GETWORDNUM(.updatableFieldList,1,",")+' '+.tables+'.'+GETWORDNUM(.updatableFieldList,1,",")
     FOR i=2 TO  GetWordCount(.updatableFieldList, ",")
        .updateNameList=.updateNameList+','+GETWORDNUM(.updatableFieldList,i,",") +' '+ .tables+'.'+GETWORDNUM(.updatableFieldList,i,",") 
     NEXT

     text to this.SelectCmd noshow textmerge pretext 15
	      SELECT  * from <<this.Tables>> 		
     ENDTEXT
     
    RETURN .cursorfill()

ENDWITH
ENDPROC 
************
PROCEDURE save
IF !tableupdate(.T.,.T.,this.alias)
	aerror(lArr)
	?STR(lArr(1))
	?lArr(2)
ENDIF
ENDPROC  

ENDDEFINE



если в первой строке имя поля заменить на GROUP сразу ругается tableupdate
Да, я подозреваю что он в своих апдейтах воспринимает GROUP за ключевое слово- может и я гоню- вразумите
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397163
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rock-n-rollВопрос к другим форумчанам, НЕ К првильный проходящий.
Все правильно проходящий тебе написал, телепатов тут нет. Откуда мне или ему догадаться что у тебя целый генератор курсор-адаптеров? Сразу надо было свое поделие показать.

Посмотри что пишется в this.SelectCmd
Код: sql
1.
2.
3.
     text to this.SelectCmd noshow textmerge pretext 15
	      SELECT  * from <<this.Tables>> 		
     ENDTEXT


Если сам не разберешься - сюда запости.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397178
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Вообще,совсем не догадываюсь что в SelectCmd не так.
В "оригинале"тоже вместо * и после where "макроподстановки", но что там, что там получается запрос как запрос и поведение то же
Вообщем совсем не догадываюсь, нужна еще подсказка
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397187
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rock-n-rollDima T,

Вообще,совсем не догадываюсь что в SelectCmd не так.
В "оригинале"тоже вместо * и после where "макроподстановки", но что там, что там получается запрос как запрос и поведение то же
Вообщем совсем не догадываюсь, нужна еще подсказка
Сохрани в буфер обмена
Код: sql
1.
2.
3.
4.
     text to this.SelectCmd noshow textmerge pretext 15
	      SELECT  * from <<this.Tables>> 		
     ENDTEXT
_cliptext = this.SelectCmd


Затем что получилось вставь в prg и запусти. Запустится или ошибка?
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397196
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

всмысле? вместо
Код: sql
1.
2.
3.
 text to this.SelectCmd noshow textmerge pretext 15
	      SELECT  * from <<this.Tables>> 		
 ENDTEXT


поставить

Код: sql
1.
.SelectCmd='SELECT  * from test'


тогда поведение тоже на поле GROUP ругается
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397245
rock-n-roll1. Файлсервер,номер ошибки 10- просто попросил ссылку.К чему весь пафос о не о чем?1. Вам нужна ссылка на нажатие кнопки Alt-F1 в самом фоксе?
2. Сообщение, как уже было указано, надо читать (и сюда постить) полностью, а не отдельные части.
3. Специально для не умеющих пользоваться встроенной справкой цитирую;
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Visual FoxPro 9.0 
Syntax error (Error 10) Синтаксическая ошибка (Ошибка 10) 


Вы запустили команду, которая синтаксически некорректна. 
Вы могли написать с ошибками команду или имя переменной, или использовали предложение, которое недействительно в текущем контексте. 

Нажмите F1, чтобы посмотреть контекстно-зависимую справку по команде. 


2. Вообще к чему это?Ну так прочитайте и может быть поймете.
Вопрос к другим форумчанам, НЕ К првильный проходящий. Обойдетесь, форум публичный и не вам решать кто будет отвечать.
если в первой строке имя поля заменить на GROUP сразу ругается tableupdate
Да, я подозреваю что он в своих апдейтах воспринимает GROUP за ключевое слово- может и я гоню- вразумитеРугается не кад, а сам фокс при выполнении получившегося синтаксически неправильного update. Синтаксически неправильный он не по вине кад, а по вашей вине в виде использования ключевых слов в качестве идентификаторов.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397299
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rock-n-rollDima T,

всмысле? вместо
Код: sql
1.
2.
3.
 text to this.SelectCmd noshow textmerge pretext 15
	      SELECT  * from <<this.Tables>> 		
 ENDTEXT


поставить

Код: sql
1.
.SelectCmd='SELECT  * from test'


тогда поведение тоже на поле GROUP ругается
В смысле в отдельный PRG или окно Command и там запустить.

Если и там ошибка, то показывай сам запрос, лучше укоротить до такого состояния чтобы можно было повторить твою ошибку.
У меня проблем нет, так работает
Код: sql
1.
2.
create Cursor t (group i)
select group from t where group != 1 group by group order by group



Если проблема где-то в другом месте, то давай пример кода с демонстрацией проблемы, простенький проект сделай, т.к. курсорадаптеры редко использую, поэтому без готового примера не подскажу.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397921
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильный прохождящий.,

правильный прохождящий.Ругается не кад, а сам фокс при выполнении получившегося синтаксически неправильного update. Синтаксически неправильный он не по вине кад, а по вашей вине в виде использования ключевых слов в качестве идентификаторов.
дык всетаки генерирует непраильный update из за ключевого group?, что и предполагалось в самом начале, но хотелось как-то убедиться(хотя я не видел нигде рекомендации не употреблять ключевые слова в качестве идентификаторов, хотя наверно это и не лишнее).

Правда Dima T на что то другое намекает- пока не понятно на что
правильный прохождящий..1. Вам нужна ссылка на нажатие кнопки Alt-F1 в самом фоксе?
2. Сообщение, как уже было указано, надо читать (и сюда постить) полностью, а не отдельные части.
3. Специально для не умеющих пользоваться встроенной справкой цитирую;
Да наверно я здесь подгоняю, кроме как "синтаксическая ошибка" ждать большего не приходится
Просто если "обычные" ошибки у себя еще находишь по средствам MESSAGE+LINENO+ASTACKINFO(и "видишь глазами" впоследствии),
то здесь кроме aerror ничего нет. Есть ли какая ссылка о том как и из чего tableupdate генерирует свои команды обновления, или увидеть глазами(в идеале) или "метод" по которому я составлю для себя(и опять же увижу глазами)
Да повторяюсь-Синтаксическая ошибка- не о чем, какие еще подводные камни могут быть.

правильный прохождящий.Ну так прочитайте и может быть поймете.
А давайте вместе
Код: sql
1.
Возвращает числовое значение, показывающее, редактировалось ли поле в таблице или курсоре, добавлялись ли записи, изменился ли для текущей записи статус удаления.


И что?Я знаю что я "обновляю", я update не вижу
Или может вы намекаете на то что - если имена полей "стремные" использовать какой -нибудь другой подход буферизации или еще чего?
Слишком туманно.
правильный прохождящий.Обойдетесь, форум публичный и не вам решать кто будет отвечать.
Просто все что было сказано, кроме последней фразы в полледнем топе- слишком загадочно(скажем чтоб помягче) А за последнее спасибо- если это утверждение
И тем немение хотелось бы убедиться и иметь "инструментарий" определения причины возникновения подобных проблем быстро и самостоятельно.
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39397924
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Dima Trock-n-rollDima T,

всмысле? вместо
Код: sql
1.
2.
3.
 text to this.SelectCmd noshow textmerge pretext 15
	      SELECT  * from <<this.Tables>> 		
 ENDTEXT


поставить

Код: sql
1.
.SelectCmd='SELECT  * from test'


тогда поведение тоже на поле GROUP ругается
В смысле в отдельный PRG или окно Command и там запустить.

Если и там ошибка, то показывай сам запрос, лучше укоротить до такого состояния чтобы можно было повторить твою ошибку.
У меня проблем нет, так работает
Код: sql
1.
2.
create Cursor t (group i)
select group from t where group != 1 group by group order by group


.
проблема не в SelectCmd - кад "собирает" без проблем в том числе и с полем group.Проблема в tableupdate- хочется узнать о нем подробней- "как и из чего" он генерирует свои команды на обновление

Dima TЕсли проблема где-то в другом месте, то давай пример кода с демонстрацией проблемы, простенький проект сделай, т.к. курсорадаптеры редко использую, поэтому без готового примера не подскажу.

пример был чуть выше
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39398612
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, я, конечно, понимаю, что то, что я писал несколько лет назад в этой теме

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=865794&msg=10984162

это про вставку. А здесь-то речь про обновление. Это, конечно, совсем другое дело! Буквально ничего общего!

Хорошо, тогда так. У класса CursorAdapter есть такое событие, называется CursorAdapter.BeforeUpdate(). Одним из его входных параметров является параметр cUpdateInsertCmd. По сути, это та команда, которая будет сформирована на исполнение для обновления таблицы-источника. Вот и посмотрите, какая именно команда будет сформирована (посмотрите содержимое этого параметра) и насколько она синтаксически корректна.

В принципе, ничто не мешает скорректировать содержимое этого параметра и через DoDefault() выполнить уже измененную команду.

На всякий случай, даю подсказку куда смотреть и как исправить. Если имя поля указано без префикса в виде имени таблицы, то возможна неоднозначная интерпретация этого имени при синтаксическом разборе команды компилятором
...
Рейтинг: 0 / 0
Помогите с добавлением данных через курсорадаптер
    #39399214
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМНу, я, конечно, понимаю, что то, что я писал несколько лет назад в этой теме

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=865794&msg=10984162

это про вставку. А здесь-то речь про обновление. Это, конечно, совсем другое дело! Буквально ничего общего!

Хорошо, тогда так. У класса CursorAdapter есть такое событие, называется CursorAdapter.BeforeUpdate(). Одним из его входных параметров является параметр cUpdateInsertCmd. По сути, это та команда, которая будет сформирована на исполнение для обновления таблицы-источника. Вот и посмотрите, какая именно команда будет сформирована (посмотрите содержимое этого параметра) и насколько она синтаксически корректна.

В принципе, ничто не мешает скорректировать содержимое этого параметра и через DoDefault() выполнить уже измененную команду.

На всякий случай, даю подсказку куда смотреть и как исправить. Если имя поля указано без префикса в виде имени таблицы, то возможна неоднозначная интерпретация этого имени при синтаксическом разборе команды компилятором
Ну когда ткнули носом в тетрадку-понятно , до этого никак
Спасибо- то что хотел увидеть и услышать, действительно, нет там никаких префиксов
Те мне нужно их проставить тупо "все для всех полей" как здесь
Код: 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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
is_up=.t.&&&.t.- &#228;&#238;&#225;&#224;&#226;&#235;&#255;&#229;&#236; &#239;&#229;&#240;&#244;&#232;&#234;&#235;&#251; &#228;&#235;&#255; group,set,wher f- &#234;&#224;&#234; &#229;&#241;&#242;&#252;
CREATE TABLE C:\log (fname c(6),is_ok l,UpdCmd C(60),WorkCmd C(60))
CREATE TABLE C:\Testf (fild c(6))
INSERT INTO Testf(fild)value('select')
INSERT INTO Testf(fild)value('group')
INSERT INTO Testf(fild)value('update')
INSERT INTO Testf(fild)value('set')
INSERT INTO Testf(fild)value('delete')
INSERT INTO Testf(fild)value('where')
SCAN 
   field1=ALLTRIM(Testf.fild)
   CREATE TABLE C:\test (id i,&field1 i)
   INSERT INTO test(id,&field1)value(1,1)   
   xxx=CREATEOBJECT('mcad','test','id',is_up)
   SELECT (xxx.alias)
   REPLACE &field1 WITH 2
   xxx.save()
   SELECT Testf
ENDSCAN
SELECT log
BROWSE FOR !is_ok 
BROWSE FOR is_ok  
******************
define class mcad as CursorAdapter
BufferModeOverride =5
DataSourceType ='Native'
PROCEDURE Init
PARAMETERS cTable,cKey,lIs
WITH this
    .alias=SYS(2015)
    .tables=ALLTRIM(cTable)
    .keyfieldlist=cKey
    .AddProperty('lpIs',lIs)    
    .AddProperty('array_fields[256,18]')
    select (.tables)
    gnFieldcount = AFIELDS(.array_fields)  && &#241;&#238;&#231;&#228;&#224;&#229;&#242;&#241;&#255; &#236;&#224;&#241;&#241;&#232;&#226;.
    .updatableFieldList=.array_fields(1,1)
    FOR nCount = 2 TO gnFieldcount 
       .updatableFieldList=.updatableFieldList+','+.array_fields(nCount,1) 
    NEXT     .
    
    .updateNameList=GETWORDNUM(.updatableFieldList,1,",")+' '+.tables+'.'+GETWORDNUM(.updatableFieldList,1,",")
     FOR i=2 TO  GetWordCount(.updatableFieldList, ",")
        .updateNameList=.updateNameList+','+GETWORDNUM(.updatableFieldList,i,",") +' '+ .tables+'.'+GETWORDNUM(.updatableFieldList,i,",") 
     NEXT

     text to this.SelectCmd noshow textmerge pretext 15
	      SELECT  * from <<this.Tables>> 		
     ENDTEXT
    .addproperty('cUpdCmd','')
    .addproperty('cUpdCmd2','')
    .addproperty('ProblemFilds(3)') 
    IF .lpIs
    .ProblemFilds(1)='GROUP'
    .ProblemFilds(2)='SET'
    .ProblemFilds(3)='WHERE'
    ENDIF 
    RETURN .cursorfill()

ENDWITH
ENDPROC 
************
PROCEDURE save
IF !tableupdate(.T.,.T.,this.alias)
	INSERT INTO LOG (fname,is_ok,UpdCmd,WorkCmd)value(this.array_fields(2,1),.f.,this.cUpdCmd,this.cUpdCmd2)
ELSE
	INSERT INTO LOG (fname,is_ok,UpdCmd,WorkCmd)value(this.array_fields(2,1),.t.,this.cUpdCmd,this.cUpdCmd2)	
ENDIF
ENDPROC  
PROCEDURE BeforeUpdate
LPARAMETERS cFldState, lForce, nUpdateType, cUpdateInsertCmd, cDeleteCmd
this.cUpdCmd =cUpdateInsertCmd
IF this.lpIs
LOCAL cStrtranFrom,cStrtranTo
FOR i=1 TO 3
    cStrtranFrom=' '+this.ProblemFilds(i)+'='
    cStrtranTo=' '+this.tables+'.'+this.ProblemFilds(i)+'='
    cUpdateInsertCmd=STRTRAN(cUpdateInsertCmd,cStrtranFrom,cStrtranTo)
NEXT  
ENDIF 
this.cUpdCmd2 =cUpdateInsertCmd
dodefault(cFldState, lForce, nUpdateType, cUpdateInsertCmd, cDeleteCmd)
ENDPROC  

ENDDEFINE


Хотя упорно чешется вопрос:"А что эти разработчики сами не могли проставить?Тупо все для всех?Может существует какая опция об этом, просто ее редко пользуют-поэтому все забыли?"

Вобщем спасибо, Вопрос снят
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с добавлением данных через курсорадаптер
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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