? о буферизации записей | |
---|---|
pit Сообщений: 53 Откуда: Нижневартовск Дата регистрации: 17.09.2000 |
Какие действия и в каком порядке выполняются для программной буферизации записей при вводе и редактировании?
есди можно - пример 1 в св-вах таблицы buffer mode? 2 в гл. прогр. что-то надо? 3 в форме? |
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 |
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 |
RE: ? о буферизации записей | |
---|---|
Людмила Автор Сообщений: 585 Откуда: Киев Дата регистрации: 05.09.2000 |
Если интересуешься теорией - почитай книжку Рода Пэддока и др. "Visual FoxPro 6.0. Разработка корпоративных приложений".
Там подробно расписана последовательность действий при разных видах блокировок. |
© 2000-2024 Fox Club  |