Независимо от того, что вы используете - буферизацию, транзакции или представления, вы должны управлять конфликтами, которые могут возникнуть во время процесса обновления. Управление конфликтами, случающимися в многопользовательской среде может потребовать большого и повторяющегося объема кода. Полная процедура управления конфликтами производит перечисленное ниже:

Примером процедуры управления конфликтами, может служить класс data checker, определенный в библиотеке Samples.vcx, размещенной в каталоге Visual FoxPro ...\Samples\Classes. Просто добавьте этот класс в форму и вызовите метод CheckConflicts до любой операции, которая записывает буферированные данные в таблицу, например до перемещения указателя записи, если вы используете буферирование строки, до закрытия таблицы или до выпуска команды TABLEUPDATE().

Управление конфликтами буферирования

Вы можете сделать процесс обновления данных более эффективным тщательным выбором - как и когда открывать, буферировать и блокировать данных в многопользовательской среде. Вы должны ограничить время, когда запись или таблица могут стать субъектом конфликта. Однако, вы должны предвидеть неизбежные конфликты и управлять ими. Конфликт происходит, когда один пользователь старается заблокировать запись или таблицу, которая в это же самое время заблокирована другим пользователем. Два пользователя не могут блокировать одну и ту жу запись или таблицу в одно и то же время.

Ваше приложение должно содержать процедуру для управления этими конфликтами. Если ваше приложение не имеет такой процедуры, система может заблокироваться. Зависание происходит, когда один пользователь заблокировал запись или таблицу и старается заблокировать другую запись или таблицу, которые уже заблокированы другим пользователем, который, в свою очередь, пытается заблокировать запись, которая уже заблокирована первым пользователем. Хотя такая конкуренция представляет собой довольно редкий случай, все таки имеется шанс для зависания.

Захват ошибок

Разработка многопользовательского приложения или введение сетевой поддержки в однопользовательскую систему требует, чтобы вы работали с коллизиями и захватом ошибок. Использование предоставляемого Visual FoxPro буферирования записи и таблицы упрощает некоторые из этих задач.

Если вы пытаетесь блокировать запись или таблицу, уже заблокированную другим пользователем, то Visual FoxPro вернет сообщение об ошибке. Вы можете использовать команду SET REPROCESS для автоматической работы с безуспешными попытками блокировки. Эта команда, в комбинации с процедурой, определенной с помощью ON ERROR, а также командой RETRY, позвволяет вам продолжить или прекратить попытки блокировки.

Приведенный ниже пример демонстрирует автоматическое повторение процесса безуспешной операции с помощью команды SET REPROCESS.

Использование SET REPROCESS и ON ERROR управления конфликтами пользователя
Программный код Комментарий

ON ERROR DO err_fix WITH ERROR(),MESSAGE()

SET EXCLUSIVE OFF

SET REPROCESS TO AUTOMATIC

USE customer

IF !FILE('cus_copy.dbf')

COPY TO cus_copy

ENDIF

Эта процедура запускается в случае, если произошла ошибка. Открывает файлы для совместного доступа. Повторение безуспешных попыток блокировки производится автоматически. Открывает таблицу. Создает, при необходимости, таблицу для APPEND FROM.

DO app_blank

DO rep_next

DO rep_all

DO rep_curr

DO add_recs

Основная процедура запускается отсюда. Эти команды являются примером кода, который должен исполняться по ходу вашей программы.

ON ERROR

Основная процедура заканчивается здесь.

PROCEDURE app_blank

APPEND BLANK

RETURN

ENDPROC

Процедура добавления пустой записи.

PROCEDURE rep_next

REPLACE NEXT 1 contact WITH ;

PROPER(contact)

RETURN

ENDPROC

Процедура для замещения данных в текущей записи.

PROCEDURE rep_all

REPLACE ALL contact WITH ;

PROPER(contact)

GO TOP

RETURN

ENDPROC

Процедура для замещения данных во всех записях.

PROCEDURE rep_curr

REPLACE contact WITH PROPER(contact)

RETURN

ENDPROC

Процедура для замещения данных в текущей записи.

PROCEDURE add_recs

APPEND FROM cus_copy

RETURN

ENDPROC

Процедура для добавления записей из другого файла.

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

Обработка ошибок с помощью клавиши ESC
Программный код Коммантарий

PROCEDURE err_fix

PARAMETERS errnum, msg

Эта программа вызывается, когда происходит ошибка и пользователь выходит из процесса ожидания с помощью клавиши ESC.

DO CASE

Определяется вид произошедшей ошибки. Не является ли она ошибкой "File is in use by another"?

CASE errnum = 108

line1 = "File cannot be locked."

line2 = "Try again later..."

 

CASE errnum = 109 .OR. errnum = 130

line1 = "Record cannot be locked."

line2 = "Try again later."

или "Record is in use by another"?

OTHERWISE

line1 = msg + " "

line2 = ;

"See your system administrator."

ENDCASE

или вообще ни одна из определяемых?

=MESSAGEBOX( line1 + line2, 48, "Error!" )

RETURN

Отображает сообщение об ошибке в диалоговом окне с восклицательным знаком и командной кнопкой OK.

Смотрите также