Для обслуживания многопользовательского доступа к данным вы можете использовать технологию управления конфликтами обновления, встроенную в представления Visual FoxPro. Представления управляют тем, что посылается в таблицы, лежащие в их основе, с помощью свойства WhereType. Вы можете установить это свойство как для локальных, так и для удаленных представлений. Свойство WhereType предоставляет четыре установки:

Выбором одной из этих четырех установок вы управляете - как 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 в строке базовой таблицы:

 CopyCode imageСкопировать код
WHERE OLDVAL(customer.cust_id) = CURVAL(customer_remote_view.cust_id)

Когда предложение обновления посылается базовой таблице, то проверяется только ее ключевое поле.

Ключевое поле в вашем представлении сравнивается с аналогичным в базовой таблице.

FoxProKeyFieldBaseTableCompared graphic

Надписи на рисунке слева-направо и сверху-вниз:

  • Сравниваются поля выделенные желтым цветом
  • Ключевое поле
  • Это поле было изменено
  • Эти поля являются обновляемыми

Сравнение ключевого поля и полей, измененных в представлении

Установка DB_KEYANDMODIFIED, используемая по умолчанию, представляет собой просто более ограниченное по сравнению с DB_KEY обновление. DB_KEYANDMODIFIED сравнивает только ключевое поле и любые обновляемые поля, значения которых вы изменили в представлении с их соответствующими полями в базовой таблице. Если вы изменили поле в представлении, но поле не является обновляемым, то поля не сравниваются с данными в базовой таблице.

Опция WHERE, используемая для обновления базовой таблицы, состоит из первичных полей, указанных в свойстве KeyFieldList и любых других

полей, которые изменены в представлении. В случае предыдущего примера, Visual FoxPro должен подготовить предложение обновления, которое сравнит значения в поле cust_id, поскольку оно является ключевым полем, и поле contact, поскольку имя контактного лица было изменено. Несмотря на то, что поле title является обновляемым, оно не будет включено в предложение обновления, поскольку мы не меняли его значения.

Ключевые и измененные поля в вашем представлении сравниваются с аналогичными в базовой таблице.

FoxProKeyModifiedFields graphic

Надписи на рисунке слева-направо и сверху-вниз:

  • Сравниваются поля выделенные желтым цветом
  • Ключевое поле
  • Это поле было изменено
  • Эти поля являются обновляемыми

Сравнение ключевого поля и всех обновляемых полей

Установка DB_KEYANDUPDATABLE сравнивает ключевое поле и любые обновляемые поля (вне зависимости - изменены они ли нет) в вашем представлении с их аналогами в базовой таблицеin. Если поля являются обновляемыми, даже если вы и не изменяли их значений в представлении, и если кто-либо еще изменил эти поля в базовой таблице, то обновление не состоится.

Опция WHERE, используемая для обновления базовой таблицы, состоит из первичных полей, указанных в свойстве Key Field или KeyFieldList и любых других полей, которые являются обновляемыми. В случае приведенного выше примера, Visual FoxPro должен подготовить предложение обновления, которое сравнит значение в полях cust_id, contact и title со значениями аналогичнх полей в строке базовой таблицы.

Все обновляемые поля в вашем представлении сравниваются с их аналогами в базовой таблице.

Viewed Fields Compared graphic

Надписи на рисунке слева-направо и сверху-вниз:

  • Сравниваются поля выделенные желтым цветом
  • Ключевое поле
  • Это поле было изменено
  • Эти поля являются обновляемыми

Сравнение Timestamp для всех полей в записи базовой таблицы

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

В случае примера, рассмотренного выше, Visual FoxPro подготавливает предложение обновления, которое сравнивает значение в поле cust_id и значение в поле timestamp со значениями аналогичных полей в строке базовой таблицы.

Метка времени (timestamp) для записи вашего представления сравнивается с меткой времени в записи базовой таблицы.

FoxProTimeStampBaseTableCompared graphic

Надписи на рисунке слева-направо и сверху-вниз:

  • Сравниваются поля выделенные желтым цветом
  • Ключевое поле
  • Это поле было изменено
  • Эти поля являются обновляемыми

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

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