Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с добавлением данных через курсорадаптер / 25 сообщений из 57, страница 1 из 3
12.07.2011, 16:55
    #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
12.07.2011, 17:38
    #37348512
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
НадеждаМ,

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

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

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

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

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


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

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

Это да, увидела.
...
Рейтинг: 0 / 0
13.07.2011, 16:39
    #37350212
НадеждаМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
не могу отловить ошибку
...
Рейтинг: 0 / 0
13.07.2011, 16:47
    #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
13.07.2011, 17:33
    #37350339
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
НадеждаМ tableupdate(.t.,.t.,.lo_CA.alias) =.t. получается.

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

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

...
Рейтинг: 0 / 0
14.07.2011, 07:56
    #37350905
НадеждаМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
ага
...
Рейтинг: 0 / 0
14.07.2011, 08:08
    #37350909
НадеждаМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
тоесть было написано.
...
Рейтинг: 0 / 0
14.07.2011, 08:08
    #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
14.07.2011, 08:11
    #37350912
НадеждаМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
Сейчас добавила еще одну кнопку, по клику которой просто пустая строка появляется в grid.

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

Нет, не задумано. Вы правы.
...
Рейтинг: 0 / 0
14.07.2011, 08:17
    #37350917
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
И надо ли тут sqlrollback() ?
sqlrollback() откатывает на сервере изменения сделанные в текущей транзакции.
Т.к. tableupdate() не сработал - сервер изменения не принял, т.е. в базе ничего не менялось, т.е. имеем курсор в котором есть изменения для сохранения на сервер. Для возврата курсора в исходное состояние надо использовать tablerevert()
...
Рейтинг: 0 / 0
14.07.2011, 08:29
    #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
14.07.2011, 09:21
    #37350961
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
Dima TТ.к. tableupdate() не сработал - сервер изменения не принял, т.е. в базе ничего не менялось,

вай ит из?

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

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


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

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

Записи я добвляю по одной. Вроде как tableupdate () = .t., только понять не могу почему в таблице нет добавляемых данных.
...
Рейтинг: 0 / 0
14.07.2011, 10:17
    #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
14.07.2011, 10:42
    #37351079
НадеждаМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
сейчас добавила пустую строку и сделала browse, данные в курсорадаптере есть.
...
Рейтинг: 0 / 0
14.07.2011, 11:31
    #37351190
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
НадеждаМсейчас добавила пустую строку и сделала browse, данные в курсорадаптере есть.
Поздравляю. А если попробовать непустые строки добавлять? После APPEND BLANK заполнить запись REPL ... а потом уже сохранять.
...
Рейтинг: 0 / 0
14.07.2011, 11:51
    #37351253
НадеждаМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с добавлением данных через курсорадаптер
Dima T,

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


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

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

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


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