В течении операции обновления (модифицикации) данных, особенно в средах общего доступа, Вам бывает нужно определить, какие поля изменились или какое значение: оригинал или текущие находятся в изменяемых полях. Буферизация Visual FoxPro и функции GETFLDSTATE( ), GETNEXTMODIFIED( ), OLDVAL( ) и CURVAL( ) дают Вам возможность определить какое поле изменилось, найти измененные данные, и сравнить текущее, оригинальное и отредактированные значения так, что Вы можете решить, как обработать ошибку или конфликт.

Обнаружение изменения значения поля

  • После операции изменения используйте функцию GETFLDSTATE( ).

GETFLDSTATE( ) работает и на небуферизованных данных. Однако эта функция более эффективна, когда Вы применяете буферизацию записей. Например, используйте GETFLDSTATE () в коде кнопки Следующая на форме. Когда Вы перемещаете указатель записи, Visual FoxPro проверяет состояние всех полей записи как в следующем примере:

  CopyCode imageКопировать
lModified = .F.
FOR nFieldNum = 1 TO FCOUNT( ) && Проверка всех полей
   if GETFLDSTATE(nFieldNum) = 2  && Были изменеия
      lModified = .T.
      EXIT && Здесь вставить  процедуру обновления/сохранения.
   ENDIF && См. следующий пример.
ENDFOR

Обнаружение и помещение измененной записи в буферизированных данных

GETNEXTMODIFIED( ) с нолем в качестве параметра находит первую измененную запись. Если другой пользователь делает изменения в буферизированной таблице, любые изменения, с которыми сталкивается команда TABLEUPDATE( ) в вашем буфере создаст конфликты. Вы можете оценивать противоречивые значения и разрешать их, используя функции CURVAL( ), OLDVAL( ) и MESSAGEBOX( ). CURVAL( ) Возвращает текущее значение записи с диска, в то время как OLDVAL () возвращает значение записи на момент, когда она была буферизирована.

Определение первоначального значения буферизированного поля

OLDVAL( ) возвращает значение буферизированного поля.

Определение текущего значения буферизированного поля на диске

CURVAL( ) возвращает текущее значение буферизированного поля на диске до начала любых его измений.

Вы можете создавать процедуру обработки ошибки, которая сравнивает текущие и первоначальные значения, давая Вам возможность самим решить: сохранить текущее изменение или использовать более раннее изменение данных в среде общего доступа.

Следующий пример использует GETNEXTMODIFIED (), CURVAL () и OLDVAL () чтобы обеспечить пользователя информированным выбором в операции модификации. Этот пример начинается с обнаружения первой измененной записи и мог бы содержаться в кнопке Обновить или в кнопке Сохранить на форме.

Код события Click для кнопки Обновить или Сохранить
Код Коментарий

nCurRec = GETNEXTMODIFIED(nCurRec)

DO WHILE nCurRec <> 0

GO nCurRec

RLOCK( )

Проход через буфер. Блокирование измененной записи.

FOR nField = 1 TO FCOUNT(cAlias)

cField = FIELD(nField)

IF OLDVAL(cField) <> CURVAL(cField)

nResult = MESSAGEBOX("Данные были;

изменены другим пользователем. ;

Сохранить изменения?", 4+48+0, ;

"Изменение записи")

Обнаружение конфликта. Сравнение первоначального значение с текущим значением на диске и, затем, запрос к пользователю, что делать с конфликтом.

IF nResult = 7

TABLEREVERT(.F.)

UNLOCK RECORD nCurRec

ENDIF

ENDIF

ENDFOR

nCurRec = GETNEXTMODIFIED(nCurRec)

ENDDO

Если пользователь выбрал "Нет", возвращается эта запись и, затем, удаляется блокировка. Находится следующая измененная запись.

TABLEUPDATE(.T., .T.)

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

Вы можете использовать свойство CompareMemo, чтобы управлять использованием мемо-полей при обнаружении конфликтов модификации. Это свойство представления и курсора определяет, нужно ли включать мемо-поля (типы М или G) в раздел WHERE модификации. Параметр по умолчанию - Истина (.T)., означает, что мемо-поля включены в раздел WHERE. Если Вы устанавливаете это свойство в Ложь (.F), мемо-поля не участвуют в раздел WHERE модификации, независимо от параметров настройки UpdateType.

Оптимистическое обнаружение конфликта мемо-полей заблокировано, когда CompareMemo установлено в Ложь. Для обнаружения конфликта значений мемо, установите CompareMemo в Истину (.T).

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