В течении операции обновления (модифицикации) данных, особенно в средах общего доступа, Вам бывает нужно определить, какие поля изменились или какое значение: оригинал или текущие находятся в изменяемых полях. Буферизация Visual FoxPro и функции GETFLDSTATE( ), GETNEXTMODIFIED( ), OLDVAL( ) и CURVAL( ) дают Вам возможность определить какое поле изменилось, найти измененные данные, и сравнить текущее, оригинальное и отредактированные значения так, что Вы можете решить, как обработать ошибку или конфликт.
Обнаружение изменения значения поля
-
После операции изменения используйте функцию GETFLDSTATE( ).
GETFLDSTATE( ) работает и на небуферизованных данных. Однако эта функция более эффективна, когда Вы применяете буферизацию записей. Например, используйте GETFLDSTATE () в коде кнопки Следующая на форме. Когда Вы перемещаете указатель записи, Visual FoxPro проверяет состояние всех полей записи как в следующем примере:
Копировать | |
---|---|
lModified = .F. FOR nFieldNum = 1 TO FCOUNT( ) && Проверка всех полей if GETFLDSTATE(nFieldNum) = 2 && Были изменеия lModified = .T. EXIT && Здесь вставить процедуру обновления/сохранения. ENDIF && См. следующий пример. ENDFOR |
Обнаружение и помещение измененной записи в буферизированных данных
-
Используйте функцию GETNEXTMODIFIED( ).
GETNEXTMODIFIED( ) с нолем в качестве параметра находит первую измененную запись. Если другой пользователь делает изменения в буферизированной таблице, любые изменения, с которыми сталкивается команда TABLEUPDATE( ) в вашем буфере создаст конфликты. Вы можете оценивать противоречивые значения и разрешать их, используя функции CURVAL( ), OLDVAL( ) и MESSAGEBOX( ). CURVAL( ) Возвращает текущее значение записи с диска, в то время как OLDVAL () возвращает значение записи на момент, когда она была буферизирована.
Определение первоначального значения буферизированного поля
-
Используйте фукцию OLDVAL( ).
OLDVAL( ) возвращает значение буферизированного поля.
Определение текущего значения буферизированного поля на диске
-
Используйте фукцию CURVAL( ).
CURVAL( ) возвращает текущее значение буферизированного поля на диске до начала любых его измений.
Вы можете создавать процедуру обработки ошибки, которая сравнивает текущие и первоначальные значения, давая Вам возможность самим решить: сохранить текущее изменение или использовать более раннее изменение данных в среде общего доступа.
Следующий пример использует GETNEXTMODIFIED (), CURVAL () и OLDVAL () чтобы обеспечить пользователя информированным выбором в операции модификации. Этот пример начинается с обнаружения первой измененной записи и мог бы содержаться в кнопке Обновить или в кнопке Сохранить на форме.
Код | Коментарий |
---|---|
|
Проход через буфер. Блокирование измененной записи. |
|
Обнаружение конфликта. Сравнение первоначального значение с текущим значением на диске и, затем, запрос к пользователю, что делать с конфликтом. |
|
Если пользователь выбрал "Нет", возвращается эта запись и, затем, удаляется блокировка. Находится следующая измененная запись. |
|
Принудительная модификация всех записей. |
Вы можете использовать свойство CompareMemo, чтобы управлять использованием мемо-полей при обнаружении конфликтов модификации. Это свойство представления и курсора определяет, нужно ли включать мемо-поля (типы М или G) в раздел WHERE модификации. Параметр по умолчанию - Истина (.T)., означает, что мемо-поля включены в раздел WHERE. Если Вы устанавливаете это свойство в Ложь (.F), мемо-поля не участвуют в раздел WHERE модификации, независимо от параметров настройки UpdateType.
Оптимистическое обнаружение конфликта мемо-полей заблокировано, когда CompareMemo установлено в Ложь. Для обнаружения конфликта значений мемо, установите CompareMemo в Истину (.T).