Указывает составленную пользователем команду для использования с целью проверки конфликтов обновления или удаления для случая, если значение свойства ConflictCheckType объекта CursorAdapter установлено 4. Редактируемое (Read/write)в design и run time.
Вы можете использовать команду, установленную в свойстве ConflictCheckCmd с "родными", Open Database Connectivity (ODBC), или ActiveX Object (ADO) типами источников данных. При использовании ADO, объект CursorAdapter должен использовать объект ADO Command для SQL операций UPDATE или DELETE. В противном случае, Visual FoxPro сбрасывает значение свойства ConflictCheckCmd.
CursorAdapter.ConflictCheckCmd [= cValue] |
Параметры
- cValue
- Указывает на составленную пользователем командную строку, для дополнения команд (подчеркнуто мной - переводчик) определенных в свойствах UpdateCmd и DeleteCmd для проверки конфликтов обновления или удаления. По умолчанию значение cValue содержит пустую строку.
Замечание переводчика: |
---|
Приведенное ниже поясняет использование этого свойства для проверки конфликтов. Когда вы пытаетесь произвести операцию обновления на источнике данных (например, back-end, такой как SQL Server) функция TableUpdate возвращает результат для обновления курсора, связанного с объектов CursorAdapter. Если произошел конфликт, то данные на сервере могут остаться неизменными, но функция TableUpdate вернет True (.T.) поскольку данные в курсоре, связанном с объектом CursorAdapter обновлены.
В этой точке мы имеем конфликт обновления: запись на сервере, которую Пользователь1 пытается обновить изменена после того, как она загружена в курсор объекта CursorAdapter. Приведенный ниже пример программного кода использует проверяющую конфликт команду "CRLF+[EXECSCRIPT("IF _tally=0" + CHR(10) + "ERROR('Update conflict')" + CHR(10) + "ENDIF")]" в дополнение к команде обновления. В этом случае, функция TableUpdate() вернет False (.F.), что позволит вам обслужить конфликт. Сама команда проверки конфликта использована в методе, ассоциированном с событием BeforeUpdate объекта CursorAdapter |
Скопировать код тестового примера | |
---|---|
#DEFINE CRLF CHR(13)+CHR(10) Local loCursor,ovfp CLEAR ON ERROR Set Exclusive Off Close Databases All Set Multilocks On loCursor = Createobject('CA') * Загружаем курсор данными, определенными командой, хранящейся в SelectCmd * и отображаем сообщение об ошибке, если таковая имеет место быть. loCursor.CursorFill() GO top * Покажем значение поля companyname перед операцией обновления. ? "Before:",companyname ? ovfp=Createobject("visualfoxpro.application.8") ovfp.DoCmd("set exclusive off") ovfp.DoCmd("update (_samples+'\northwind\customers') set companyname='Alfreds Futterkisted' where customerid='ALFKI'") GO top * Обновим данные в курсоре. replace companyname WITH 'Alfreds Futterkiste' * Обновим данные на сервере. retval=TABLEUPDATE(0,.F.,locursor.alias) Messagebox("Tableupdate="+Transform(retval)) * Если имеет место конфликт, отобразим ошибку. if(retval=.F.) LOCAL ARRAY errors(1) AERROR(errors) * Выводим сообщение об ошибке. IF "Update conflict"$errors[2] MESSAGEBOX("Update Conflict-reverting changes") =TABLEREVERT(.T.,locursor.alias) ENDIF endif * Обновляем данные (refresh) в курсоре . loCursor.CursorRefresh() && Забираем данные назад чтобы убедиться в правильности GO top * Отображаем содержание поля companyname после обновление. ? ? "After:",companyname Define Class CA As CursorAdapter Alias = 'test1' DataSourceType = 'NATIVE' SelectCmd = 'select * from (_samples+"\northwind\customers")' Tables = 'Customers' KeyFieldList = "customerid" UpdatableFieldList = "companyname" UpdateNameList = "customerid customers.customerid,companyname customers.companyname" WhereType= 3 * Составляем команду проверки конфликта, чтобы обслужить конфликт. * Сама по себе она ничего не делает * Далее она просто добавляется к автоматически сгенерированной команде UpdateInsertCmd * для проверки - было ли что-либо действительно обновлено. ConflictCheckCmd =CRLF+[EXECSCRIPT("IF _tally=0" + CHR(10) + "ERROR('Update conflict')" + CHR(10) + "ENDIF")] Procedure AfterUpdate Lparameters cFldState, lForce, nUpdateType, UpdateInsertCmd, DeleteCmd, lResult * Взглянем на посланную команду UpdateInsertCmd ? "Update Command sent="+UpdateInsertCmd * Поменяем местами реальные значения в команде, чтобы видеть, что происходит. UpdateInsertCmd=Strtran(UpdateInsertCmd,[OLDVAL('customerid','test1')],Oldval('customerid','test1')) UpdateInsertCmd=Strtran(UpdateInsertCmd,[OLDVAL('companyname','test1')],Oldval('companyname','test1')) UpdateInsertCmd=Strtran(UpdateInsertCmd,[test1.companyname],test1.companyname) ? "With the OLDVAL() and test1.companyname evaluated the update statement is :"+UpdateInsertCmd * Проверим возврат. ? "Tally="+Transform(_Tally) Procedure BeforeUpdate Lparameters cFldState, lForce, nUpdateType, cUpdateInsertCmd, cDeleteCmd cUpdateInsertCmd=cUpdateInsertCmd+this.ConflictCheckCmd ENDDEFINE |
Примечания
Применяется к: классу CursorAdapter
Смотри также
Прочие ресурсы
СвойстваСвойство ConflictCheckType
Свойства, методы и события объекта CursorAdapter
Команда UPDATE - SQL
Команда DELETE - SQL