:: Архив конференции по VFP до 2005 года
? о буферизации записей
pit

Сообщений: 53
Откуда: Нижневартовск
Дата регистрации: 17.09.2000
Какие действия и в каком порядке выполняются для программной буферизации записей при вводе и редактировании?
есди можно - пример

1 в св-вах таблицы buffer mode?
2 в гл. прогр. что-то надо?
3 в форме?
Ratings: 0 negative/0 positive
RE: ? о буферизации записей
ВладимирМ

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
1. Посмотри соседний сабж.
2. Пример из моей программы. Редактирование (создание) записи - поэтому оптимистическаю буферизация строк

Init формы:
This.AddProperty("nOldBufering")
This.nOldBufering=CursorGetProp("Buffering","Regions")
=CursorSetProp("Buffering",3,"Regions")

Unload формы:
=TableRevert(.T.)
=CursorSetProp("Buffering",ThisForm.nOldBufering,"Regions")

На форме 2 кнопки: "Сохранить", "НЕ сохранять"
Click кнопки "НЕ сохранять":
=TableRevert(.F.)
ThisForm.Release()

Click "Сохранить":
Здесь достаточно сложные условия делающие следующие проверки.

TableUpdate(0,.F.) = .F. - запись изменена другим пользователем, делается запрос: стоит ли перезаписать поверх них

gaError[1,1] = -1 - ошибка тригера при добавлении (изменении) записи. Сохранение невозможно! Глобальный массив gaError() создается автоматически при отработке тригера. Если все нормально, то все элементы gaError = .F.

TableUpdate(0,.T.) = .F. - при попытке перезаписи поверх изменений сделанных другим пользователем произошла ошибка, делающая невозможным сохранение изменений. Обычно - это либо системная ошибка, либо ошибка тригера (если Вы не анализируете gaError).

Можно еще сделать дополнительную проверку: изменение этой же записи в этой же программе, но в другой форме. Но это не обязательно.

Для перехвата системных ошибок можно воспользоваться методом Error формы:
LPARAMETERS nError, cMethod, nLine
DO CASE
CASE nError = 108
MessageBox('Кто-то сейчас изменяет ВСЮ таблицу! Изменения невозможны.')
CASE nError = 109
MessageBox('Кто-то сейчас изменяет данную запись! Изменения невозможны.')
OTHERWISE
MessageBox('Произошла ошибка № ' + LTRIM(STR(nError)) + '. Изменения невозможны.')
ENDCASE

Ratings: 0 negative/0 positive
RE: ? о буферизации записей
ВладимирМ

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Поправка: глобальный массив отработки тригера имеет "s" на конце, т.е. "gaErrors"

Код метода Click кнопки "Сохранить" выглядит примерно так:

* Сначала проверяем, были ли внесены какие-либо изменения
LOCAL lnIsModify, llOverwrite, llChanged
STORE .F. TO llOverwrite, llChanged
* Попытка записать изменения предпринимается только в случае если они были
lnIsModify = AT('2',GETFLDSTATE(-1,"lvReceivers")) + AT('3',GETFLDSTATE(-1,"lvReceivers")) + AT('4',GETFLDSTATE(-1,"lvReceivers"))

IF lnIsModify > 0

* Первая попытка записи с запретом записи поверх изменений внесенных другим пользователем
llOverwrite = TableUpdate(0,.F.)

if not llOverwrite and vartype(gaErrors[1,1]) = "L"
lnResult = MessageBox('Кто-то уже обновил эти данные. Писать поверх этих изменений?', 4+32,'Конфликт при обновлении')

* Если пользователь ответил "ДА" повторяем попытку обновления
if lnResult = 6
llOverwrite = TableUpdate(0,.T.)
endif

endif

* Если удалось обновление, то выполняем ряд команд

if llOverwrite
ThisForm.lReturnValue = .T. && Возвращаемое в методе Unload формы значение для обновления основной формы
else

if vartype(gaErrors[1,1]) = "L"
MessageBox('Произошла ошибка при сохранении. Сохранение не удалось!',0+48,'Конфликт при обновлении')
else
MessageBox('Другим пользователем внесены изменения, делающие'+chr(13)+'невозможным сохранение внесенных Вами изменений.',0+48,'Конфликт при обновлении')
endif

endif

ENDIF

* Закрытие формы, если не было никаких изменений или обновление удалось
if lnIsModify = 0 OR llOverwrite
ThisForm.Release()
endif
Ratings: 0 negative/0 positive
RE: ? о буферизации записей
Людмила
Автор

Сообщений: 585
Откуда: Киев
Дата регистрации: 05.09.2000
Если интересуешься теорией - почитай книжку Рода Пэддока и др. "Visual FoxPro 6.0. Разработка корпоративных приложений".

Там подробно расписана последовательность действий при разных видах блокировок.
Ratings: 0 negative/0 positive


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

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

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