:: Архив конференции по VFP до 2005 года
Transaction
Олег_атор
Автор

Сообщений: 76
Дата регистрации: 05.09.2000
Каким образом узнать были ли изменения с начала транзакции не прощупавая поля
Что-то типа " empty(BUFFER) "
Ratings: 0 negative/0 positive
RE: Transaction
ВладимирМ

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Попробуй анализировать блокировку записей. Дело в том, что если запись была изменена внутри транзакции, то она автоматически блокируется до завершения транзакции.
Ratings: 0 negative/0 positive
RE: Transaction
SpyFox

Сообщений: 27
Дата регистрации: 07.09.2000
Вообще считатется плохим тоном в программировании использовать длительные транзакции, т.е., например, начинать транзакцию при открытии формы и завершать при ее закрытии. Оптимальный вариант считается открытие таблиц с Buffering=5, а при записи запускать транзакцию если функция getfldstate обнаруживает изменения в таблицах.
Ratings: 0 negative/0 positive
RE: Transaction
ВладимирМ

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Я бы добавил, что это не просто плохой тон, а ситуация чреватая зависанием при работе в сетевом режиме. Поэтому, чем меньше (по времени) транзакция, тем меньше вероятность зависания в связи с конфликтами обновления несколькими пользователями одной записи.
Ratings: 0 negative/0 positive
RE: Transaction
Олег_атор
Автор

Сообщений: 76
Дата регистрации: 05.09.2000
Небольшое уточнение !
С транзакцией я вроде уяснил -- это типа "спасательного круга" перед внесением изменений в таблицы базы

Проверять блокировки записей -- это неразумно -- можно всю оставшуюся жизнь бщегать по записям и смотреть какая заблокирована

НО КАК ОДНОЙ ФУНКЦИЕЙ ПРОВЕРИТЬ ЕСЛИ ИЗМЕНЕНИЯ В ТАБЛИЦЕ
ПРИ БУФФЕРИЗАЦИИ (имеется в виду - правильно и эффективно) -- НЕПОНЯТНО !
Ratings: 0 negative/0 positive
RE: Transaction
ВладимирМ

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Встречный вопрос: А зачем?
Если никаких изменений не было, то по командам END TRANSCTION и(или) TABLEUPDATE() ничего и не будет записано. Заметь (!), они не перезаписывают неизмененные значения, а НИЧЕГО не записывают.
Ratings: 0 negative/0 positive
RE: Transaction
SpyFox

Сообщений: 27
Дата регистрации: 07.09.2000
Вот так можно проверить если изменения в буфферизованной таблице.

lParameters lpAlias
Local nWorkArea,bool
if not empty(lpAlias)
nWorkArea=select()
select (lpAlias)
endif
if isnull(getfldstate(-1))
bool=.f.
else
bool=('2' $ getfldstate(-1) or '4' $ getfldstate(-1))
endif
if not empty(nWorkArea)
select(nWorkArea)
endif
retu bool

функциия возвращает True, если есть изменения
Ratings: 0 negative/0 positive
RE: Transaction
Sergey Titow

Сообщений: 2242
Дата регистрации: 12.09.2000
See Also: GETNEXTMODIFIED(nRecordNumber [, cTableAlias | nWorkArea])

Ratings: 0 negative/0 positive
RE: Transaction
Олег_атор
Автор

Сообщений: 76
Дата регистрации: 05.09.2000
Спасибо ! Я уже разобрался и полность удовлетворен.
Для тех кто залезит сюда позже почитать отмечу еще одну особенность:


после добавления новой записи в буфферизированную таблицу до тех пор пока небыло tableupdate() или tablerevert() -- функция recno() для новых записей возвращает ОТРИЦАТЕЛЬНЫЕ ЗНАЧЕНИЯ .
те. можно и так

set order to
go bottom
if recno()<0
* были изменения
endif
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика