Для обслуживания многопользовательского доступа к данным вы можете использовать технологию управления конфликтами обновления, встроенную в представления Visual FoxPro. Представления управляют тем, что посылается в таблицы, лежащие в их основе, с помощью свойства WhereType. Вы можете установить это свойство как для локальных, так и для удаленных представлений. Свойство WhereType предоставляет четыре установки:
-
DB_KEY
-
DB_KEYANDUPDATABLE
-
DB_KEYANDMODIFIED (по умолчанию)
-
DB_KEYANDTIMESTAMP
Выбором одной из этих четырех установок вы управляете - как Visual FoxPro будет выстраивать опцию WHERE для предложения SQL Update, посылаемого таблицам, состовляющим основу представления. Вы можете выбрать желаемую установку с помощью закладки Update Criteria (Критерий обновления) конструктора представленяи - View Designer, или вы можете использовать DBSETPROP() для установки WhereType в определении представления. Для изменения установки WhereType для активного курсора представления используйте функцию CURSORSETPROP().
Для того, чтобы... | выберите эту опцию SQL WHERE... |
---|---|
обновление не состоялось, если в исходной таблице было изменено ключевое поле |
Key fields only |
обновление не состоялось, если в удаленной таблице было изменено любое из полей, размеченное как обновляемое |
Key and updatable fields |
обновление не состоялось, если любое поле, которое вы изменили локально было изменено в исходной таблице |
Key and modified fields |
обновление не состоялось, если метка времени записи в удаленной таблице была изменена после первого извлечения данных (доступно только в удаленных таблицах, которые имеют поле timestamp) |
Key and timestamp |
Например, предположим, что у вас имеется простое удаленное представление,
основанное на таблице Customer, которое включает в себя семь полей:
cust_id
, company
,
phone
, fax
, contact
, title
и timestamp
.
Первичным ключом вашего представления является cust_id
.
Вы маркировали в качестве обновляемых только два поля: contact_name
и
contact_title
. Вы желаете, чтобы у пользователя была возможность
изменить данные контактного лица компании и его титул с помощью представления. Однако,
если другие данные о компании изменились, например - адрес компании, вы желаете,
чтобы изменения следовали через координатора, который может определить воздействия
изменений на вашей компании, такие, как будет ли изменен регион потребителя. Теперь, когда
ваше представление установлено для посылки обновлений вы можете выбрать значение свойства WhereType
в соответствии с вашими предпочтениями.
Теперь предположим, что вы измененили имя в полей contact
потребителя,
но не меняли значения другого обновляемого поля,
title
. На основе этого примера в следующем разделе обсуждается -
как установка
WhereType будет оказывать влияние на опцию WHERE, которую выстроит Visual FoxPro для посылки
нового имени контактного лица в таблицы базы.
Сравнение только ключевых полей
Наименее ограниченное обновление использует установку DB_KEY. Опция WHERE используется для обновления удаленных таблиц будет состоять только поля первичного ключа, указанного в свойстве KeyField или KeyFieldList. Пока не будет изменено поле первичного ключа или значение не будет удалено в базовой таблице, из которой вы извлекли запис, обновление будет осуществляться.
В случае предыдущего примера Visual FoxPro должен подготовить предложение обновления с опцией WHERE,
которое сравнит значение в поле cust_id
со значением поля cust_id
в строке базовой таблицы:
![]() | |
---|---|
WHERE OLDVAL(customer.cust_id) = CURVAL(customer_remote_view.cust_id) |
Когда предложение обновления посылается базовой таблице, то проверяется только ее ключевое поле.

Надписи на рисунке слева-направо и сверху-вниз:
- Сравниваются поля выделенные желтым цветом
- Ключевое поле
- Это поле было изменено
- Эти поля являются обновляемыми
Сравнение ключевого поля и полей, измененных в представлении
Установка DB_KEYANDMODIFIED, используемая по умолчанию, представляет собой просто более ограниченное по сравнению с DB_KEY обновление. DB_KEYANDMODIFIED сравнивает только ключевое поле и любые обновляемые поля, значения которых вы изменили в представлении с их соответствующими полями в базовой таблице. Если вы изменили поле в представлении, но поле не является обновляемым, то поля не сравниваются с данными в базовой таблице.
Опция WHERE, используемая для обновления базовой таблицы, состоит из первичных полей, указанных в свойстве KeyFieldList и любых других
полей, которые изменены в представлении. В случае предыдущего примера,
Visual FoxPro должен подготовить предложение обновления, которое сравнит
значения в поле cust_id
, поскольку оно является ключевым полем, и поле
contact
, поскольку имя контактного лица было изменено. Несмотря на то, что поле title
является обновляемым, оно не будет включено в предложение обновления, поскольку мы не меняли его значения.

Надписи на рисунке слева-направо и сверху-вниз:
- Сравниваются поля выделенные желтым цветом
- Ключевое поле
- Это поле было изменено
- Эти поля являются обновляемыми
Сравнение ключевого поля и всех обновляемых полей
Установка DB_KEYANDUPDATABLE сравнивает ключевое поле и любые обновляемые поля (вне зависимости - изменены они ли нет) в вашем представлении с их аналогами в базовой таблицеin. Если поля являются обновляемыми, даже если вы и не изменяли их значений в представлении, и если кто-либо еще изменил эти поля в базовой таблице, то обновление не состоится.
Опция WHERE, используемая для обновления базовой таблицы, состоит из первичных полей, указанных в свойстве Key Field или
KeyFieldList и любых других полей, которые являются обновляемыми. В случае приведенного выше примера, Visual
FoxPro должен подготовить предложение обновления, которое сравнит значение в полях
cust_id
, contact
и title
со значениями аналогичнх полей в строке базовой таблицы.

Надписи на рисунке слева-направо и сверху-вниз:
- Сравниваются поля выделенные желтым цветом
- Ключевое поле
- Это поле было изменено
- Эти поля являются обновляемыми
Сравнение Timestamp для всех полей в записи базовой таблицы
DB_KEYANDTIMESTAMP представляет собой наиболее ограниченный тип обновления, и доступен только в том случае, когда базовая таблица имеет колонку метки времени (timestamp). Visual FoxPro сравнивает текущую метку времени записи базовой таблицы с меткой времени соответствующей времени извдечения данных в представление. Если любое поле в записи базовой таблицы было изменено, даже если оно не является полем, которое вы пытались изменить или даже любым полем в вашем представление, обновление не состоится.
В случае примера, рассмотренного выше, Visual FoxPro подготавливает предложение обновления, которое
сравнивает значение в поле cust_id
и значение в поле timestamp
со значениями аналогичных
полей в строке базовой таблицы.

Надписи на рисунке слева-направо и сверху-вниз:
- Сравниваются поля выделенные желтым цветом
- Ключевое поле
- Это поле было изменено
- Эти поля являются обновляемыми
Для того, чтобы успешно обновить данные с помощью установки DB_KEYANDTIMESTAMP в многотабличном представлении, вы должны включить поле timestamp в вашем представлении для любой таблицы, которая является обновляемой. Например, если у вас в представлении имеется три таблицы и вы желаете обновлять только две из них и вы выбрали установку DB_KEYANDTIMESTAMP, вы должны вывести поля timestamp fields из двух обновляемых таблиц в ваш набор результатов. Вы можете, кроме того, использовать логические значения в свойстве CompareMemo для определения - были ли мемо-поля включены в определение конфликта обновления.